본문 바로가기
PS/BOJ

[자바] 백준 9324 - 진짜 메시지 (java)

by Nahwasa 2022. 9. 29.

 문제 : boj9324


 

필요 알고리즘 개념

  • 문자열, 파싱, 구현
    • 입력으로 주어진 문자열을 파싱하면서 문제에서 제시된대로 구현해주면 된다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 


 

풀이

  문제에서 제시된걸 구현하기 위해 필요한 항목은 다음과 같다.

 

1. 현재 문자열의 i번째 문자를 보고있을 때, 현재까지 i번째 문자와 동일한 문자가 이전에 몇 번 나왔는지 알 수 있어야 한다.

-> 대문자만 입력으로 들어오므로, A부터 Z까지 26개짜리 배열을 만들어 카운팅 해주면 된다.

 

2. 해당 문자가 3번 나왔다면 반드시 그 다음 문자도 동일한 문자여야 한다. 즉, "AAA"는 FAKE이다. "AAABA"도 FAKE이다. "AAAA"는 OK이다.

-> 해당 문자가 3번 나온 경우, 그 다음 문자가 동일한 문자인지 확인해주자. 또한 3번 나왔는데 이미 문자열의 끝이라면 마찬가지로 FAKE이다. 그리고 로직이 일관성있게 진행되도록, 3번 나온 경우 다음 문자를 확인해주고 '1'에서 카운팅하던걸 해당 문자에 대해서만 0으로 초기화시켜주자(그 이전까지 정상적으로 입력이 들어온 부분은 이후의 결과에 영향을 끼치지 않으므로)

 


 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    private static final int A_TO_Z = 'z'-'a'+1;
    private boolean isFake(String msg) {
        int[] cnt = new int[A_TO_Z];
        for (int i = 0; i < msg.length(); i++) {
            int idx = msg.charAt(i)-'A';
            cnt[idx]++;
            if (cnt[idx] == 3) {
                if (i == msg.length()-1 || msg.charAt(i+1) != msg.charAt(i))
                    return true;
                cnt[idx] = 0;
                i++;
            }
        }
        return false;
    }
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        while (n-->0) {
            sb.append(isFake(br.readLine()) ? "FAKE\n" : "OK\n");
        }
        System.out.print(sb);
    }

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

댓글