https://www.acmicpc.net/problem/1316

package baekjoon;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); //시행횟수
int cnt = 0; //그룹 단어 갯수
boolean check; //그룹 단어 여부를 확인할 boolean 변수
for (int i = 0; i < n; i++) {
check = true;
int[] alphabet = new int[26];
String str = br.readLine();
char temp = ' ';
for(int j = 0; j < str.length(); j++){
char ch = str.charAt(j);
if(alphabet[ch - 'a'] == 0 || ch == temp){ //처음 나온 글자 or 이전에 나온 글자
alphabet[ch - 'a']++; //나온 글자 구분을 위한 배열값 증가
temp = ch; //이전에 나온 글자를 기억할 임시 변수
} else if(alphabet[ch - 'a'] > 0){ //연속되지 않은 중복된 글자
check = false; //그룹 단어X
break; //해당 단어 탐색 종료
}
}
if(check){ //탐색한 단어가 그룹 단어일 경우
cnt++; //cnt 증가
}
}
System.out.println(cnt);
}
}
시행 횟수 받아주고, 받은 만큼 for문으로 반복문을 돌린다.
메인 로직은 알파뱃 갯수만큼 크기 26의 정수형 배열을 만들어준 뒤
입력받은 문자열의 첫글자부터 마지막 글자까지 순회하면서 해당하는 알파뱃 배열 값을 1씩 증가한다.
이때 이전에 입력받은 문자를 기억하고, 다음에 입력받는 문자들이 처음 입력받거나, 직전값과 동일하면 그대로 배열값 증가.
만약 이전과 동일하지 않은데 처음 입력받는 값이 아니라면 check 변수를 false로 변환 후 해당 단어 탐색 종료
단어 탐색이 끝난 시점에 check 변수가 참일 경우(그룹 단어일 경우) cnt 값 증가
시행 횟수 끝난 뒤 cnt 값 출력
이대로 코드 생각하고 작성했는데 답은 맞았다.
지피티한테 피드백 받은 코드는 아래와 같다.
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int cnt = 0;
for (int i = 0; i < n; i++) {
String s = br.readLine();
boolean[] seen = new boolean[26];
boolean ok = true;
char prev = 0;
for (int j = 0; j < s.length(); j++) {
char cur = s.charAt(j);
if (cur != prev) { // 문자가 바뀌는 순간
int idx = cur - 'a';
if (seen[idx]) { // 예전에 다른 구간에서 이미 나옴
ok = false;
break;
}
seen[idx] = true; // 처음 등장 처리
prev = cur;
}
}
if (ok) cnt++;
}
System.out.println(cnt);
}
}
해당 문제는 몇 번 나왔는지와 상관 없이 한 번이라도 나왔는지만 체크하기 때문에 boolean형으로 배열을 만들고,
문자가 바뀌게 되면 이전에 나온 문자인지 확인하는 조건문으로 처리했다.
내가 작성한건 조건문은 else if를 달아줄 필요 없이 else로도 가능함
또 간과한 점은 만약 문제에서 대문자가 있을경우를 생각을 못했다.
만약 대소문자를 구별한다고 하면, 배열 크기를 ASCII 코드 값 전체(128)로 늘리거나, 입력받은 문자가 'a' ~ 'z' 사이에 포함되면 그대로, 만약 아니라면 (ch - 'A' + 26) 이런 식으로 바꿔서 코드를 짜야 했고,
문제에서 대소문자 구별 안 한다고 명시했다면 입력받았을 때 toLowerCase() 사용해도 됐을 듯
'Java' 카테고리의 다른 글
| [백준] 코딩테스트 문제 2738: 행렬 덧셈 (0) | 2026.03.04 |
|---|---|
| [백준] 코딩테스트 문제 25206: 너의 평점은 (0) | 2026.03.03 |
| [백준] 코딩테스트 문제 1157: 단어 공부 (0) | 2026.02.25 |
| [백준] 코딩 테스트 문제 10988: 팰린드롬인지 확인하기 (0) | 2026.02.24 |
| [백준] 코딩테스트 문제 2444: 별 찍기 - 7 (0) | 2026.02.24 |