https://www.acmicpc.net/problem/16113
22/09/14
좀 귀찮았던 문자열 겸 그래프 문제였다. 아이디어 자체는 매우 쉬웠으나 예외 처리하는 부분이 좀 있어서 구현이 귀찮았었다.
문제 접근 방식:
접근 자체는 매우 단순하게 접근했다.
기본적으로 1을 제외한 숫자는 가로 3칸 세로 5칸으로 이루어져 있고, 우리는 숫자를 알아내고 싶다.
따라서 입력받은 문자열을 세로 5칸이 되도록 쪼개서 행렬로 바꾸도록 구현했다.(첫번째 귀찮았던 점)
두번째로 숫자는 위에서 말한 것처럼 크기가 정해져 있고, 그 크기대로 모양 또한 정해져 있으므로 반복문을 사용하여 행렬을 돌려가며 숫자의 모양과 일치하는지 비교한다.(숫자의 모양을 구현하는 것이 두 번째로 귀찮았던 점이다)
나는 반복문을 while문으로 구현했는데, 조사해야할 열을 col로 잡으면 일반적인 숫자들은 3*5 크기를 가지고 있으므로, [0][col]~[5][col+2]까지의 인덱스 비교로 구할 수 있다.
이때, 숫자와 숫자 사이에는 공백이 있다고 했으므로, 숫자를 비교하다가 옳게 나오면 col을 +4해주었다.(일반적인 숫자의 가로 크기 3 + 공백 1칸)
만약 숫자가 안나오면 +1을 해주어서 그냥 다음 세로줄을 검색하는 것으로 했다.
마지막으로 제일 귀찮았던 점은 1이 들어간다는 점이었다.
1의 크기는 다른 숫자들 과는 다르게 3*5의 크기가 아니기 때문에 예외처리를 해주어야만 했다.
1이 맨 끝에 어떤 식으로 들어가 있냐에 따라서도 다르기 때문에 귀찮았다.
나는 일반적인 1의 모습을 3*5가 아닌 2*5(뒤의 공백 포함)이라고 간주하였다,
그리고 숫자가 옳게 비교되면 col을 +2 해주었다.
나는 while 문을 돌다가 index error가 나면 예외처리로 빠지는 형식을 취했다.
예외 처리를 할 때 1이 들어가 있을 수도 있기 때문이다.
예를 들어 graph가 가로 6칸짜리고, 만약 col이 4인 상태 해서 일반적인 숫자(가로 3칸짜리) 인식을 하려면 col인덱스 4, 5, 6 3줄을 비교해야 할 것인데 col인덱스는 5가 최대이므로 에러에 빠진다.
하지만 이런 경우에서도 1은 들어갈 수 있으므로, 예외처리를 해주어서 1까지 있는지 확인하고 break를 취해주었다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.
# 16113번 시그널
# 그래프 탐색
import sys
input = sys.stdin.readline
N = int(input())
C = N//5
S = input().rstrip()
graph = [list(S[i*C:(i+1)*C]) for i in range(5)]
col = 0
while True:
try:
if (graph[0][col] == '#' and graph[0][col+1] == '.' and
graph[1][col] == '#' and graph[1][col+1] == '.' and
graph[2][col] == '#' and graph[2][col+1] == '.' and
graph[3][col] == '#' and graph[3][col+1] == '.' and
graph[4][col] == '#' and graph[4][col+1] == '.'):
print(1, end = '')
col += 2
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '#' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '#' and graph[2][col+1] == '.' and graph[2][col+2] == '#' and
graph[3][col] == '#' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(0, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '.' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '#' and graph[3][col+1] == '.' and graph[3][col+2] == '.' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(2, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '.' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '.' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(3, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '.' and graph[0][col+2] == '#' and
graph[1][col] == '#' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '.' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '.' and graph[4][col+1] == '.' and graph[4][col+2] == '#'):
print(4, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '#' and graph[1][col+1] == '.' and graph[1][col+2] == '.' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '.' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(5, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '#' and graph[1][col+1] == '.' and graph[1][col+2] == '.' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '#' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(6, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '.' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '.' and graph[2][col+1] == '.' and graph[2][col+2] == '#' and
graph[3][col] == '.' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '.' and graph[4][col+1] == '.' and graph[4][col+2] == '#'):
print(7, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '#' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '#' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(8, end = '')
col += 4
elif (graph[0][col] == '#' and graph[0][col+1] == '#' and graph[0][col+2] == '#' and
graph[1][col] == '#' and graph[1][col+1] == '.' and graph[1][col+2] == '#' and
graph[2][col] == '#' and graph[2][col+1] == '#' and graph[2][col+2] == '#' and
graph[3][col] == '.' and graph[3][col+1] == '.' and graph[3][col+2] == '#' and
graph[4][col] == '#' and graph[4][col+1] == '#' and graph[4][col+2] == '#'):
print(9, end = '')
col += 4
else:
col += 1
except IndexError:
if ((col == C-1) and
graph[0][col] == '#' and
graph[1][col] == '#' and
graph[2][col] == '#' and
graph[3][col] == '#' and
graph[4][col] == '#') :
print(1, end = '')
elif ((col == C-2) and
graph[0][col] == '.' and graph[0][col] == '#' and
graph[1][col] == '.' and graph[1][col] == '#' and
graph[2][col] == '.' and graph[2][col] == '#' and
graph[3][col] == '.' and graph[3][col] == '#' and
graph[4][col] == '.' and graph[4][col] == '#'):
print(1, end = '')
elif ((col == C-2) and
graph[0][col] == '#' and graph[0][col] == '.' and
graph[1][col] == '#' and graph[1][col] == '.' and
graph[2][col] == '#' and graph[2][col] == '.' and
graph[3][col] == '#' and graph[3][col] == '.' and
graph[4][col] == '#' and graph[4][col] == '.'):
print(1, end = '')
break
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 4948번 베르트랑 공준 (0) | 2022.09.29 |
---|---|
[Python] 5637번 가장 긴 단어 (0) | 2022.09.28 |
[Python] 15904번 UCPC는 무엇의 약자일까? (0) | 2022.09.28 |
[Python] 17413번 단어 뒤집기 2 (0) | 2022.09.28 |
[Python] 2684번 동전 게임 (0) | 2022.09.27 |