728x90
반응형
문제요약 (16113. 시그널)
1. 시그널은 "."과 "#"으로 이루어져 있다.
2. 시그널을 해독한 결과에는 반드시 숫자가 1개 이상 있다.
3. 시그널에 등장하는 모든 "#"은 올바른 숫자 패턴에 포함되어 있다.
4. 숫자와 숫자 사이에는 1열 이상의 공백이 있다. 여기서 공백은, 열의 성분이 모두 "."인 열을 의미한다.
5. 0부터 9는 아래와 같이 나타난다. 역시 "#"을 검은색, "."을 흰색으로 표시했다.
여러가지 예제들을 넣어보면서 구현이 맞는지 확인해봐야한다.
스스로 반례를 찾는게 중요하지만 시간이 없거나 정말 모르겠다면 (https://www.acmicpc.net/board/view/64923) 이 링크를 참고하길 바란다.
풀이를 위한 부연 설명
- 코드에서 문제 풀이 시간을 줄이기 위하여 첫 줄에서 구분이 가능하다면 구분하도록 코드를 작성하였다.
- 코드별로 길이를 설정하여 확인한다.
- 구현에 대한 자세한 개념 설명과 연관 문제는 다음 링크를 참고하면 된다.
코드
import sys
input = sys.stdin.readline
n = int(input())
string = input().rstrip()
len = n // 5
signal = ["" for _ in range(len)]
for i in range(n):
signal[i % len] += string[i]
answer = ""
width = [3, 1, 4, 3, 3, 4, 3, 3, 3, 3]
idx = 0
while idx < len:
crt = signal[idx]
if crt == ".....":
idx += 1
# 0, 1, 6, 8
elif crt == "#####":
if idx == len - 1 or signal[idx + 1] == ".....":
answer += "1"
idx += width[1]
elif signal[idx + 1] == "#...#":
answer += "0"
idx += width[0]
else:
new = signal[idx + 2]
if new == "#.###":
answer += "6"
idx += width[6]
else:
answer += "8"
idx += width[8]
# 2
elif crt == "#.###":
answer += "2"
idx += width[2]
# 3
elif crt == "#.#.#":
answer += "3"
idx += width[3]
# 4
elif crt == "###..":
answer += "4"
idx += width[4]
# 7
elif crt == "#....":
answer += "7"
idx += width[7]
# 5, 9
else:
new = signal[idx + 2]
if new == "#.###":
answer += "5"
idx += width[5]
else:
answer += "9"
idx += width[9]
print(answer)
기억할 점
- 역시 구현은 반례를 찾는 것이 제일 중요하다.
반응형
'코딩 테스트 > 파이썬 문제 풀이' 카테고리의 다른 글
[백준] 2800번 파이썬 - 스택, 조합 (0) | 2024.02.26 |
---|---|
[백준] 1918번 파이썬 - 스택 (1) | 2024.01.27 |
[백준] 1931번 파이썬 - 그리디 (0) | 2024.01.19 |
[백준] 11286번 파이썬 - 우선순위 큐 (0) | 2024.01.19 |
[백준] 2252번 파이썬 - 위상 정렬 (0) | 2024.01.19 |