문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음 작성한 코드
- 시작점을 찾고 그 위치를 기준으로 루트마다 조건을 만족하는지 체크하는 방식이다.
- 리스트 park의 길이를 통해 높이와 너비를 알아낸고 각 방향의 백터 딕셔너리를 선언한다.
- 이중 루프문을 통해 리스트 park에서 문자 S가 있는 위치를 찾고 cur_pos에 갱신한다.
- 루트마다 방향과 거리를 가져오고, new_pos에 갱신된 위치를 기록한다.
- new_pos이 공원을 벗어났는지 체크한다.
- 공원을 벗어나지 않았다면 경로 내에 방해물 문자 X가 있는지 체크해 본다.
- 만약 있다면 방해물이 있는지 확인하는 flg1 변수를 True로 갱신해 준다.
- 경로 내에 방해물이 없는지 확인된다면(flg1 변수가 False 라면) 현재 위치 cur_pos에 new_pos 값을 경신해 준다.
- new_pos이 공원을 벗어났는지 체크한다.
def solution(park, routes):
H = len(park)
W = len(park[0])
dir_dic = {"E": [0, 1], "W": [0, -1], "N": [-1, 0], "S": [1, 0]}
cur_pos = None
for i in range(W):
for j in range(H):
if park[j][i] == "S":
cur_pos = [j, i]
break
if cur_pos is not None:
break
for i in routes:
dir, dis = i.split(' ')
dis = int(dis)
new_pos = [cur_pos[0] + dir_dic[dir][0] * dis, cur_pos[1] + dir_dic[dir][1] * dis]
if 0 <= new_pos[1] < W and 0 <= new_pos[0] < H:
flg1 = False
for j in range(dis):
tmp_pos = [cur_pos[0] + dir_dic[dir][0] * (j+1), cur_pos[1] + dir_dic[dir][1] * (j+1)]
if park[tmp_pos[0]][tmp_pos[1]] == "X":
flg1 = True
break
if not flg1:
cur_pos = new_pos
return cur_pos
# 입출력 예시
print(solution(["SOO", "OOO", "OOO"], ["E 2", "S 2", "W 1"]))
print(solution(["SOO", "OXX", "OOO"], ["E 2", "S 2", "W 1"]))
print(solution(["OSO", "OOO", "OXO", "OOO"], ["E 2", "S 3", "W 1"]))
알고리즘은 바로 작성했으나, 사소한 범위설정 오류 때문에 디버깅까지 해보면서 체크해 보느라 시간을 많이 소요했다.
다음부터는 노트에다 수도코드를 정확히 작성해야겠다.
다른 코드
사소한 차이는 있으나 크게 다른 코드, 혹은 더 좋은 코드를 발견하지 못했다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Programmers][Python] 성격 유형 검사하기 (0) | 2023.03.29 |
---|---|
[Programmers][Python] 햄버거 만들기 (0) | 2023.03.27 |
[Programmers][Python] 당구 연습 (0) | 2023.03.23 |
[Programmers][Python] 둘만의 암호 (0) | 2023.03.22 |
[Programmers][Python] 덧칠하기 (0) | 2023.03.21 |