Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- level 3
- C언어
- 티스토리챌린지
- group by
- 프로그래머스
- Python
- 오블완
- programmers
- SQL 고득점 KIT
- Lv. 2
- 너비 우선 탐색
- dfs
- 깊이 우선 탐색
- javascript
- Lv. 3
- 소프티어
- select
- join
- Java
- 자바스크립트
- SQL
- 파이썬
- bfs
- 동적계획법
- Lv. 1
- LEVEL 2
- softeer
- Lv. 0
- DP
- Dynamic Programming
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 빛의 경로 사이클 {언어 : Python} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/86052
정답 코드 1
def solution(grid):
answer = []
n = len(grid)
m = len(grid[0])
dr = [-1, 0, 1, 0] # 상 우 하 좌
dc = [0, 1, 0, -1]
visited = dict()
for r in range(n):
for c in range(m):
for d in range(4):
cnt = 0
nr = r
nc = c
nd = d
while True:
key = f"{nr},{nc},{nd}" # r, c로 빛이 d방향에서 들어온다
if visited.get(key):
break
cnt += 1
visited[key] = 1
string = grid[nr][nc]
if string == "L":
nd = (nd - 1) % 4
elif string == "R":
nd = (nd + 1) % 4
nr = (nr + dr[nd]) % n
nc = (nc + dc[nd]) % m
if cnt:
answer.append(cnt)
answer.sort()
return answer
정답 코드 2
def solution(grid):
answer = []
n = len(grid)
m = len(grid[0])
dr = [-1, 0, 1, 0] # 상 우 하 좌
dc = [0, 1, 0, -1]
visited = [[[0] * 4 for _ in range(m)] for _ in range(n)]
for r in range(n):
for c in range(m):
for d in range(4):
cnt = 0
nr = r
nc = c
nd = d
while not visited[nr][nc][nd]:
cnt += 1
visited[nr][nc][nd] = 1
string = grid[nr][nc]
if string == "L":
nd = (nd - 1) % 4
elif string == "R":
nd = (nd + 1) % 4
nr = (nr + dr[nd]) % n
nc = (nc + dc[nd]) % m
if cnt:
answer.append(cnt)
answer.sort()
return answer
풀이 방법
- 정답 코드 2의 풀이는 다음과 같다.
- visited를 딕셔너리 형태로 만들었다.
- 현재 격자 S L R에 들어오는 빛의 방향을 visited에 저장하면 되겠구나 생각했다.
- key를 nr, nc, nd로 만들어서 저장시켰다.
- L인 경우 현재 nd에서 왼쪽으로 가야하므로 -1을 빼주고 4로 나누어 떨어진 수로 치환했다.
- R인 경우 현재 nd에서 오른쪽으로 가야하므로 1을 더해주고 4로 나누어 떨어진 수로 치환했다.
- key를 다시 갱신시키고 while문을 이어가면서 cnt에 1을 더해준다.
- 마지막으로 cnt가 있다는 말은 순환 경로가 있다는 말이므로 answer에 저장시켰다.
- 오름차순 정렬을 하고 answer를 반환하면 끝!
느낀점
- 오랜만에 다시 풀어보는데 풀이 방법이 떠오르지 않았다.
- 하지만 아! 현재 격자와 들어오는 빛의 방향을 함께 묶어서 visited에 저장하면 중복될 일이 없겠구나 싶었다.
- 풀고 보니 전에 풀었던 방식이랑 비슷했지만 dictionary로 만들어서 시간이 더 오래 걸린 것 같다.
'알고리즘 > 풀었지만 다시 보기' 카테고리의 다른 글
프로그래머스 [Lv. 2] 구명보트 {언어 : Python} (0) | 2024.11.19 |
---|---|
프로그래머스 [Lv. 2] 괄호 변환 {언어 : JavaScript} (0) | 2024.11.18 |
프로그래머스 [Lv. 2] 마법의 엘리베이터 {언어 : Python} [백트래킹] (0) | 2024.11.16 |
프로그래머스 [Lv. 2] 시소 짝꿍 {언어 : Java} (1) | 2024.11.15 |
프로그래머스 [Lv. 3] 고고학 최고의 발견 {언어 : JavaScript} (2) | 2024.11.13 |