Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

[프로그래머스 Level 2] 점프와 순간 이동 - JavaScript
연습장/프로그래머스 문제풀이

[프로그래머스 Level 2] 점프와 순간 이동 - JavaScript

2023. 1. 4. 22:12

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12980

 

프로그래머스

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

programmers.co.kr

✏️ 풀이

function solution(n) {
    let consumption = 0;
    while (n) {
        if (n % 2) {
            n = (n - 1) / 2;
            consumption++;
        } else {
            n /= 2;
        }
    }
    return consumption;
}

순간 이동을 할 때에는 건전지를 사용하지 않으므로 최대한 많이 순간 이동을 해야 한다.만약 이전 위치에서 현재 위치로 순간 이동을 했다면, 현재 위치의 거리는 반드시 짝수가 되어야 한다. 따라서 도착점까지의 거리 n이 짝수면 이전 위치에서 순간 이동 또는 점프로 도착점에 도달할 수 있고, 홀수면 점프로만 도착점에 도달할 수 있다. 이 점을 이용해서 도착점부터 시작점까지 역순으로 최적의 이동 방법을 추적할 수 있다.

 

거리를 2로 나눌 수 있으면 2로 나누고(순간 이동), 나눌 수 없으면 1을 빼기(점프)를 반복하면서 0이 될 때까지 반복한다. 즉, 순간 이동이 가능했던 지점에서는 반드시 순간 이동을 했던 것으로 가정하고, 순간 이동으로 도착하는 것이 불가능한 거리가 홀수인 지점에서는 점프를 했던 것으로 가정하는 것이다. 점프를 할 때에만 consumption을 증가시키면 최소한의 건전지 사용량을 구할 수 있다.

 

※ 이 문제를 dp로 풀려고 하면 효율성 테스트를 통과할 수 없다.

 

✏️ 다른 풀이

function solution(n) {
    return [...n.toString(2)].filter(Number).length;
}

10진수를 2진수로 변환할 때, 2로 계속 나누면서 그 나머지(0 또는 1)를 구하고, 마지막 몫과 나머지들을 역순으로 이어 붙이면 2진수로 만들 수 있다. 이 과정이 마치 순간 이동할 때에는 건전지를 소모하지 않고(0), 1칸 점프할 때 건전지를 1 소모하는 것과 같다. 따라서, 10진수 n을 2진수로 변환한 뒤, 1의 개수를 세면 건전지 소모량과 같다는 것을 알 수 있다. 이 점을 활용하면 훨씬 간단하게 해결할 수 있다.

저작자표시 비영리 (새창열림)

'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글

[프로그래머스 Level 3] 입국심사 - JavaScript  (0) 2023.01.10
[프로그래머스 Level 2] 멀리 뛰기 - JavaScript  (0) 2023.01.06
[프로그래머스 Level 2] 올바른 괄호 - JavaScript  (0) 2023.01.04
[프로그래머스 Level 2] 귤 고르기 - JavaScript  (0) 2023.01.02
[프로그래머스 Level 2] 디펜스 게임 - JavaScript  (0) 2022.12.30
    '연습장/프로그래머스 문제풀이' 카테고리의 다른 글
    • [프로그래머스 Level 3] 입국심사 - JavaScript
    • [프로그래머스 Level 2] 멀리 뛰기 - JavaScript
    • [프로그래머스 Level 2] 올바른 괄호 - JavaScript
    • [프로그래머스 Level 2] 귤 고르기 - JavaScript
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바