728x90

https://www.acmicpc.net/problem/16928

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

www.acmicpc.net

 

 

풀이)

진짜 겁나 틀린 문제...! 꼼꼼히 풀어야 한다는 교훈을 얻었다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_BJ_16928_뱀과사다리게임 {
    static int[] map = new int[101];
    static int[] snakeLadder = new int[101];
    static boolean[] visited = new boolean[101];

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            snakeLadder[a] = b;
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            snakeLadder[a] = b;
        }

        bfs();
        System.out.println(map[100]);
    }//main

    private static void bfs() {
       Queue<Integer> q = new ArrayDeque<>();
       //처음 시작은 무조건 1
       q.add(1);
       visited[1] = true;

       while(!q.isEmpty()){
           int cur = q.poll();
           //주사위: 한 번에 6칸 이동
           for(int i=1; i<=6; i++){
               int nx = cur+i;
               //다음 좌표가 100보다 작거나 같아야 하고, 방문하지 않았어야함
               if(nx <= 100 && !visited[nx]){
                   //다음 좌표가 사다리를 타고 이동할 수 있을 때 && 이동한 좌표가 방문한 적 없을 때
                   if(snakeLadder[nx] != 0 && !visited[snakeLadder[nx]]){
                       // 큐에 저장, 이동 거리 작성, 방문처리
                       q.offer(snakeLadder[nx]);
                       map[snakeLadder[nx]] = map[cur] + 1;
                       map[nx] = map[cur] + 1;
                       visited[nx] = true;
                       visited[snakeLadder[nx]] = true;
                   }
                   //다음 좌표가 사다리가 없을 때
                   else if(snakeLadder[nx] == 0){
                       //다음 좌표 큐에 저장, 이동 거리 작성, 방문처리
                       map[nx] = map[cur] + 1;
                       q.offer(nx);
                       visited[nx] = true;
                   }
               }
           }
       }//while
    }//bfs
}

주요 논리는 주석에 작성했다.

처음에는 좀 많이 헤맸는데, 그럴필요 없다는걸 다른 글을 보며 읽었다.

틀린 부분은 질문 게시판의 반례를 보면서 찾았음..ㅠ

담엔 더 꼼꼼히 보자 화이팅!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 9663 N-Queen(JAVA)  (0) 2023.01.24
백준 7662 이중 우선순위 큐(JAVA)  (1) 2023.01.23
백준 18870 좌표 압축(JAVA)  (0) 2023.01.22
백준 11723 집합(JAVA)  (0) 2023.01.22
백준 1764 듣보잡(JAVA)  (0) 2023.01.21
728x90

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

 

 

풀이)

사실 예시 입력과 출력을 보면서 이해했던 문제라,,, 문제를 확실히 이해하고 풀진 않았다.

좋은 글이 있으니 한 번쯤 읽어보길 추천한다!

https://st-lab.tistory.com/279

 

[백준] 18870번 : 좌표 압축 - JAVA [자바]

https://www.acmicpc.net/problem/18870 18870번: 좌표 압축 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다

st-lab.tistory.com

 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_BJ_18870_좌표압축 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[n];
        int[] sorted = new int[n];
        HashMap<Integer, Integer> map = new HashMap<>();

        for(int i=0; i<n; i++) {
            int num = Integer.parseInt(st.nextToken());
            arr[i] = num;
            sorted[i] = num;
        }
        Arrays.sort(sorted);
        int rank = 0;
        for(int i : sorted){
            if(!map.containsKey(i)){
                map.put(i, rank);
                rank++;
            }
        }

        for(int i : arr){
            sb.append(map.get(i)+" ");
        }
        System.out.println(sb);
    }//main
}

두 개의 배열을 생성하여 하나는 입력을 받고, 나머지 하나는 정렬을 해 준다.

그리고 map을 사용해서 원래 배열과 정렬된 배열의 랭킹을 맞춰준다.

