티스토리 뷰

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 내용:

2차원 배열 위에 주어진 방향, 좌표만큼 이동하여 최종 위치 출력하기

 1) 좌표를 벗어나는경우 해당 이동은 무시

 2) 이동방향은 동서남북 1칸씩 차례로 이동

 3) 이동방향에 X 장애물이 있을 경우 해당 이동은 무시

 자세한 내용은 문제링크 참고.

 

해결을 위한 접근 방법:

1. 시작 위치를 구한다.

2. 공원을 벗어나는 경우 해당 이동은 무시한다.

3. 이동경로에 있는지 장애물이 있는지 확인한다.

4. 공원을 벗어나지 않고, 이동경로에 장애물이 없을 경우 이동한다.

5. 최종위치 출력

 

소스코드 설명 :

1. 시작 지점 구하기 

 

1
2
3
4
5
    # 시작위치 가져오기
    for i, rot in enumerate(park):
        if rot.find("S"!= -1:
            answer = [i, rot.find("S")]
 
cs

먼저, 공원 2차원 배열은 다음과 같이 들어온다.

park = ["SOO","OOO","OOO"]

이때 S는 시작지점, O는 이동가능, X는 장애물을 의미한다.

먼저, park 값을 순서대로 가져온다. "S" 시작지점을 찾았을 경우 answer 값에 [시작 H, 시작 S] 값을 넣어준다. 

 

 

2. 공원을 벗어나는 경우 해당이동은 무시

1
2
3
4
5
6
7
8
9
10
 for strVal in routes:
        checkTF = True
        op, n = strVal.split()
        n = int(n)
        # 공원벗어나는경우 명령 무시
        chk = [x + y for x, y in zip(answer, (mveVal[op][0* n, mveVal[op][1* n))]
        # print('chk : ', chk, ' mveVal[op][0] : ', mveVal[op][0], ' mveVal[op][1] : ',mveVal[op][1])
        if chk[0< 0 or chk[0>= H or chk[1< 0 or chk[1>= W:
            checkTF = False
            continue
cs

이동해야 하는 부분은 다음과 같이 입력된다.

routes = ["E 2","S 2","W 1"]

따라서, split()를 통해 띄어쓰기를 기준으로 op, n에 넣어준다.

 

시작 위치와 + 이동 후 좌표를 계산하여, 공원을 벗어나는 경우 continue를 통해 다음 명령을 실행

 

3. 이동경로 장애물 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 # W,E 이동
        if op == 'E' and park[answer[0]][answer[1]:chk[1+ 1].find("X"!= -1:
            checkTF = False
            continue
        if op == 'W' and park[answer[0]][chk[1]:answer[1]].find("X"!= -1:
            checkTF = False
            continue
 
        # N,S 이동
        for i in range(n + 1):
            if op == 'S' and park[answer[0+ i][answer[1]].find("X"!= -1:
                checkTF = False
                break
            if op == 'N' and park[answer[0- i][answer[1]].find("X"!= -1:
                checkTF = False
                break
cs

 

4. 아쉬운 점

  4.1 W(0, -1) N(-1, 0) 이동의 경우 현재 좌표에서 -1 연산인데, 이런 경우 인덱스 슬라이싱을 통해 처리하기 헷갈렸다. 

  4.2 E, W, S, N 체크로직을 단순화하지 못하였다.

 

5. 다른 사람 풀이 참고

  5.1 zip연산을 통해 행열 변환 후 리스트  슬라이싱 사용.

row_park = list(zip(*park))

 

더보기

최종 소스코드 보기

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
32
33
34
35
36
37
38
39
40
41
42
43
44
def solution(park, routes):
    answer = []
    W = len(park[0])  # 가로
    H = len(park)  # 세로
 
    # 시작위치 가져오기
    for i, rot in enumerate(park):
        if rot.find("S"!= -1:
            answer = [i, rot.find("S")]
    # print('start answer :',answer)
 
    mveVal = {'N': [-10], 'S': [10], 'E': [01], 'W': [0-1]}
    for strVal in routes:
        checkTF = True
        op, n = strVal.split()
        n = int(n)
        # 공원벗어나는경우 명령 무시
        chk = [x + y for x, y in zip(answer, (mveVal[op][0* n, mveVal[op][1* n))]
        # print('chk : ', chk, ' mveVal[op][0] : ', mveVal[op][0], ' mveVal[op][1] : ',mveVal[op][1])
        if chk[0< 0 or chk[0>= H or chk[1< 0 or chk[1>= W:
            checkTF = False
            continue
        # 이동경로에 장애물이 있는지 체크
 
        # W,E 이동
        if op == 'E' and park[answer[0]][answer[1]:chk[1+ 1].find("X"!= -1:
            checkTF = False
            continue
        if op == 'W' and park[answer[0]][chk[1]:answer[1]].find("X"!= -1:
            checkTF = False
            continue
 
        # N,S 이동
        for i in range(n + 1):
            if op == 'S' and park[answer[0+ i][answer[1]].find("X"!= -1:
                checkTF = False
                break
            if op == 'N' and park[answer[0- i][answer[1]].find("X"!= -1:
                checkTF = False
                break
        if checkTF == True:
            answer = chk
    return answer
 
cs

 

 

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함