본문 바로가기

코딩테스트/백준

[백준/C++] 1032번. 명령 프롬프트

문제

 

1032번: 명령 프롬프트

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

www.acmicpc.net


1. 첫 번째 풀이(마지막 풀이)

사고 과정

- 문제와 예제를 전부 읽어보았는데, *를 사용하는 경우는 아예 제외된 듯하다. 검색 결과만 나와있고 전체 파일은 없으니.

- 핵심은 같은 글자는 그대로, 다른 글자는 ?로 처리하는 것.

- 첫 파일을 배열에 넣어두고, 다른 파일들을 for문으로 하나씩 비교하며 다른 경우에만 바꾸면 될 것 같다. 심지어 파일 제목 길이까지 모두 같다.

 

1. N을 입력받음

2. 첫 파일을 배열에 입력받음(답안이 될 예정)

3. 이후 글자들은 첫 파일 제목과 비교, 다른 경우 첫 배열의 원소를 ?로 대체

4. 출력

 

코드

#include <iostream>
#include <vector>

int main() {
	int n;
	std::string answer, temp;

	std::cin >> n;
	std::cin >> answer;

	for (int i = 0; i < n - 1; i++) {
		std::cin >> temp;
		for (int j = 0; j < answer.length(); j++) {
			if (answer[j] != temp[j]) {
				answer[j] = '?';
			}
		}
	}

	std::cout << answer;

	return 0;
}

 

결과

간단하게 성공했다.

vector 대신 string을 사용해봤는데, 위처럼 한 글자만 바꾸는 경우엔 메모리 누수가 생기지 않는다고 한다.


개선

사고 과정

- 다른 방법이 있을까? 하고 생각해봤는데, 그닥 떠오르는 게 없었다.

- 두 문자열을 한 번에 겹쳐서 틀린 부분을 찾아내면 어떨까? 싶었지만, 반복문보다 나은 방법은 찾지 못 했다.


가장 효율적인 코드

https://www.acmicpc.net/source/2820806

vmfosxir님의 코드. 944KB 메모리를 사용했다.

내 코드와 비교

1. 완전한 C언어로 작성되었다.

2. scanf와 puts를 사용하셨다.

3. 제한 사항에 맞춰 크기가 50인 배열을 생성하셨다.

4. 첫 반복문을 while로, ++i로 사용하셨다.


강평

쉬운 문제였고, 다른 코드들에서도 더 효율적인 방법은 찾지 못했다. 다만 C++보단 C가 더 메모리를 아낄 수 있고, 더 빠르다는 건 슬슬 알 것 같다.

'코딩테스트 > 백준' 카테고리의 다른 글

[백준/C++] 1049번. 기타줄  (0) 2023.08.19
[백준/C++] 1012번. 유기농 배추  (0) 2023.08.19
[백준/C++] 1065번. 한수  (0) 2023.08.18
[백준/C++] 1002번. 터렛  (0) 2023.08.14
[백준/C++] 1026번. 보물  (0) 2023.08.14