728x90
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
- 생각
- 4방향을 돌아가면 조건 맞으면 추가해서 지나온 칸 수 비교
- 시간초과가 너무너무 많이 났다...
- list를 set으로 바꿈
- 4방향을 돌아가면 조건 맞으면 추가해서 지나온 칸 수 비교
- 코드
# 세로 R칸, 가로 C칸
R,C = map(int,input().split())
arr = [list(input()) for _ in range(R)]
result = 0
# 시간초과 때문에 set
s = set([(0,0,arr[0][0])])
while s and result <26:
# set은 랜덤으로 pop
r,c,ls =s.pop()
# 말이 지날 수 있는 최대의 칸?
result = max(result,len(ls))
# 4방향 확인
for dr,dc in [(0,1),(1,0),(0,-1),(-1,0)]:
nr = r + dr
nc = c + dc
# 범위 내에 있고 지금까지 지나온 모든 칸에 적혀 있는 알파벳과 다르다면
if 0 <= nr < R and 0 <= nc < C and arr[nr][nc] not in ls:
# 추가
s.add((nr,nc,ls+arr[nr][nc]))
print(result)
- 풀면서 배운 점
- set으로 하면 시간초과가 되지 않는다
- set 추가는 set.add
- set 요소 삭제 set.pop는 랜덤으로 한개 내놓으면서 삭제
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[백준] 1018. 체스판 다시 칠하기 - Python (0) | 2022.06.07 |
---|---|
[백준] 1182. 부분수열의 합 - Python (0) | 2022.06.06 |
[프로그래머스] Lv.2 오픈채팅방 - Python (0) | 2022.06.05 |
[프로그래머스] Lv.1 숫자 문자열과 영단어 - Python (0) | 2022.06.04 |
[프로그래머스] Lv.1 로또의 최고 순위와 최저 순위 - Python (0) | 2022.06.04 |
댓글