📝 문제
🔥 시도해본 접근 방식
인자로 주어진 storey를 일단 각 자리수마다 구분짓고 5이상이면 +연산을 하고 미만이면 -연산을 하여 횟수를 계산해야겠다고 생각이 들었다.
예를 들어서 16 이면 1과 6으로 쪼개고 뒤에서 부터
1. 6 + 4 (10이 되었으므로 다음 숫자 1이 2가 됨) 4개 사용
2. 2 - 2 2개 사용
이런식으로 계산하여 리턴하도록 하면 될것 같다고 판단하고 접근하였다.
1️⃣ 첫번째 시도
class Solution {
public int solution(int storey) {
int answer = 0;
String[] splitedStorey = String.valueOf(storey).split("");
for (int i = splitedStorey.length - 1; i >= 0; i--) {
int int_unit = Integer.parseInt(splitedStorey[i]);
if (int_unit == 10) {
answer++;
} else if (int_unit >= 5) {
answer += (10 - int_unit);
int nextValue = Integer.parseInt(splitedStorey[i - 1]) + 1;
splitedStorey[i - 1] = String.valueOf(nextValue);
} else {
answer += int_unit;
}
}
return answer;
}
}
위와 같이 코드를 작성하고 제출하였더니 실패가 너무 많았다.
두가지 결함을 발견했다.
1. 5이상일 때 + 연산을 하는것이 아니라 6이상일때 + 연산을 해야 함.
2. +연산으로 인해 자리수가 올라갈 때 splitedStorey의 인덱스가 0이라면 인덱스 허용범위를 벗어남.
2️⃣ 두번째 시도
class Solution {
public int solution(int storey) {
String string_storey = String.valueOf(storey);
String[] arr_storey = new String[string_storey.length() + 1];
arr_storey[0] = "0";
for (int i = 0; i < string_storey.length(); i++) {
arr_storey[i + 1] = String.valueOf(string_storey.charAt(i));
}
int answer = 0;
for (int i = arr_storey.length - 1; i >= 0; i--) {
int int_unit = Integer.parseInt(arr_storey[i]);
if (int_unit > 5) {
answer += (10 - int_unit);
int nextValue = Integer.parseInt(arr_storey[i - 1]) + 1;
arr_storey[i - 1] = String.valueOf(nextValue);
} else if (int_unit > 0) {
answer += int_unit;
}
}
return answer;
}
}
우선 위에서 언급한 1번 문제를 해결하기 위해 조건식을 수정하였고,
2번 문제를 해결하기 위해 배열을 선언하여 0번 인덱스에는 "0"을 넣고, 1번 인덱스 부터 storey를 분해하여 넣도록 처리하였다.
결함 두 가지를 모두 수정했지만 아직 실패케이스가 존재했다.
곰곰히 생각해보니 1번 문제에 오류가 있었다.
다음 순번의 값이 5이상이라면 현재 순번의 값이 5일 때도 + 연산을 해야하는 예외 케이스였다.
✨ 성공 코드
class Solution {
public int solution(int storey) {
// storey를 자리수 하나하나씩 분해하기 위해 String 으로 형변환
String string_storey = String.valueOf(storey);
// (+) 연산후 0번 인덱스의 값이 10이 된다면,
// 값을 올려주기 위해 배열 사이즈를 1만큼 더 크게 선언 후 "0"으로 초기화
String[] arr_storey = new String[string_storey.length() + 1];
arr_storey[0] = "0";
// 배열의 1번 인덱스부터 storey의 자리수를 하나하나씩 삽입
for (int i = 0; i < string_storey.length(); i++) {
arr_storey[i + 1] = String.valueOf(string_storey.charAt(i));
}
int answer = 0;
// 앞쪽 값이 뒷쪽 값의 (+) 연산에 의해 달라질 수 있으므로 배열의 뒤부터 순회
for (int i = arr_storey.length - 1; i >= 0; i--) {
// 현재 위치 값을 int로 형변환
int value = Integer.parseInt(arr_storey[i]);
// 조건 분기에 사용될 다음 위치 값
int next_value = 0;
if (i > 0) {
next_value = Integer.parseInt(arr_storey[i - 1]);
}
// 다음 위치값이 5이상이고 현재 위치 값이 5일때 혹은, 현재 위치 값이 5 이상일떄
if ((next_value >= 5 && value == 5) || value > 5) {
// (+) 연산 처리
answer += (10 - value);
int nextValue = next_value + 1;
arr_storey[i - 1] = String.valueOf(nextValue);
} else if (value > 0) {
// (-) 연산 처리
answer += value;
}
}
return answer;
}
}
'스터디 > 99클럽 코테 스터디 TIL' 카테고리의 다른 글
99클럽 코테 스터디 25일차 Evaluate Division (0) | 2024.08.16 |
---|---|
99클럽 코테 스터디 24일차 대충 만든 자판 [작성중] (0) | 2024.08.14 |
99클럽 코테 스터디 22일차 멀리 뛰기 (0) | 2024.08.12 |
99클럽 코테 스터디 21일차 피보나치 수 (0) | 2024.08.12 |
99클럽 코테 스터디 20일차 큰 수 만들기 (0) | 2024.08.11 |