반응형
문제의 조건에 부합하는 그룹 단어의 갯수를 출력해주는 프로그램을 작성해보자.
그룹단어의 조건에 포함되지 않는 것은 어떤 알파벳이 연속적으로 나오지 않는 경우이다.
ex) aaaabbbbccccdddda => a,b,c,d 모두 연속적으로 나오나 a가 맨 뒤에 다시 나오므로 그룹단어가 아님.
이제 우리는 이 단어가 그룹 단어인지 아닌지 판별하기 위해 각 알파벳을 저장해 둘 배열을 만든 후, 각 알파벳의 등장 여부를 판별하는 플래그를 세워 판단하면 되겠다.
이를 위해 배열을 먼저 만든다.
boolean[] flag = new boolean[26];
String word = sc.next();
flag[word.charAt(0) - 97] = true;
flag 라는 배열을 사용하기 위해 입력받은 문자를 한개씩 잘라 아스키코드로 활용한다. (아스키코드 a = 97)
첫번째 문자는 당연히 아직 나온적이 없으므로 이에 해당하는 문자는 true로 둔다.
for (int j = 1; j < word.length(); j++) {
if (word.charAt(j) != word.charAt(j - 1)) {
if (flag[word.charAt(j) - 97] == false) {
flag[word.charAt(j) - 97] = true;
} else {
count++;
break;
}
}
}
- 이제 두번째 문자부터 바로 앞 단어와 비교하고(연속적인 문자 확인)
- 연속적이지 않다면 해당 문자에 해당하는 flag 배열 값이 false 인지 확인한다.
- 1번 2번 조건을 모두 만족한다면 해당 배열 값을 true로 전환
- 1번 조건에 만족하나 2번 조건을 만족하지 않는다면
(해당 문자가 직전 문자와 다르고, 배열 값이 true. => 이미 등장한 적이 있는 문자이다)
- count 값을 증가시켜준 후(이후 전체 단어 수에서 count값을 빼면 된다.)
- break문으로 반복문을 빠져나간다(ababab등과 같은 경우 중복 체크 방지) - 1번 2번 조건에 모두 부합하지 않는다면 그대로 통과.
위와 같은 절차로 해당 단어가 그룹 단어인지 확인하면 된다.
전체 코드를 보면 다음과 같다.
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
for (int i = 0; i < n; i++) {
boolean[] flag = new boolean[26];
String word = sc.next();
flag[word.charAt(0) - 97] = true;
for (int j = 1; j < word.length(); j++) {
if (word.charAt(j) != word.charAt(j - 1)) {
if (flag[word.charAt(j) - 97] == false) {
flag[word.charAt(j) - 97] = true;
} else {
count++;
break;
}
}
}
}
System.out.println(n - count);
}
}
반응형
'Java > 백준알고리즘' 카테고리의 다른 글
[Java] 백준알고리즘 #10798 세로읽기 (0) | 2023.10.04 |
---|---|
[Java] 백준알고리즘 #2566 최댓값 (0) | 2023.10.04 |
[Java] 백준알고리즘 #25206 너의 평점은 (1) | 2023.10.03 |
[Java] 백준알고리즘 #11718 그대로 출력하기 (0) | 2023.10.03 |
[Java] 백준알고리즘 #5622 다이얼 (2) | 2023.10.03 |