BOJ 1032

2020-09-12

위 문제는 백준 사이트의 알고리즘 1032 문제에 관한 설명입니다.

문자열 처리 연습용 문제입니다.


명령 프롬프트

시작 -> 실행 -> cmd를 쳐보자.

검정 화면이 눈에 보인다.

여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다.

이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.

dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다.

“dir 패턴”과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다.

예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고,

확장자가 exe인 것이 모두 나온다.

이때 두 번째 문자는 아무거나 나와도 된다.

예를 들어, acb.exe, aab.exe, apb.exe가 나온다.

이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다.

패턴에는 알파벳과 “.” 그리고 “?”만 넣을 수 있다.

가능하면 ?을 적게 써야 한다.

그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.

입력

첫째 줄에 파일 이름의 개수 N이 주어진다.

둘째 줄부터 N개의 줄에는 파일 이름이 주어진다.

N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다.

파일이름은 알파벳과 “.” 그리고 “?”로만 이루어져 있다.

출력

첫째 줄에 패턴을 출력하면 된다.

소스코드


package day0912;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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());
		String answer = "";
		String[] array = new String[N];
		for (int i = 0; i < N; i++) {
			array[i] = br.readLine();
		}
		for (int i = 0; i < array[0].length(); i++) {
			boolean flag = true;
			for (int j = 1; j < N; j++) {
				if (array[0].charAt(i) != array[j].charAt(i)) {
					flag = false;
					break;
				}
			}
			if (flag) {
				answer += array[0].charAt(i);
			} else {
				answer += "?";
			}
		}
		System.out.println(answer);
	}
}


해당 문제는 문자열 처리를 하는 문제였습니다.

순차적으로 코드를 따라가 봅시다.

N은 문자열의 갯수가 몇개인지를 확인합니다.

이것의 갯수만큼 String[] 배열을 만들어서 문자열들을 넣어줍니다.

분기문을 살펴봅시다.

해당 문제에선 모든 문자열의 길이가 같기 때문에

array[0]의 길이만큼 반복문을 사용한다 해도 충분히 사용이 가능했습니다.

flagtrue로 초기화 시켜두고,

안에 또 분기문을 통과하고 나왔을때 다르다면 flagfalse가 된다라고 사용합니다.

flag 다음의 분기문을 봅시다.

0번째의 문자열 i번째 글자와 1번부터 시작하는 j번째 문자열의 i번째 글자가 다르다면

flagfalse가 되고, 무사히 통과한다면 다 같다는 뜻이기 때문에 true가 그대로 지나갑니다.

flagtrue라면 문자열의 i번째 글자를, 아니라면 ?answer에 그대로 넣어줍니다.

이후 answer를 출력하면 정답이 됩니다.

명령 프롬프트