일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- react
- 메모리
- 네트워크
- BFS
- 스나이퍼팩토리
- 자바스크립트
- javascript
- react-query
- 알고리즘
- 리액트
- React.js
- App Runner
- ip
- IT개발캠프
- CS
- 타입스크립트
- 개발자부트캠프
- Algorithm
- 인사이드아웃
- 해시
- cs #네트워크
- 웅진씽크빅
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- typescript
- 스레드
- 프로젝트캠프
- 유데미
- 프로세스
- html
- Today
- Total
Bin's Blog
[프로그래머스] Level2 - 마법의 엘리베이터(Javascript) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▶️▶️ 문제 요약
1️⃣ 마법의 세계에 사는 민수는 아주 높은 탑에 살고 있다. 걸어 다니기 힘들어서 마법의 엘리베이터를 만들었다.
2️⃣ 엘리베이터는 -1, +1, -10, + 10, -100, + 100 등과 같이 10의 제곱 형태인 정수들이 적힌 버튼이 있다.
3️⃣ 마법의 엘리베이터를 움직이기 위해서 버튼 한 번 당 마법의 돌 한 개를 사용하게 된다.
4️⃣ 16층에 있는 민수가 0층으로 가려면 +1이 적힌 버튼을 4번, -10이 적힌 버튼 2번을 누르면 마법의 돌 6개를 소모하여 0층으로 갈 수 있다.
5️⃣ 민수가 어떤 층에서 엘리베이터를 타고 0층으로 내려가는데 필요한 마법의 돌의 최소 개수를 알고 싶다.
❌ 실패 코드
function solution(storey) {
let answer = 0;
let queue = [];
let visited = Array.from(Array(storey+1).fill(false));
let way = [-1, 1];
for (let i = 1; Math.pow(10, i) <= storey; i++) {
way.push(Math.pow(10, i));
way.push(Math.pow(-10, i));
}
queue.push([storey, 0]);
visited[storey] = true;
while (queue.length > 0) {
let [stair, count] = queue.shift();
if (stair === 0) {
return count
}
for (let w of way) {
let now = w + stair
if (now >= 0 && now <= storey && visited[now] === false) {
visited[now] = true;
queue.push([now, count+1])
}
}
}
}
❗️실패 이유
문제를 제대로 안 읽고 예전에 풀었던 문제가 생각나서 bfs라고 생각하고 접근했다. 큰 단점이다.. 왜 제대로 읽지 않았을까... 반성하자
✅ 정답 코드
function solution(storey) {
// 주어진 입력값을 자릿수로 분할한다.
let arr = [0, ...[...storey + ""].map(e => +e)];
// 가장 뒤의 자릿수부터 본다.
for (let i = arr.length -1; i > 0; i--) {
// 해당 숫자가 5보다 작으면 지나가고
if (arr[i] < 5) continue;
// 해당 숫자가 5이고 앞의 숫자가 5보다 작으면 지나가고
else if (arr[i-1] < 5 && arr[i] === 5) continue;
// 해당 숫자가 5보다 크면 10에서 뺀다.
arr[i] = 10 - arr[i];
// 해당 숫자의 앞의 자리 숫자를 1을 더한다.
arr[i-1]++;
}
// 배열의 모든 요소를 더한다.
return arr.reduce((a, c) => a + c);
}
📖 풀이 과정
1️⃣ 예제 1번을 보면 16이 +1이 적힌 버튼을 4번, -10이 적힌 버튼을 2번을 누르면 마법의 돌 6개를 소모하여 0층으로 갈 수 있다고 힌트를 줬다. 10 - 6 = 4, 1 + 1 = 2, 4 + 2 = 6이다.
예제 2번 2554를 보면, -1, + 100은 4번, +10은 5번 -1000은 3번이 된다고 한다. 4는 5보다 작으니까 그냥 쓰고 5는 10 - 5 = 5를 쓰고, 앞에 5는 + 1 이 되어서 6이 되고, 10 - 6 = 4가 된다. 앞에 2는 + 1이 되어서 3이되니 최종 16이 된다.
여기서 알 수 있는 것은 5이상 값은 10에서 뺀 값이고 5이상이 되면 앞의 자릿수가 + 1이 된다. 앞뒤가 5이면 앞의 자릿수를 + 1을 증가시켜야 한다.
또 다른 예시로 뒤에 자릿수가 5인데 앞의 자릿수가 5보다 작으면 4이면 앞의 돌을 증가시키지 말고 그냥 쓰는게 더 적게 사용할 수 있으므로 그 부분을 유념해야 한다. 2454의 경우에는 2 + 4 + 5 + 4 = 15가 된다.
2️⃣ 주어진 숫자 부분에서 분할하는 과정을 설명하면 arr 부분을 보자. 배열의 첫 번째 값은 0으로 넣어준다. 그리고 [...storey + ""]은 주어진 숫자를 문자열로 바꾸고 split()메서드를 쓴 것처럼 한 자리씩 분할된다. 그리고 .map(e => + e) 이 부분은 문자열을 숫자로 변환시키는 작업이다. 마지막으로 [...storey + ""] 의 앞에 구조 분할 역할을 하는 ...을 한 번 더 한 이유는 앞의 0과 하나의 배열로 만들기 위해서다.
3️⃣ for loop는 뒤에서 자릿수부터 보기 위해 --처리를 했다. 해당 숫자가 5보다 작거나 해당 숫자가 5이거나 앞의 숫자가 5보다 작으면 지나간다. 그리고 5보다 크면 10에서 빼고 해당 숫자의 앞의 숫자를 1을 더한다.
4️⃣ reduce() 메서드를 사용하여 모든 요소를 더한다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] Level1 - 달리기 경주(Javascript) (0) | 2023.08.17 |
---|---|
[프로그래머스] Level2 - 숫자 카드 나누기(Javascript) (0) | 2023.06.12 |
[프로그래머스] Level2 - 호텔 대실(Javascript) (0) | 2023.06.07 |
[프로그래머스] Level2 - 멀쩡한 사각형(Javascript) (0) | 2023.06.05 |
[프로그래머스] Level2 - 거리두기 확인하기(Javascript) (0) | 2023.05.29 |