사용 알고리즘
- 완전 탐색
풀이
경우의 수가 4가지 존재한다.
- 이전 층 영향 있음 (자리 올림)
- 현재 층에서 올라가기
- 현재 층에서 내려가기
- 이전 층 영향 없음
- 현재 층에서 올라가기
- 현재 층에서 내려가기
이전 층에 영향 없으면 눌러야 되는 버튼 수를 그대로 더하면 된다.
하지만 이전 층에 영향이 있으면 자리올림 때문에 버튼 수를 1을 더해준다.
풀이 코드
#include <bits/stdc++.h>
using namespace std;
int ans = 1e9;
string elevator;
// 캐리 여부, 현재 위치, 버튼 누른 수
void dfs(bool carry, int depth, int cnt) {
// 종료 조건
if(depth == -1) {
// 캐리
if(carry) cnt++;
if(cnt < ans)
ans = cnt;
return;
}
// 현재 층
int btn = elevator[depth]-'0';
// 자리올림
if(carry) {
dfs(1, depth-1, cnt + (10 - (btn+1))); // 올라감
dfs(0, depth-1, cnt + (btn+1)); // 내려감
}
else {
dfs(1, depth-1, cnt + (10 - btn)); // 올라감
dfs(0, depth-1, cnt + btn); // 내려감
}
}
int solution(int storey) {
elevator = to_string(storey);
int n = elevator.length();
dfs(0, n-1, 0);
return ans;
}
후기
더 똑똑하게 5를 기준으로 할 수 있었지만 엘리베이터의 길이가 짧아서 그냥 완탐으로 했다