본문 바로가기
PS/BOJ

백준 3022 자바 - PRASE (BOJ 3022 JAVA)

by Nahwasa 2022. 3. 14.

문제 : boj3022

 

  반복 로직만 잘 세우면 간단하게 풀 수 있다. 주의할 부분은 'If at any point a child takes a piece of food, and that child had already taken more food than the other children all together (not including the new piece of food),'에서 not including the new piece of food 부분이다. 즉, 현재 아이가 누군지는 알아야하지만 현재 집은것에 대해서는 카운티앟지 않은채로 수만 확인해야 한다.

 

  따라서 현재까지 나온 아이의 총 수를 cnt, 현재 아이가 나왔던 횟수를 cc[아이이름] 이라고 해보자. 그럼 만약 현재 아이의 이름이 A라고 할 때, 'cnt-cc[A] < cnt[A]' 라면 엄마가 주의를 줘야하는 경우가 된다. 예제 입력 1을 약간 변형한 다음 예시를 확인해보자.

5
mirko
stanko
stanko
stanko
stanko

 

위의 예시일 경우 아래와 같이 진행해볼 수 있다. 좌측에서 우측으로 진행한다고 보면 된다. (입력 -> 엄마가 주의줘야함? -> 확인 후 변경). 그럼 이 경우 2번 주의를 줘야함을 알 수 있다.

 

이 과정을 코드로 구현하면 된다. 문자열에 대해 위와 같이 배열로 표현하려면 HashMap을 사용하면 된다.

 

 

 

코드 : github

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

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int cnt = 0;
        HashMap<String, Integer> hm = new HashMap<>();

        int ans = 0;
        while (n-->0) {
            String cur = br.readLine();
            if (cnt-hm.getOrDefault(cur, 0) < hm.getOrDefault(cur, 0)) {
                ans++;
            }
            cnt++;
            hm.put(cur, hm.getOrDefault(cur, 0)+1);
        }
        System.out.println(ans);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글