
난이도: ★★☆☆☆ • solved on: 2025-07-02


자료구조
char[] : 입력 단어를 한 글자씩 분리해 저장 (불변성이 특징, immutable)알고리즘/기법
- 문제 분해
- 각 단어를 문자 단위로 한 글자씩 순회한다.
- 이전 문자와 같으면 연속 등장으로 간주하고 넘어간다.
- 이전 문자와 다르고, 이미
tmpWordList에 등장 기록이 있으면 그룹 단어가 아니므로 개수에서 제외한다.- 검사 통과 시
tmpWordList에 현재 문자를 추가하고 다음 글자 검사로 넘어간다.- 핵심 로직 흐름
for each word: tmpWordList = "" // 그룹 단어 판별을 위한 기록 문자열 resultWordList += word[0] // 첫 글자 기록 for j from 1 to word.length-1: if word[j] == word[j-1]: continue // 연속 등장인 경우 무시 else if tmpWordList.contains(word[j]): resultCount-- // 이미 등장했던 문자(비연속) → 제외 break else: tmpWordList += word[j] // 새로운 문자 기록- 예외 처리
- 단어 길이가 1인 경우: 무조건 그룹 단어로 판단
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int textCount = sc.nextInt();
int resultWord = textCount;
for (int i = 0; i < textCount; i++) {
char[] word = sc.next().toCharArray();
String tmpWordList = "";
for (int j = 0; j < word.length; j++) {
if (j == 0) {
tmpWordList += word[j];
} else {
if (word[j] == word[j - 1]) {
continue;
} else {
if (tmpWordList.contains(word[j] + "")) {
resultWord--;
break;
} else {
tmpWordList += word[j];
}
}
}
}
}
System.out.println(resultWord);
}
}
- 문자 등장 기록
String tmpWordList대신boolean[] seen = new boolean[26]사용- 알파벳 26글자만 체크하므로 공간도 O(1)
- 이전 문자 추적
char prev = word[0]로 직전 문자를 저장- 새 문자
c가prev와 다를 때만
seen[c - 'a']검사- 이미 true → 그룹 단어 아님
- 아니면 true로 표시하고
prev = c갱신- I/O 최적화
Scanner대신BufferedReader+StringTokenizer사용- 출력은
StringBuilder에 모아 한 번에 출력
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int count = n;
while (n-- > 0) {
String s = br.readLine();
boolean[] seen = new boolean[26];
char prev = s.charAt(0);
seen[prev - 'a'] = true;
for (int i = 1; i < s.length(); i++) {
char c = s.charAt(i);
if (c == prev) continue; // 연속 등장 무시
if (seen[c - 'a']) { // 비연속 중복 체크
count--;
break;
}
seen[c - 'a'] = true; // 새 문자 기록
prev = c;
}
}
sb.append(count);
System.out.print(sb);
}
}
방법 1 :
- 시간 복잡도 : O(N × L²)
- 공간 복잡도 : O(1) (입력 처리용 버퍼 제외)
방법 2 :
- 시간 복잡도 : O(N × L)
- 공간 복잡도 : O(1) (입력 처리용 버퍼 제외)
tmpWordList.contains를 쓸 때 문자열 연결(+=)로만 관리하다 보니, 문자가 중복되었는지 확인 후 처리 흐름을 바로 끊는 부분을 놓쳐 여러 번 테스트를 반복했다.contains 검사 시 O(1)에 해결할 수 있어 시간 복잡도를 O(N×L)으로 줄일 수 있다.Scanner보다 BufferedReader + StringBuilder 조합이 입출력 속도가 더 빠르다.boolean[]이 HashSet보다 더 가볍고 빠르다.비슷한 유형: 아직 없음
확장 문제: