이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 "." 그리고 "?"만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.
입력
첫째 줄에 파일 이름의 개수 N이 주어진다.
둘째 줄부터 N개의 줄에는 파일 이름이 주어진다.
N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다.
파일이름은 알파벳 소문자와 '.' 로만 이루어져 있다.
사용한 것
1. BufferedReader과 BufferedWriter
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
이걸 쓴 이유는 입력이랑 출력을 Scanner나 system.out.println 이런 것들보다 빠르게 할 수 있어서.
주의할 점은 BufferedWriter를 썼으면 write, flush하고 BufferedReader와 BufferedWriter를 close해줘야 한다는 것.
왜냐면 내부적으로 버퍼를 사용하기 때문에 flush로 강제로 출력하고 남은데이터를 close로 정리한다.
2. StringBuilder
String은 불변이라서 변경이 안된다.
그래서 변경이 필요한 문제였기 때문에 사용.
풀이
- StringBuffer를 만들어서 입력을 받는다.
- 첫번째는 문자열 개수
- 2번째 부터는 하나씩 넣는다.
- 비교대상의 문자열은 입력받은 첫번째 문자열로 했다.
- 모든 파일이름들의 같은 자리수를 비교해서 하나라도 다른 값이 있으면 그값은 ?로 바꾼다.
- 전부 다 같으면 그건 그 단어로 바꾼다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int dirIndex = Integer.parseInt(br.readLine());
String [] dirList = new String[dirIndex];
StringBuilder dirString = new StringBuilder();
for(int i = 0; i < dirIndex; i++) {
dirList[i] = br.readLine();
}
dirString.append(dirList[0]);
//한글자씩 비교해서 다른 글자가 있으면 ?로 바꾼다.
for (int i = 0; i < dirList[0].length(); i++) {
for (int j = 1; j < dirIndex; j++) {
if (dirString.charAt(i) != dirList[j].charAt(i)) {
dirString.replace(i,i+1, "?");
}
}
}
bw.write(dirString.toString());
bw.flush();
br.close();
bw.close();
}
}
'자바 코딩테스트' 카테고리의 다른 글
리트코드 70. Climbing Stairs (0) | 2025.04.07 |
---|---|
리트코드 225 큐를 사용해서 스택 구현하기 (0) | 2025.04.04 |
232. 스택을 사용하여 Queue 구현 (0) | 2025.04.03 |
31458 초콜릿 중독 주의 (0) | 2025.04.02 |
10820 문자열 분석 (0) | 2025.04.01 |