문제
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 |