일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 14499번
- QueryDSL 기초
- 스타트 택시
- 12865번
- 파이썬
- 수식 최대화
- 백준 알고리즘
- 미세먼지 안녕!
- 빛의 경로 사이클
- 어른 상어
- 19238번
- 2020 카카오 인턴십
- SW Expert Academy
- 경주로 건설
- 1038번
- 16234번
- 15686번
- 키패드 누르기
- HTML 기초
- 17144번
- 베스트엘범
- 1789번
- 12869번
- SW ExpertAcademy
- 프로그래머스
- 거울 설치
- 보석 쇼핑
- 9095번
- 감소하는 수
- python
Archives
- Today
- Total
보물창고 블로그
SW Expert Academy 1824. 혁진이의 프로그램 검증 본문
728x90
이 문제를 깊이 우선 탐색(dfs)을 활용하여 풀었다. 처음에 풀었을 때는 잘 안 풀려서 일주일 정도를 다른 문제들을 풀고 나서 다시 풀게 된 문제이다. 이 문제를 풀게 되면서 알게 된 것은 dfs는 재귀를 사용하지 않고도 스택(stack)을 통해서도 구현이 가능하다는 것을 알게 되었다. 물론 재귀를 하였을 때와 탐색하는 순서는 다르지만, 결과는 같다. 다음은 내가 해결한 코드이다.
def solution(map1, visit, test, r, c):
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
stack = [[0, 0, 3, 0]]
while stack:
x, y, d, m = stack.pop()
if visit[x][y][d][m] == test:
continue
else:
visit[x][y][d][m] = test
if map1[x][y] == '<' or (map1[x][y] == '_' and m != 0):
stack.append([(x + dx[1]) % r, (y + dy[1]) % c, 1, m])
elif map1[x][y] == '>' or (map1[x][y] == '_' and m == 0):
stack.append([(x + dx[3]) % r, (y + dy[3]) % c, 3, m])
elif map1[x][y] == '^' or (map1[x][y] == '|' and m != 0):
stack.append([(x + dx[0]) % r, (y + dy[0]) % c, 0, m])
elif map1[x][y] == 'v' or (map1[x][y] == '|' and m == 0):
stack.append([(x + dx[2]) % r, (y + dy[2]) % c, 2, m])
elif map1[x][y] == '@':
return True
elif map1[x][y] == '+':
stack.append([(x + dx[d]) % r, (y + dy[d]) % c, d, (m + 1) % 16])
elif map1[x][y] == '-':
stack.append([(x + dx[d]) % r, (y + dy[d]) % c, d, (m - 1) % 16])
elif map1[x][y] == '.':
stack.append([(x + dx[d]) % r, (y + dy[d]) % c, d, m])
elif map1[x][y] == '?':
for i in range(4):
stack.append([(x + dx[i]) % r, (y + dy[i]) % c, i, m])
else:
stack.append([(x + dx[d]) % r, (y + dy[d]) % c, d, int(map1[x][y])])
return False
t = int(input())
visit = [[[[0 for _ in range(16)] for _ in range(4)] for _ in range(20)] for _ in range(20)]
for test in range(1, t + 1):
r, c = map(int, input().split())
map1 = [input() for _ in range(r)]
answer = solution(map1, visit, test, r, c)
if answer==True:
answer='YES'
else:
answer='NO'
print('#{} {}'.format(test,answer))
'알고리즘 풀이 > SW Expert Academy' 카테고리의 다른 글
SW Expert Academy 1249. [S/W 문제해결 응용] 4일차 - 보급로 (0) | 2020.01.28 |
---|---|
SW Expert Academy 1244. [S/W 문제해결 응용] 2일차 - 최대 상금 (0) | 2020.01.28 |
SW Expert Academy 4130. [모의 SW 역량테스트] 특이한 자석 (0) | 2020.01.23 |
SW Expert Academy 4014. [모의 SW 역량테스트] 활주로 건설 (0) | 2020.01.17 |
SW Expert Academy 1868. 파핑파핑 지뢰찾기 (0) | 2020.01.16 |
Comments