[백준] 1316 그룹 단어 체커 - Java

Yunki Kim·2022년 12월 12일
0

백준

목록 보기
55/104
post-thumbnail

문제


링크


코드

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

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 (groupWordCheck()) count++;
        }
        System.out.println(count);
        br.close();
    }

    public static boolean groupWordCheck() throws IOException {
        boolean[] alphabets = new boolean[26];
        String input = br.readLine();
        int word, prevWord = 0;

        for (int i = 0; i < input.length(); i++) {
            word = input.charAt(i);
            if (word == prevWord) continue;
            if (alphabets[word - 'a']) return false;

            alphabets[word - 'a'] = true;
            prevWord = word;
        }
        return true;
    }
}

리뷰

로직이 생각보다 길어지고 배열도 초기화해주고해야되서 별도의 메서드로 빼는 것이 수월할듯해서 분리해서 문제를 풀어보았다.

그리고 일전에 토이프로젝트에서 코드리뷰 당시에 조건문이 많을 경우 가독성을 위해 Early return을 하는 것이 좋다고 해주셔서 왠지 이 코드에 적용시키면 훨씬 깔끔해질듯하여 적용해보았다.

문제는 그룹단어 체크를 하는것이 목적인데 그룹단어란 문자가 연속해서 나타나는 경우에만 그룹단어라는데
예를들어 caabbz 하면 c, a, b, z 순으로 다시 등장하는 알파벳이 없다.
abcabc의 경우 a, b, c가 등장하지만 연속해서 나오지않고 떨어져있다.
(백준 문제를 풀다보면 텍스트만 읽어서는 무슨 느낌인지 모르는 경우가 많아서 입력 예제를 보는것이 이해가 빠르다 😂)

그래서 그룹단어인지 체크하는 메서드에서는 알파벳에 대응하는 배열을 만들고
각 단어를 쪼개서 단어에 해당 하는 위치에 boolean값으로 체크를 하게하였고 연속으로 단어가 나오는 것은 허용되기 때문에 이전 단어와 현재 단어가 같은 경우 continue를 통해 넘어가게하였다.
줄줄이 쓰니까 가독성이 떨어지는데 순서대로 표현하면

  1. 입력된 단어의 길이만큼 반복문 실행
  2. 단어 한 글자를 word에 저장
  3. word와 이전 단어인 prevWord가 같은지 확인 (연속된 단어인지 체크)
    -> 같다면 다음단어로 진행
  4. 배열에서 현재 word의 위치의 값이 true인 경우 이미 값이 들어왔던 것이므로 그룹단어 조건에 맞지 않아 false를 반환
  5. 배열에서 현재 word의 위치의 값을 true로 설정하여 단어가 읽힌 것을 체크
  6. 이전 단어에 현재 단어를 저장
  7. 반복~

와 같은 로직으로 진행 후 끝까지 false로 반환되지않으면 입력받은 문자열은 그룹단어이므로 count를 1증가 시킨다.

0개의 댓글