프로그래머스/Lv.2
[C++] 프로그래머스 마법의 엘리베이터
MINU.SHINNNN
2023. 11. 14. 21:58
https://school.programmers.co.kr/learn/courses/30/lessons/148653
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
주어진 변수 storey의 범위가 100,000,000 이므로 BFS 를 사용해 해결할 수 없는 문제입니다.
따라서, Greedy 하게 문제를 해결할 수 있는지를 생각해 보면 됩니다.
주어진 storey에 더하거나 뺄 수 있는 수는 절대값이 10^n인 수 입니다. 따라서 주어진 수의 가장 작은 자릿 수부터 0으로 만들어 나가면 문제를 해결할 수 있습니다.
16의 경우 가장 작은 자릿수 6을 먼저 0으로 만들어야 합니다. 이때 +4를 할 경우 더 적은 횟수로 0을 만들 수 있습니다. 이후 20이 되면 -20으로 6번만에 0을 만들 수 있습니다.
가장 작은 자릿수가 5인 경우에는 다음 자릿수가 5 이상인 경우 올려주면 유리하고, 5 미만인 경우 뺴주어야 유리합니다.
555 (5) -> 560 (4) -> 600 (4) -> 1000 (1) -> 0 (14번)
555 (5) -> 550 (5) -> 500 (5) -> 0 (15 번)
구현의 경우 현재 자릿 수를 0으로 만든 후는 앞의 남은 자릿수들만 확인하면 되므로 storey /= 10이 됩니다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int storey) {
int answer = 0;
while (storey > 0) {
int digit = storey % 10;
storey = storey / 10;
// 5 인 경우 앞자리 숫자가 5 이상이면 올려주는 것이 유리
if (digit == 5) {
if (storey % 10 >= 5) {
answer += (10 - digit);
storey++;
}
else
answer += digit;
}
// 더하는게 이득
else if (digit > 5) {
answer += (10 - digit);
storey++;
}
else {
// 빼는게 이득
answer += digit;
}
}
return answer;
}