코드를 보면 이해하기 쉬울듯!

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 7662 이중 우선순위 큐(JAVA)  (1) 2023.01.23
백준 16928 뱀과 사다리 게임(JAVA)  (1) 2023.01.23
백준 11723 집합(JAVA)  (0) 2023.01.22
백준 1764 듣보잡(JAVA)  (0) 2023.01.21
백준 11399 ATM(JAVA)  (0) 2023.01.20
728x90

https://www.acmicpc.net/problem/11723

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

 

풀이)

 

- 풀이1 -

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_BJ_11723_집합 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int m = Integer.parseInt(br.readLine());
        StringTokenizer st;
        HashMap<Integer, Integer> map = new HashMap<>();

        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine());
            String command = st.nextToken();
            if(command.equals("all")){
                for(int j=0; j<21; j++){
                    map.put(j, 1);
                }
            }else if(command.equals("empty")){
                map.clear();
            }else{
                int num = Integer.parseInt(st.nextToken());
                switch (command){
                    case "add":
                        if(!map.containsKey(num))
                            map.put(num, 1);
                        break;
                    case "remove":
                        map.remove(num);
                        break;
                    case "check":
                        if(map.containsKey(num))
                            sb.append("1\n");
                        else
                            sb.append("0\n");
                        break;
                    case "toggle":
                        if(map.containsKey(num))
                            map.remove(num);
                        else
                            map.put(num, 1);
                        break;
                }//switch
            }
        }//for
        System.out.println(sb);
    }//main
}

만약, StringBuilder를 사용하지 않고, System.out.println을 사용한다면 시간초과를 볼 것이다!!

하지만 문제 자체가 비트마스크이므로, 한 번 찾아보았다.

 

 

- 비트마스킹을 활용한 풀이 -

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_BJ_11723_집합2 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int m = Integer.parseInt(br.readLine());
        int bit = 0;
        StringTokenizer st;

        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine());
            String command = st.nextToken();
            int num;
            switch (command){
                case "add":
                    num = Integer.parseInt(st.nextToken());
                    //num-1 => 최대 20이기 때문에 0~19까지 자리수로 표현하기 때문.
                    bit |= (1 << (num-1));
                    break;
                case "remove":
                    num = Integer.parseInt(st.nextToken());
                    bit  &= ~(1 << (num-1));
                    break;
                case "check":
                    num = Integer.parseInt(st.nextToken());
                    sb.append((bit & (1<<(num-1))) != 0 ? "1\n" : "0\n");
                    break;
                case "toggle":
                    num = Integer.parseInt(st.nextToken());
                    bit ^= (1 << (num-1));
                    break;
                case "all":
                    // bit |= (~0);
                    //21을 shift한 후 1을 빼면 모두 1~20까지 shift한 효과가 있다
                    bit = (1 << 21) - 1;
                    break;
                case "empty":
                    bit &= 0;
                    break;
            }//switch
        }
        System.out.println(sb);
    }//main
}

<BitMasking 이론>

비트마스킹

정수를 이진수로 표현하기 위해 쓰는 기법

빠른 수행 시간, 간결한 코드, 더 적은 메모리 사용을 할 수 있다.

 

비트 연산자

  1. &
    • AND 연산
  2. |
    • OR 연산
  3. ^
    • XOR 연산
  4. ~
    • NOT 연산
  5. <<
    • 왼쪽 shift 연산
    • a << b : a를 b만큼 왼쪽으로 시프트
    • 1 << 2 == 100(2) => 4
  6. >>
    • 오른쪽 shift 연산
    • a >> b : a를 b만큼 오른쪽으로 시프트
    • 4 >> 2 == 1(2) => 1

 

비트마스킹을 이용하면 기깔나게 잘 풀리는 문제들이 몇몇 있었는데, 다시 기억해보는 계기가 되었다

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 16928 뱀과 사다리 게임(JAVA)  (1) 2023.01.23
백준 18870 좌표 압축(JAVA)  (0) 2023.01.22
백준 1764 듣보잡(JAVA)  (0) 2023.01.21
백준 11399 ATM(JAVA)  (0) 2023.01.20
백준 2630 색종이 만들기(JAVA)  (0) 2023.01.19
728x90

https://www.acmicpc.net/problem/1764

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net

 

 

풀이)

- 풀이1 -

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_BJ_1764_듣보잡 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        HashMap<String, Integer> people = new HashMap<>();

        for(int i=0; i<n; i++)
            people.put(br.readLine(), 1);

        for(int i=0; i<m; i++){
            String name = br.readLine();
            if(people.containsKey(name)){
                people.put(name, 2);
            }
            else{
                people.put(name, 1);
            }
        }

        ArrayList<String> arr = new ArrayList<>();
        for(String name : people.keySet()){
            if(people.get(name) == 2)
                arr.add(name);
        }
        Collections.sort(arr);
        System.out.println(arr.size());
        for(int i=0; i<arr.size(); i++){
            System.out.println(arr.get(i));
        }

    }//main
}

Hash를 이용해서 풀었는데, 해시의 getOrDefault가 기억이 안 나서 이렇게 풀었다..

기억이 안 나도 이렇게 풀 수 있다는 점!(쉬워서 그런감)

 

 

- 풀이2 -

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_BJ_1764_듣보잡2 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        HashMap<String, Integer> people = new HashMap<>();
        ArrayList<String> arr = new ArrayList<>();

        for (int i = 0; i < n; i++)
            people.put(br.readLine(), 1);

        for(int i=0; i<m; i++){
            String name = br.readLine();
            people.put(name, people.getOrDefault(name, 0) + 1);
            if(people.get(name) == 2)
                arr.add(name);
        }

        Collections.sort(arr);
        System.out.println(arr.size());
        for(String s : arr){
            System.out.println(s);
        }

    }//main
}

이게 getOrDefault를 사용한 것!! 확실히 코드가 좀 더 간결해진다.

getOrDefault는 key가 있다면 value를 반환, 없다면 default 값을 반환한다!

 

풀이 논리는...

1. 듣도 + 보도 못한 사람 => Hash 사용: value ==2

2. 이름 정렬 = Collections.sort();

3. 출력

 

자료구를 생각해 볼 수 있는 문제였다! 큰 차이는 아니지만 시간은 후자가 조금 더 걸렸다!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 18870 좌표 압축(JAVA)  (0) 2023.01.22
백준 11723 집합(JAVA)  (0) 2023.01.22
백준 11399 ATM(JAVA)  (0) 2023.01.20
백준 2630 색종이 만들기(JAVA)  (0) 2023.01.19
백준 11279 최대 힙(JAVA)  (0) 2023.01.18
728x90

https://www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_BJ_11399_ATM {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);
        int cnt = arr[0];
        int[] sum = new int[n];
        sum[0] = arr[0];
        for(int i=1; i<n; i++){
            sum[i] = sum[i-1]+arr[i];
            cnt+=sum[i];
        }
        System.out.println(cnt);
    }
}

대기하는 시간의 누적 합을 구해야하므로, 대기하는 시간이 적은 사람이 맨 앞에 서는게 가장 유리하다!

따라서 정렬을 이용해서 풀면 된다.

 

처음에는 동시에 와서 기다리는줄 알고,,, 생각을 좀 했으나,,

그런 문제는 아니었다는 점!!

greedy로 간단히 해결할 수 있었다~~

728x90

'코테 > 백준' 카테고리의 다른 글

백준 11723 집합(JAVA)  (0) 2023.01.22
백준 1764 듣보잡(JAVA)  (0) 2023.01.21
백준 2630 색종이 만들기(JAVA)  (0) 2023.01.19
백준 11279 최대 힙(JAVA)  (0) 2023.01.18
백준 1927 최소 힙(JAVA)  (1) 2023.01.17
728x90

