본문 바로가기
Problem Solving/프로그래머스

[프로그래머스 | 파이썬 / 자바스크립트] 캐릭터의 좌표(코딩테스트 입문/ level 0)

by 청량리 물냉면 2023. 2. 20.
반응형
문제

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

 

반응형