[TIL] 백준 1316 그룹 단어 체커

·2023년 3월 25일
0

알고리즘

목록 보기
11/11
post-thumbnail

문제

해결 방법

수도코드

  1. 단어의 개수 n을 입력 받은 후, n만큼의 반복문을 돌려 문자열을 체크해 그룹 단어를 찾는다.
  2. 문자열을 입력받고 그룹 단어임을 확인할 solution() 메서드를 생성한다.
  3. solution() 메서드는 알파벳의 개수만큼의 boolean 배열을 선언해 문자열을 순회하면서 만난 문자 방문 여부를 체크한다.

💡boolean 배열의 길이는 26이고 인덱스는 0부터 시작한다.
알파벳 소문자의 아스키코드는 97부터 시작하므로, 해당 알파벳의 중복 체크를 위해 문자에 97을 빼야 boolean 배열의 인덱스 값을 얻을 수 있다.
ex. a = 97, boolean 배열의 인덱스는 0

  1. 첫 번째 인덱스는 0이므로 tmp이라는 변수에 0을 담는다.
    6-1. tmp과 현재 문자(int num = str.charAt(i))가 같다면, 다음 순회를 반복한다.
    6-2. tmp과 현재 문자(int num = str.charAt(i))가 같지 않다면, 중복 검사를 진행한다.

  2. boolean 배열에 num-97 인덱스의 값을 확인한다.
    7-1. 값이 true라면, 이미 이 전에 문자를 사용했다는 의미이므로 false를 return한다.
    7-2. 값이 false라면, 중복된 문자가 없다는 의미이므로 해당 인덱스의 값을 true로 변경하고 순회를 통해 중복 검사를 하기 위해 tmpnum값으로 변경한다.

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {

        int n = Integer.parseInt(br.readLine());
        int count = 0;
        for(int i = 0; i<n; i++) {
            if(solution() == true) {
                count++;
            }
        }
        System.out.println(count);

    }
    public static boolean solution() throws IOException {
        // string 값을 입력 받는다.
        String str = br.readLine();
        // boolean[]에 흔적을 남긴다.
        boolean[] check = new boolean[26];
        int tmp = 0;

        // str.length()만큼 반복문
        for(int i = 0; i < str.length(); i++) {
            // 아스키코드
            // 다음 글자가 tmp와 같다면, 중복 검사하지 않고
            // 다음 글자가 tmp와 같지 않다면, 중복 검사를 한다.
            int num = str.charAt(i);
            if(tmp != num) {
                // check[num] = false -> 그룹단어 ok
                if(!check[num-97]) {
                    // check[num] => true로 바꾸고, tmp => num바꿈
                    check[num-97] = true;
                    tmp = num;
                } else {
                    // 중복 검사 check[num] = true면? -> 그룹단어 아님
                    return false;
                }
            }
        }
        // 중복검사가 끝까지 정상적으로 이루어진 경우 그룹단어이다.
        return true;
    }
}
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글