본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 1032번: 명령 프롬프트 -C++

728x90

[백준알고리즘] 1032번: 명령 프롬프트 -C++

1032번: 명령 프롬프트 (acmicpc.net)

 

1032번: 명령 프롬프트

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은

www.acmicpc.net

문자열 정규 표현식과 관련된 문제다.

 

실제로 문제에서 주어진 것처럼 '?'는 정규식에서 '임의의 한 글자'를 의미한다.

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

 


 

입력이 들어오는 여러 문자열을 받은 뒤, 첫 문장을 기준으로 비교를 했다.

 

각 위치마다 모든 문자열에 같은 문자(\(character\))가 들어간다면 해당 문자를 추가해주었고, 그렇지 않다면 '?'를 추가해주었다.

 

쉬운 문제였기 때문에 설명할 것이 딱히 없는 것 같다..

 

맨 아래 코드 중 일부다. 이 코드는 각 위치마다 비교하다가 다른 문자가 삽입된 것을 확인해 \(answer\)라는 문자열에 '?'가 추가되었다면, answer.size() == i + 1이 되는 것을 이용했다. size는 1부터 시작하기 때문에 0부터 시작하는 인덱스와는 1 차이가 나기 때문이다. 따라서, answer.size() == i인 경우는 \(answer\)라는 문자열에 '?' 문자가 추가되지 않은 것이기 때문에 모두 같은 문자를 같은 위치에서 갖고 있는 것이고, 그렇기 때문에 해당 문자를 추가해야 하는 것이다.

if (i == answer.size())
	answer += character;

 

아래는 전체 C++ 코드다.

#include <iostream>
#include <vector>
#include <string>

void solve(void);

int main(void)
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	solve();
}

void solve(void)
{
	int n;
	std::cin >> n;

	std::vector<std::string> dictionary(n);
	for (int i = 0; i < n; i++)
		std::cin >> dictionary[i];

	int len = dictionary[0].size();
	std::string answer = "";
	for (int i = 0; i < len; i++)
	{
		const char character = dictionary[0][i];

		for (auto d : dictionary)
			if (character != d[i])
			{
				answer += '?';
				break;
			}

		if (i == answer.size())
			answer += character;
	}

	std::cout << answer;
}

 

 

728x90