문제
https://school.programmers.co.kr/learn/courses/30/lessons/120861?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🐍파이썬
def solution(keyinput, board):
answer = [0, 0]
d = {"left":-1, "right":1, "up":1, "down":-1}
for i in keyinput:
if i in ["left", "right"]:
answer[0] += d[i]
if abs(answer[0]) > board[0]//2:
answer[0] -= d[i]
elif i in ["up", "down"]:
answer[1] += d[i]
if abs(answer[1]) > board[1]//2:
answer[1] -= d[i]
return answer
1️⃣ 사전을 이용해 네 방향의 가중치를 선언한다.
2️⃣ left, right가 나올 경우 answer[0]에 해당하는 가중치를 더해준다.
3️⃣ 만약 값이 board의 가로값 // 2 보다 크다면 더했던 가중치를 다시 빼준다.
4️⃣ up, down인 경우에도 마찬가지로 진행한다.
다른 답안을 참고한 뒤 바꿔본 코드(시간 효율성은 떨어진다)
def solution(keyinput, board):
answer = [0, 0]
d = {"left":-1, "right":1, "up":1, "down":-1}
for i in keyinput:
if i in ["left", "right"]:
if abs(answer[0] + d[i]) <= board[0]//2:
answer[0] += d[i]
elif i in ["up", "down"]:
if abs(answer[1] + d[i]) <= board[1]//2:
answer[1] += d[i]
return answer
1️⃣ 사전을 이용해 네 방향의 가중치를 선언한다.
2️⃣ left, right가 나올 경우 abs(answer[1] + d[i])가 board의 가로값 // 2 보다 작거나 같다면 answer[0]에 해당하는 가중치를 더해준다. (다음에 나올 결과를 미리 예측하고 가중치를 더할지 말지 결정)
3️⃣ up, down인 경우에도 마찬가지로 진행한다.
다른 풀이 방법
def solution(keyinput, board):
x_lim,y_lim = board[0]//2,board[1]//2
move = {'left':(-1,0),'right':(1,0),'up':(0,1),'down':(0,-1)}
x,y = 0,0
for k in keyinput:
dx,dy = move[k]
if abs(x+dx)>x_lim or abs(y+dy)>y_lim:
continue
else:
x,y = x+dx,y+dy
return [x,y]
x+dx, y+dy 값을 미리 경계값과 비교하여 경계값을 넘어가는 경우 continue
def solution(keyinput, board):
output = [0, 0]
for key in keyinput:
if key == 'left':
output[0] = output[0] - 1 + (1 if -output[0] == board[0] // 2 else 0)
elif key == 'right':
output[0] = output[0] + 1 - (1 if output[0] == board[0] // 2 else 0)
elif key == 'down':
output[1] = output[1] - 1 + (1 if -output[1] == board[1] // 2 else 0)
elif key == 'up':
output[1] = output[1] + 1 - (1 if output[1] == board[1] // 2 else 0)
return output
우선 output에 값을 더하거나 빼준 뒤, 경계값과 현재 output 절댓값이 같은 경우 더해준 값을 빼거나 빼준 값을 더해주었다.
🐥자바스크립트
function solution(keyinput, board) {
let answer = [0, 0];
let d = {"left":-1, "right":1, "up":1, "down":-1}
for (let i of keyinput){
if (i === "left" || i === "right"){
answer[0] += d[i];
if (Math.abs(answer[0]) > parseInt(board[0]/2)){
answer[0] -= d[i];
}
} else if (i === "up" || i === "down"){
answer[1] += d[i];
if (Math.abs(answer[1]) > parseInt(board[1]/2)){
answer[1] -= d[i];
}
}
}
return answer;
}
1️⃣ 사전을 이용해 네 방향의 가중치를 선언한다.
2️⃣ left, right가 나올 경우 answer[0]에 해당하는 가중치를 더해준다.
3️⃣ 만약 값이 board의 가로값 // 2 보다 크다면 더했던 가중치를 다시 빼준다.
4️⃣ up, down인 경우에도 마찬가지로 진행한다.
다른 풀이 방법
function solution(keyinput, board) {
let res = [0,0];
for (let p of keyinput) {
switch(p){
case 'left': if (-res[0] < board[0]/2-1) res[0]--; break;
case 'right': if (res[0] < board[0]/2-1) res[0]++; break;
case 'up': if (res[1] < board[1]/2-1) res[1]++; break;
case 'down': if (-res[1] < board[1]/2-1) res[1]--; break;
}
}
return res;
}
switch-case문 이용
res의 절댓값이 board // 2 - 1보다 작을 경우 값을 더하거나 빼준다. (더하거나 뺄 경우 res의 절댓값은 최대 board//2와 동일한 값이 된다.)
function solution(keyinput, board) {
let key = {"right" : [1,0], "up" : [0,1], "down" : [0,-1], "left" : [-1,0]};
let rslt = keyinput.map(v => key[v]).reduce((a,b) => {
if (Math.abs(a[0] + b[0]) > board[0]/2 || Math.abs(a[1] + b[1]) > board[1]/2)
return [a[0],a[1]] ;
return [a[0] + b[0], a[1] + b[1]];}
, [0,0])
return rslt;
}
- keyinput = ["left", "right", "up", "right", "right"] 인 경우,
- keyinput.map(v => key[v]) ☞ [ [-1, 0], [1, 0], [0, 1], [1, 0], [1, 0] ]
- [ [-1, 0], [1, 0], [0, 1], [1, 0], [1, 0] ].reduce((a, b) => {...}, [0, 0]) ☞ [0, 0]을 초기값으로 함. 누적값+현재값이 경계값보다 큰 경우 누적값만 리턴, 누적값+현재값이 경계값보다 작거나 같은 경우 누적값+현재값을 리턴
- reduce 참고: https://florescene.tistory.com/278
[자바스크립트 문법] Array.prototype.map(), Array.prototype.reduce()
🐸 map() 주어진 callback 함수를 배열 내의 모든 요소 각각에 대해 호출한 결과를 모아, 새로운 배열을 반환한다. callback 함수는 다음의 3가지 인수를 가진다. currentValue 처리할 배열의 현재 요소 inde
florescene.tistory.com
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스 | 파이썬 / 자바스크립트] 피자 나눠 먹기 (1)(코딩테스트 입문/ level 0) (0) | 2023.02.20 |
---|---|
[프로그래머스 | 파이썬 / 자바스크립트] 직사각형 넓이 구하기(코딩테스트 입문/ level 0) (0) | 2023.02.20 |
[프로그래머스 | 파이썬 / 자바스크립트] 종이 자르기(코딩테스트 입문/ level 0) (0) | 2023.02.20 |
[프로그래머스 | 파이썬 / 자바스크립트] 가위 바위 보(코딩테스트 입문/ level 0) (2) | 2023.02.19 |
[프로그래머스 | 파이썬 / 자바스크립트] 주사위의 개수(코딩테스트 입문/ level 0) (0) | 2023.02.19 |
[프로그래머스 | 파이썬 / 자바스크립트] 짝수 홀수 개수(코딩테스트 입문/ level 0) (0) | 2023.02.19 |