728x90
반응형
📜 문제 내용
🤔 과정
- 문제를 읽고 자릿수 계산임을 파악
- 자릿수 계산에 의해 앞 자릿수가 올라갈 수도 있기 때문에 자릿수 + 1 크기의 배열을 생성해서, 자릿수를 거꾸로 삽입해서 넣고 순회해야한다고 판단
- 자릿수 범위 기준을 4로 잡고, 4 이하면 빼는 방법으로, 5 이상이면 더하고 나서 다음 자릿수 1을 올리는 방법으로 처리 -> 여기서 멈추면 안된다. 테케 오답 원인
✨ 최초 제출 답안 - 🆖 테스트케이스 오답
class Solution {
public int solution( int storey) {
int numLen = (int) (Math.log10(storey) + 1);
int[] arr = new int[numLen + 1];
for(int i = 0; i < numLen; i++){
arr[i] = storey % 10;
storey /= 10;
}
int cnt = 0;
for(int i = 0; i < arr.length; i++){
if(arr[i] <= 4){
cnt += arr[i];
}else{
cnt += 10 - arr[i];
arr[i+1]++;
}
}
return cnt;
}
}
- 테스트 케이스 5, 6, 8, 9 번에서 실패를 했다. 고민을 해본 결과, arr[ i ] = 5 일 때, arr[ i + 1] 의 값에 따라 처리를 다르게 해줘야했다.
- TestCase 1) storey = 75 인 경우, 기댓값 = 8
이유 : 5를 더해 80으로 만든 후, 20을 더해 100을 만들고, 100을 뺀다. 5 + 2 + 1 = 8 - TestCase 2) storey = 15 인 경우, 기댓값 = 6
이유 : 5를 빼고 10으로 만든 후, 10을 뺀다. 5 + 1 = 6 - 현재 값( i )이 5인 경우, 다음 자리의 값( i + 1 )이 5 이상이면, 다음 자리의 값( i + 1 ) 을 1 올려주는 것이 최소값을 구하게 된다.
- 현재 값( i )이 5인 경우, 다음 자리의 값( i + 1 ) 이 5 미만이면, 그냥 현재 값( i ) 을 빼는 것이 최소값을 구하는 방법이다.
✍️ 재제출 답안 - 🙆♂️ 통과
class Solution {
public int solution(int storey) {
// 자릿수 구하기
int numLen = (int) (Math.log10(storey) + 1);
// 자릿수보다 1 크게 만들어서 배열 생성
int[] arr = new int[numLen + 1];
// 1의 자리부터 역으로 배열에 삽입
for(int i = 0; i < numLen; i++){
arr[i] = storey % 10;
storey /= 10;
}
int minStone = 0;
for(int i = 0; i < arr.length; i++){
if(arr[i] > 5 || (arr[i] == 5 && arr[i + 1] >= 5)){
minStone += 10 - arr[i];
arr[i + 1]++;
}else{
minStone += arr[i];
}
}
return minStone;
}
}
🔗 문제 링크
728x90
반응형