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

2023. 2. 20. 11:24·Problem Solving/프로그래머스
문제

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
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 | 파이썬 / 자바스크립트] 직사각형 넓이 구하기(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 종이 자르기(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 가위 바위 보(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 주사위의 개수(코딩테스트 입문/ level 0)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 프로그래밍
        • Programming
        • C | C++
        • Java
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    알고리즘
    React
    Til
    bfs
    플러터
    SWEA
    mysql
    클론 프로젝트
    공식문서
    리액트
    자바스크립트
    타입스크립트
    강의내용정리
    ZeroCho
    블로그 제작
    파이썬
    spring boot
    포트폴리오
    d3
    Jiraynor Programming
    뉴렉처
    웹사이트
    Next.js
    구현
    프로젝트
    컴퓨터네트워크
    백준
    프로그래머스
    자바
    AWS
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[프로그래머스 | 파이썬 / 자바스크립트] 캐릭터의 좌표(코딩테스트 입문/ level 0)
상단으로

티스토리툴바