티스토리 뷰

서론
이 문제 역시, 혼자 시도하다가 다른 블로그를 참조했다.
속도 상하지만, 최대한 내가 설명할 수 있을 정도로 정리를 해야겠다.
문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
풀이(Solution)
1. BufferedReader로 입력값을 받았다.
2. 첫째 줄에 단어의 개수 N이 들어온다.
입력받은 N에 대해 int형이기 때문에 Integer.parseInt(br.readLine());을 앞서 선언한 변수 str에 저장한다.
3. for문을 작성하고 첫째줄에 br.readLine()을 호출해서 입력 받은 문자열을 미리 선언한 str에 저장한다.
4. 길이가 26인 boolean형 배열을 선언하여 boolean[] 타입 참조변수 check에 저장한다. boolean[] check = new boolean[26];
알파벳 'a' ~ 'z' 문자 사용 여부를 false로 초기화한다. 나중에 for문 안에서 해당 인덱스의 문자가 사용되면 true로 바꿔준다.
5. 이번 회차의 문자열의 '그룹 단어 여부'를 판별하기 위한 변수 boolean tmp 선언 후 true로 초기화한다. boolean tmp = true;
6. 문자열안의 문자를 다루기 위한 중첩 for문을 작성한다.
7. i번째 문자열의 j번째 문자에 대해 '문자 사용 여부' 표시하기 위해서, j번째 문자가 check배열의 몇 번째 인덱스인지 작성한다.
예를 들어, 문자가 'h'인 경우, 'h' - 'a'가 check배열의 몇 번째 인덱스인지를 나타낸다. int idx = str.charAt(j) - 'a';
비슷한 접근법을 다룬 문제를 보고 복습해보자.
8. check배열의 idx번째 요소가 true일 때, 즉 문자가 사용됐고
i번째 문자열의 j번째 문자와 i번째 문자열의 (j - 1) 번째 문자가 일치하지 않는다면,
그룹 단어가 아니다게 되므로, tmp에 false를 저장한다.
그리고 break문을 선언하여, 중첩 반복문을 벗어난다.
문자가 사용되지 않았다면, 이번에 문자가 사용됐으므로 check[idx]에 true를 저장한다.
9. 중첩 for문 안의 모든 문장이 실행된 후에 tmp가 true라면 cnt++연산을 하여 그룹 단어의 개수를 센다.
시행착오(Trial&Error)

51801376, 51801433 - 런타임 에러(NullPointer)
코드
import java.io.*;
class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int cnt = 0;
String str = "";
for(int i = 0; i < n; i++) {
str = br.readLine();
boolean[] check = new boolean[26]; // 문자 사용 여부(a-z)
boolean tmp = true; // 그룹 단어 여부
for(int j = 0; j < str.length(); j++) {
int idx = str.charAt(j) - 'a';
if(check[idx]) {
if(str.charAt(j) != str.charAt(j - 1)) {
tmp = false; // 그룹 단어 여부 : false
break;
}
} else {
check[idx] = true; // 문자 사용 여부 : true
}
}
if(tmp)
cnt++;
}
br.close();
System.out.println(cnt);
} catch(IOException e) {}
}
}
참고
'알고리즘 > 문제풀이 - 백준' 카테고리의 다른 글
| [백준 25305번] 커트라인(JAVA) (0) | 2022.11.20 |
|---|---|
| [백준 2750번] 수 정렬하기(JAVA) (1) | 2022.11.18 |
| [백준 2941번] 크로아티아 알파벳(JAVA) (0) | 2022.11.16 |
| [백준 5622번] 다이얼(JAVA) (0) | 2022.11.15 |
| [백준 2908번] 상수(JAVA) (0) | 2022.11.14 |
