문제
https://www.acmicpc.net/problem/1283
풀이(18분)
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));
int n = Integer.parseInt(br.readLine());
boolean[] alphabet = new boolean[26]; // 소문자 단어를 추적할 그룹
for(int i = 0; i < n; i++){ // n개의 테스트 케이스
String option = br.readLine(); // 옵션 읽어오기
String[] separation = option.split(" "); // 띄어쓰기를 통한 단어 구분
int separationIdx = 5; // 몇번째 단어에서 나왔는가
int wordIdx = 10; // 그 단어에서 몇번째 알파벳인가
for(int j = 0; j < separation.length; j++){ // 모든 단어에 대한 첫 번째 알파벳 검사
String temp = separation[j];
temp = temp.toLowerCase();
if(!alphabet[temp.charAt(0) - 'a']){ // 만약 아직 체크되지 않았다면
alphabet[temp.charAt(0) - 'a'] = true;
separationIdx = j;
wordIdx = 0;
break; // 저장 후 반복문 탈출
}
}
if(separationIdx == 5) { // 아직 체크된게 없다면
loop1:
for (int j = 0; j < separation.length; j++) { // 각 단어마다
for (int k = 1; k < separation[j].length(); k++) { // 모든 알파벳 순회
String temp = separation[j];
temp = temp.toLowerCase();
if (!alphabet[temp.charAt(k) - 'a']) { // 만약 아직 체크되지 않았다면
alphabet[temp.charAt(k) - 'a'] = true;
separationIdx = j;
wordIdx = k;
break loop1; // 저장 후 반복문 탈출
}
}
}
}
if(separationIdx == 5){ // 체크된 적이 없다면
System.out.println(option); // 원본 단어 출력
continue;
}
StringBuilder sb = new StringBuilder();
for(int j = 0; j < separation.length; j++){
if(separationIdx == j){
for(int k = 0; k < separation[j].length(); k++){
if(k != wordIdx){
sb.append(separation[j].charAt(k));
continue;
}
sb.append("["); // 체크된 부분에 대해서만 괄호를 통해 감싸줌
sb.append(separation[j].charAt(k));
sb.append("]");
}
sb.append(" ");
continue;
}
sb.append(separation[j] + " ");
}
System.out.println(sb);
}
}
}
문제 풀이 전략
작은 범위를 보고 단순한 브루트포스와 구현 문제라고 생각했다.
풀이 방법은 다음과 같다.
1. 일단 모든 알파벳(소문자)에 대해 체크 배열을 선언한다.
2. 각 옵션이 들어오면 순서대로 분리하여 첫 번째 알파벳을 먼저 검사한다.
3. 검사에 통과한다면 인덱스를 두개 저장한다.(몇 번째 단어인지, 몇 번째 알파벳인지)
3-1. 해당 알파벳에 대해 저장한다.
4. 검사에 통과하지 못한다면 하나의 단어에 대해 순차적으로 모든 알파벳을 검사한다.
4-1. 검사에 통과한다면 3의 과정과 동일한 작업을 한다.
5. 검사에 통과하지 못한다면 원본 단어를 출력한다.
5-1. 검사에 통과했다면 저장된 인덱스를 통해 []로 감싸준 뒤 출력한다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 3896번. 소수 사이 수열(JAVA) (0) | 2025.03.04 |
---|---|
[백준] 2885번. 초콜릿 식사(JAVA) (0) | 2025.03.04 |
[백준] 5636번. 소수 부분 문자열(JAVA) (1) | 2025.03.01 |
[백준] 14627번. 파닭파닭(JAVA) (0) | 2025.02.26 |
[백준] 10164번. 격자 상의 경로(JAVA) (0) | 2025.02.24 |