얼음녹차의 블로그
article thumbnail

문제 링크: 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 값을 경신해 준다.
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"]))

알고리즘은 바로 작성했으나, 사소한 범위설정 오류 때문에 디버깅까지 해보면서 체크해 보느라 시간을 많이 소요했다.

다음부터는 노트에다 수도코드를 정확히 작성해야겠다.

 

다른 코드

사소한 차이는 있으나 크게 다른 코드, 혹은 더 좋은 코드를 발견하지 못했다.

profile

얼음녹차의 블로그

@PERIR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!