https://www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BJ_2630_색종이만들기 {
    static int[][] paper;
    static int n, blue, white;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        paper = new int[n][n];

        StringTokenizer st;
        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<n; j++){
                paper[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        devide(0, 0, n);
        System.out.println(white);
        System.out.println(blue);
    }//main
    private static void devide(int x, int y, int size){
        int check = paper[x][y];
        boolean flag = true;
        for(int i=x; i<x+size; i++){
            if(!flag)
                break;
            for(int j=y; j<y+size; j++){
                if(check != paper[i][j]) {
                    flag = false;
                    break;
                }
            }
        }

        if(!flag){
            devide(x, y, size/2);
            devide(x, y+size/2, size/2);
            devide(x+size/2 , y, size/2);
            devide(x+size/2, y+size/2, size/2);
        }
        else{
            if(check == 1)
                blue++;
            else
                white++;
        }

    }//devide
}

솔직히 분할정복임을 알아도 많이 풀어본 적이 없어서 자신이 없었는데,

그래도 규칙성을 찾고 바로 풀 수 있었다!

 

devide 함수는 parameter로 시작하는 행의 좌표, 시작하는 열의 좌표를 받고, 분할하는 사이즈를 입력받는다.

이렇게 한다면 for문을 도는데 범위를 찾을 수 있다.

 

분할이 된다는 의미는 색종이의 색이 한 부분이라도 다르다는 의미이므로, 기준 색을 잡는다(check)

분할이 된다면 flag를 false로 하여 for문을 탈출할 수 있도록 한다!

 

또한 분할이 된다면 4부분으로 분할이 되므로 

devide(x, y, size/2);
devide(x, y+size/2, size/2);
devide(x+size/2 , y, size/2);
devide(x+size/2, y+size/2, size/2);

이렇게 범위를 나눠주면 된다.

그리고 재귀를 이용한다면 알아서 분할해줌!

 

또한, 우리는 파란색 종이와 하얀색 종이의 개수를 찾아야 하므로,

flag가 true 일 때(분할이 되지 않았을 때) check 변수를 확인해서 개수를 더해주면 끝!

 

비슷한 문제 다음에 연습해봐야징

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1764 듣보잡(JAVA)  (0) 2023.01.21
백준 11399 ATM(JAVA)  (0) 2023.01.20
백준 11279 최대 힙(JAVA)  (0) 2023.01.18
백준 1927 최소 힙(JAVA)  (1) 2023.01.17
백준 1620 나는야 포켓몬 마스터 이다솜(JAVA)  (1) 2023.01.17
728x90

https://www.acmicpc.net/problem/11279

 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;

public class Main_BJ_11279_최대힙 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

        for(int i=0; i<n; i++){
            int num = Integer.parseInt(br.readLine());
            if(num == 0){
                if(pq.isEmpty())
                    System.out.println(0);
                else
                    System.out.println(pq.poll());
            }
            else
                pq.offer(num);
        }
    }//main
}

최소 힙과 마찬가지로 priority queue를 사용하면 간단한 문제이다.

이때, priority queue는 기본적으로 오름차순이므로, 내림차순을 구현해야한다.

 

pq에는 단순히 Integer 타입만 들어가므로 Collections.reverseOrder()를 사용하여 간단히 가능하다.

만약, 다른 타입이 들어가고 다른 규칙을 사용하고 싶다면, Comparator를 사용하면 된다.

 

위의 내용을 포함한 간단히 참고하기 좋은 블로그 글도 공유한다.

https://ynzu-dev.tistory.com/entry/JAVA-Priority-Queue%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%EC%A1%B0%EA%B1%B4-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0

 

[JAVA] Priority Queue(우선순위 큐) 우선순위 조건 변경하기

Priority Queue FIFO(First In First Out)인 일반적인 Queue와 다르게 Priority Queue는 우선순위가 높은 데이터가 먼저 Out된다. 기본적으로 오름차순 정렬을 하게 되는데 정렬 기준을 바꾸고 싶다면 람다식을 이

