일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- PCCP
- 카카오
- 24955
- 티스토리챌린지
- 10기
- 숫자 이어 붙이기
- 수료
- MySQL
- 정기 코딩 인증평가
- 싸피
- 해결
- java
- 배열 돌리기 5
- 카카오코드 본선
- 등산코스 정하기
- 오블완
- softeer
- 설명
- SSAFY
- 핵심
- 산 모양 타일링
- 백준
- 142085
- 프로그래머스
- 후기
- 소프티어
- 인턴십
- SQL
- 퍼즐 조각 채우기
- 14942
- Today
- Total
개발 쥬스
[프로그래머스/Java] 148653 마법의 엘리베이터 본문
🔗 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/148653
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔍 해결 과정
유형: 그리디
시간복잡도: O(logN), N: storey
이 문제는 10의 제곱승의 절댓값을 활용하여 주어진 층수에서 0층으로 갈 때 활용할 수 있는 버튼의 최소 횟수를 구해야 합니다.
주어진 storey 매개변수에서 각 자리에 있는 값들을 0으로 만들도록 하는 것이 핵심이고 또한 최솟값의 횟수로 각 자리를 0으로 만들어주어야 합니다.
문제의 예시 2를 보면 각 자리의 값을 무조건 0으로 내리는 방식을 취하면 정답을 도출할 수 없다는 것을 알 수 있습니다.
그래서 0부터 10까지의 숫자를 나열한 다음 생각을 해보았습니다.
0 1 2 3 4 5 6 7 8 9 10
확실한 점은 4이하의 숫자는 무조건 내려주어야 하고, 6이상의 숫자는 무조건 10의 값으로 올려줘야 최솟값을 도출할 수 있습니다.
예를 들어서 17의 값을 볼 때 17 -> 18 -> 19 -> 20 -> 10 -> 0 의 과정으로 단 5회만에 0으로 만들어 줄 수 있고, 14의 경우는 14 -> 13 -> 12 -> 11 -> 10 -> 0 의 과정으로 최소 횟수 5회 만에 0으로 만들 수 있습니다.
하지만 5의 경우는 상황에 따라서 올려주어야 하는 상황이 있고, 내려주어야 하는 상황이 있습니다.
예를 들어서 555의 숫자가 있다고 가정한다면 다음과 같은 과정으로 최소 횟수를 도출할 수 있습니다.
1️⃣ 1의 자리 5의 값과 10의 자리 값을 살펴본다.
2️⃣ 이 때 10의 자리값을 살필 때 값이 5인 점이 확인되었다.
3️⃣ 1의 자리 값을 반올림하여 10의 자리값을 6으로 만들어준다. (현재값: 560, 버튼 횟수: 5)
4️⃣ 10의 자릿수를 살필 때 6은 5보다 크므로 값 0으로 만들기 위해서는 40을 더해주어야 한다. (현재값: 600, 버튼 횟수: 9)
5️⃣ 100의 자리 값은 6이므로 마찬가지로 400을 더해준다. (현재값: 1000, 버튼 횟수: 13)
6️⃣ 마지막으로 1000의 자리값 1은 한번에 0을 만들 수 있으므로 1000의 값을 빼준다. (현재값: 0, 버튼 횟수: 14)
위와 같은 과정으로 최소 14번의 버튼을 눌러 0으로 만들 수 있습니다.
다시말해 현재 보고 있는 자릿수가 5라면 그 다음 자릿수의 값이 5이상이면 10으로 만들어주어야 하고, 그게 아니라면 내려주는 방식으로 설계를 해야 최소 횟수를 도출할 수 있습니다.
✏️ 코드
import java.util.*;
class Solution {
public int solution(int storey) {
int answer = 0;
while (storey > 0) {
int number = storey % 10;
int nextNumber = (storey / 10) % 10;
if (number > 5 || (number == 5 && nextNumber >= 5)) {
answer += 10 - number;
storey = storey / 10 + 1;
} else {
answer += number;
storey /= 10;
}
}
return answer;
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스/Java] 142085 디펜스 게임 (0) | 2024.10.23 |
---|---|
[프로그래머스/Java] 179963 추억 점수 (1) | 2024.10.23 |
[핵심정리] 크루스칼 알고리즘 (0) | 2024.10.02 |
[프로그래머스/Java] 42885 구명보트 (0) | 2024.10.02 |
[프로그래머스/Java] 214288 상담원 인원 (0) | 2024.08.31 |