문제
https://school.programmers.co.kr/learn/courses/30/lessons/148653
풀이(13분)
class Solution {
public int solution(int storey) {
int answer = 0;
while(storey > 0){
int check = storey % 10;
storey /= 10;
if(check< 5){
answer += check;
continue;
}
if(check == 5){
if(storey % 10 < 5){
answer += check;
}else{
answer += 10 - check;
storey += 1;
}
continue;
}
answer += 10 - check;
storey += 1;
}
return answer;
}
}
10의 제곱 단위로 움직일 수 있기 때문에 10을 기준으로 나머지 연산을 하며 진행했다.
1. 10으로 나눈 뒤의 나머지를 체크한다.
1-1. 나머지가 5보다 작다면 나머지만큼 돌을 쓰게 된다.
1-2. 나머지가 5보다 크다면 10-(나머지) 만큼의 돌을 쓰고, 몫에 1을 더해준다.(한 층 올라가게 된다고 생각해야됨.)
여기까지만 진행을 하였고, 문제에서 틀리다는 판정을 받았다. 정확히는 1-1에서 5보다 작거나 같다면이라고 했다.
하지만 여기서 고려해보아야 할 부분은 나머지가 5일 경우 단순히 5개의 돌만 쓰고 끝나는 것이 아닌, 이 다음에 얼만큼 적게 쓸 수 있는지가 중요하다는 것이다.
예를 들어 생각해보자. 65층의 경우 5층을 위해 5개의 돌을 소비하고, 다시 6층을 위해 4의 돌을 소비하고(7 8 9 10층 가서 다시 1개를 써야함), 마지막으로 1개의 돌을 소비해 총 10개를 쓰게 된다.
하지만, 5개의 돌을 소비하여 내려온 뒤 60층에서 계산을 하는 것이 아니라 5개의 돌을 소비하여 올라간 뒤 70층에서 내려오는 것으로 계산한다면? 1개를 더 적게 쓸 수 있게 되는 것이다.
따라서 5인 경우를 별도로 확인해서 계산하는 로직을 추가하여 맞출 수 있었다.
'문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 디펜스 게임(JAVA) (0) | 2025.01.24 |
---|---|
[프로그래머스] 테이블 해시 함수(JAVA) (0) | 2025.01.23 |
[프로그래머스] 숫자 변환하기(JAVA) (0) | 2025.01.19 |
[프로그래머스] 뒤에 있는 큰 수 찾기(JAVA) (0) | 2025.01.15 |
[프로그래머스] 택배 배달과 수거하기(JAVA) (0) | 2024.11.21 |