문제
미아는 과일을 좋아하는 소녀이다. 그녀의 비밀 노트에는 과일에 대해 그녀가 수집한 정보들이 가득하다.
평소와 다를 바 없이 과일들을 잔뜩 관찰하고 기쁜 마음으로 하교하던 어느 날, 친구가 뒤에서 덮치는 바람에 실수로 비밀 노트를 물에 빠뜨리고 말았다.
다행히 노트는 건질 수 있었지만, 노트에 적어두었던 정보들이 번지고 지워져버려 일부는 알아볼 수 없게 되었다.
노트에 적힌 문자열이 번진 패턴은 일정했는데, 가령 "abc" 문자가 세로로 3글자씩, 가로로 2글자씩 번진 경우는 다음과 같았다.
aabbcc
aabbcc
aabbcc
이 패턴을 이용해 문자열을 완전히 복원할 수 있을 것 같았지만, 아쉽게도 번진 문자열의 일부는 지워진 상태였다. 너무 많이 지워져버려서 해당 자리의 문자를 유추할 수 없는 경우, 완전히 문자열을 복원하지 못할 수도 있다.
미아는 자신이 아끼는 노트가 물에 빠진 바람에 매우 속상해하고 있다. 문자열을 최대한 완전히 복원해서 미아의 기를 살려주자!
입력
첫째 줄에 원래 문자열의 길이 N, 세로로 번진 글자의 개수 H, 가로로 번진 글자의 개수 W가 주어진다. (1 ≤ N ≤ 100, 1 ≤ H ≤ 10, 1 ≤ W ≤ 10)
둘째 줄부터 H개의 줄에 걸쳐 N × W 길이의 문자열이 주어진다. 문자열은 알파벳 소문자 또는 '?'로만 이루어져 있다. '?'는 해당 자리의 문자가 지워진 경우를 뜻한다.
문자가 번진 자리에 두 개 이상의 문자가 있는 등 모순되는 경우는 입력으로 주어지지 않는다.
출력
손상되기 전의 원래 문자열을 출력한다. 복원할 수 없는 문자는 '?'로 출력한다.
풀이 과정
N 길이의 문자열을 찾되, 가로로 W개 세로로 H 만큼 탐색을 더 진행한다.
? 가 아닌 다른 문자가 나온다면 지워지지 않은 str[열 인덱스 / W] 를 찾은 것이므로 결과를 저장한다.
C
#include <stdio.h>
char str[15][1005];
char result[105];
int main(void) {
int n, h, w;
scanf("%d %d %d", &n, &h, &w);
for (int i = 0; i < h; i++) scanf("%s", str[i]);
for (int i = 0; i < n; i++) result[i] = '?';
result[n] = 0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < n * w; j++) {
if (str[i][j] != '?') result[j/w] = str[i][j];
}
}
printf("%s", result);
}
Python
import sys
input = sys.stdin.readline
n, h, w = map(int, input().rstrip().split())
result = ['?' for _ in range(n)]
for _ in range(h):
string = input().rstrip()
for i in range(n):
for j in range(w):
if string[i*w+j] != '?':
result[i] = string[i*w+j]
print(''.join(result))
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 25166 : 배고픈 아리의 샌드위치 구매하기 ( BRONZE 1 ) / C, Python (0) | 2023.11.19 |
---|---|
[ BOJ ] 1076 : 저항 ( BRONZE 2 ) / C, Python (0) | 2023.11.19 |
[ BOJ ] 12871 : 무한 문자열 ( SILVER 5 ) / C, Python (0) | 2023.11.18 |
[ BOJ ] 11944 : NN ( BRONZE 2 ) / C, Python (0) | 2023.11.17 |
[ BOJ ] 3059 : 등장하지 않는 문자의 합 ( BRONZE 3 ) / C, Python (0) | 2023.11.17 |