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
를 통해 넘어가게하였다.
줄줄이 쓰니까 가독성이 떨어지는데 순서대로 표현하면
true
인 경우 이미 값이 들어왔던 것이므로 그룹단어 조건에 맞지 않아 false
를 반환true
로 설정하여 단어가 읽힌 것을 체크와 같은 로직으로 진행 후 끝까지 false
로 반환되지않으면 입력받은 문자열은 그룹단어이므로 count를 1증가 시킨다.