티스토리 뷰
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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': [-1, 0], 'S': [1, 0], 'E': [0, 1], '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 |
'CS > 코딩테스트' 카테고리의 다른 글
프로그래머스 - 다음 큰 숫자 - python3 (0) | 2023.11.06 |
---|---|
프로그래머스 - LEVEL2 - JadenCase 문자열 만들기 (0) | 2023.11.03 |
프로그래머스 - LEVEL1 - 바탕화면 정리 - python3 (2) | 2023.11.01 |
[1차] 다트 게임 - 프로그래머스 - LEVEL1 (2) | 2023.10.30 |
프로그래머스 - LEVEL0 - [주사위 게임 3] (0) | 2023.09.26 |
- Total
- Today
- Yesterday
- 문제 리포트
- collections
- 명시적 초기화
- Level2
- builder
- python3
- JadenCase
- Java
- composition api
- 다음 큰 숫자
- 괄호 회전하기
- 숫자의표현
- Mac
- 주사위게임3
- vue3란?
- optionsAPI
- LELVE1
- 문자열만들기
- defaultdict
- 프로그래머스
- vue정의
- python2.7
- 클래스초기화블럭
- 인스턴스초기화블럭
- JAVA 변수 초기화
- spring
- level1
- Leve2
- 초기화블럭
- vue3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |