✔ 마법의 엘리베이터
문제 분석하기
0 ~ 4일 경우 0이 될 때까지 -1씩 버튼을 누르고,
6 ~ 9일 경우 앞의 자리에 하나를 더한 후 10이 될 때까지 +1씩 버튼을 누르도록 함
만약 5일 경우 앞의 자리가 0 ~ 4일 경우 -1씩 버튼을 누르고, 6 ~ 9일 경우 앞의 자리에 하나를 더한 후 +1씩 버튼을 누르도록 함
손으로 풀어보기
- 정수 배열에 숫자를 저장
- 숫자를 하나씩 살피며 마법의 돌의 수를 세도록 함
- 0 ~ 4일 경우 0이 될 때까지 -1씩 버튼을 누름
- 6 ~ 9일 경우 앞의 자리에 하나를 더한 후 10이 될 때까지 +1씩 버튼을 누르도록 함
- 만약 5일 경우 앞의 자리가 0 ~ 4일 경우 -1씩 버튼을 누르고,
6 ~ 9일 경우 앞의 자리에 하나를 더한 후 +1씩 버튼을 누르도록 함 - 이때 만약 맨 앞자리라면 앞의 자리에 하나를 더해주지 않도록 함
- 또한 앞의 자리를 하나 더해주어 앞의 자리가 10이 될 경우에는 +1 버튼만 해주도록 함
- 마법의 돌의 수를 반환
슈도코드 작성하기
storey(민수와 마법의 엘리베이터가 있는 층)
answer(마법의 돌의 최소값)
sstorey(stroey를 문자열로 변환한 값)
arr(엘리베이터의 층수를 하나씩 저장할 배열)
for(i -> storey의 길이만큼) {
arr에 저장
}
for(i -> arr만큼) {
if(arr[i]가 10이라면) {
if(가장 앞 자리라면) {
answer 1 증가 후 continue;
}
arr[i - 1]을 1 증가 후 continue;
}
if(arr[i]가 4보다 작다면)
answer을 arr[i]만큼 증가
else if(arr[i]가 5라면) {
if(가장 앞 자리라면) {
answer을 5만큼 증가 후 continue;
}
else {
if(arr[i - 1]이 5보다 작다면)
answer을 5만큼 증가
else {
answer을 5만큼 증가
arr[i - 1]을 1 증가
}
}
}
else if(arr[i]가 6보다 크다면) {
answer을 10 - arr[i]만큼 증가
if(가장 앞 자리라면) {
answer을 1 증가 후 continue;
}
arr[i - 1]을 1 증가
}
}
answer 반환
코드 구현하기
/**
* 148653) 마법의_엘리베이터
*/
public class L090_148653 {
// storey(민수와 마법의 엘리베이터가 있는 층)
public int solution(int storey) {
// answer(마법의 돌의 최소값)
int answer = 0;
// sstorey(stroey를 문자열로 변환한 값)
String sstorey = String.valueOf(storey);
// arr(엘리베이터의 층수를 하나씩 저장할 배열)
int[] arr = new int[sstorey.length()];
// arr에 sstorey 저장
for (int i = 0; i < arr.length; i++) {
arr[i] = Character.getNumericValue(sstorey.charAt(i));
}
// 가장 마지막 자리부터 가장 앞 자리까지
for (int i = arr.length - 1; i >= 0; i--) {
// arr[i]가 10이라면
if (arr[i] == 10) {
// 가장 앞 자리라면
if (i - 1 < 0) {
// -10 버튼을 1번 누르므로 answer 1 증가 후 continue;
answer++;
continue;
}
// 앞의 자리를 1 증가시키므로 arr[i - 1]을 1 증가 후 continue;
arr[i - 1]++;
continue;
}
// arr[i]가 4보다 작다면
if (arr[i] <= 4)
// 0이 될 때까지 -1 버튼을 arr[i]번 누르므로 answer을 arr[i]만큼 증가
answer += arr[i];
// arr[i]가 5라면
else if (arr[i] == 5) {
// 가장 앞 자리라면
if (i - 1 < 0) {
// 0이 될 때까지 -1 버튼을 5번 누르므로 answer을 5만큼 증가 후 continue;
answer += 5;
continue;
} else {
// arr[i - 1]이 5보다 작다면
if (arr[i - 1] < 5)
// 0이 될 때까지 -1 버튼을 5번 누르므로 answer을 5만큼 증가
answer += 5;
else {
// 10이 될 때까지 +1 버튼을 5번 누르므로 answer을 5만큼 증가
answer += 5;
// 앞의 자리를 1 증가시키므로 arr[i - 1]을 1 증가
arr[i - 1]++;
}
}
}
// arr[i]가 6보다 크다면
else if (arr[i] >= 6) {
// 10이 될 때까지 +1 버튼을 10 - arr[i]번 누르므로 answer을 10 - arr[i]만큼 증가
answer += (10 - arr[i]);
// 가장 앞 자리라면
if (i - 1 < 0) {
// 앞의 자리를 1로 생성하므로 answer을 1 증가 후 continue;
answer++;
continue;
}
// 앞의 자리를 1 증가시키므로 arr[i - 1]을 1 증가
arr[i - 1]++;
}
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L090_148653 solution = new L090_148653();
int storey = 2554;
int result = solution.solution(storey);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[150369] 택배 배달과 수거하기 (0) | 2024.02.10 |
---|---|
[150368] 이모티콘 할인행사 (0) | 2024.02.09 |
[148652] 유사 칸토어 비트열 (0) | 2024.02.08 |
[147354] 테이블 해시 함수 (0) | 2024.02.08 |
[142085] 디펜스 게임 (0) | 2024.02.07 |