ynzu-dev.tistory.com

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 11399 ATM(JAVA)  (0) 2023.01.20
백준 2630 색종이 만들기(JAVA)  (0) 2023.01.19
백준 1927 최소 힙(JAVA)  (1) 2023.01.17
백준 1620 나는야 포켓몬 마스터 이다솜(JAVA)  (1) 2023.01.17
백준 1931 회의실 배정(JAVA)  (0) 2023.01.16
728x90

https://www.acmicpc.net/problem/1927

 

1927번: 최소 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;

public class Main_BJ_1927_최소힙 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(int i=0; i<n; i++){
            int num = Integer.parseInt(br.readLine());
            if(num == 0){
                if(pq.isEmpty())
                    System.out.println(0);
                else
                    System.out.println(pq.poll());
            } else {
                pq.offer(num);
            }
        }//for
    }//main
}

자료구조를 공부할 때 힙이 우선순위 큐로 구현된다는 사실을 복습할 수 있는 문제.

priority queue 사용법 다시 익혀놓자!

728x90
728x90

https://www.acmicpc.net/problem/1620

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_BJ_1620_나는야포켓몬마스터이다솜 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        HashMap<String, Integer> nameHash = new HashMap<>();
        HashMap<Integer, String> indexHash = new HashMap<>();

        for(int i=1; i<=n; i++) {
            String name = br.readLine();
            nameHash.put(name, i);
            indexHash.put(i, name);
        }

        for(int i=0; i<m; i++){
            String check = br.readLine();
            //숫자이면
            if(Character.isDigit(check.charAt(0))){
                System.out.println(indexHash.get(Integer.parseInt(check)));
            }
            //문자열이면
            else{
                System.out.println(nameHash.get(check));
            }
        }


    }//main
}

일단 문제가 너무 웃겼다.ㅋㅋㅋㅋㅋㅋㅋ

그냥 윗 부분은 안 읽고 밑의 조건만 확인해도 충분이 이해가 가능한 문제!

빠르게 검색하기 위해 hash를 두 개 사용해서 만들었다.

또한, 문자열인지 숫자인지 확인하기 위해 Character.isDigit()을 활용했다!

 

이것만 안다면 간단한 문제~~

728x90

'코테 > 백준' 카테고리의 다른 글

백준 11279 최대 힙(JAVA)  (0) 2023.01.18
백준 1927 최소 힙(JAVA)  (1) 2023.01.17
백준 1931 회의실 배정(JAVA)  (0) 2023.01.16
백준 1003 피보나치 함수(JAVA)  (0) 2023.01.15
백준 11726 2xn 타일링(JAVA)  (0) 2023.01.14
728x90

https://www.acmicpc.net/problem/1931

 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main_BJ_1931_회의실배정 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[][] arr = new int[n][2];
        StringTokenizer st;
        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1] == o2[1])
                    return o1[0]-o2[0];
                else
                    return o1[1]-o2[1];
            }
        });

        int cnt = 0;
        int end = 0;

        for (int i = 0; i < n; i++) {
            if(arr[i][0] >= end){
                end = arr[i][1];
                cnt++;
            }
        }
        System.out.println(cnt);
    }//main
}

종료 시간을 기준으로 정렬을 했어야 했는데,,, 시작시간을 기준으로 삼아버려서 살짝 헤맸다.

2차원 배열일 때 정렬하는 방법 다시 기억하자!

 

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1927 최소 힙(JAVA)  (1) 2023.01.17
백준 1620 나는야 포켓몬 마스터 이다솜(JAVA)  (1) 2023.01.17
백준 1003 피보나치 함수(JAVA)  (0) 2023.01.15
백준 11726 2xn 타일링(JAVA)  (0) 2023.01.14
백준 1107 리모컨(JAVA)  (1) 2023.01.14

+ Recent posts