[프로그래머스] 124 나라의 숫자
드디어 Level 2문제 하나를 더 풀었습니다. 레벨 2 중에서 그나마 쉬운 걸로 골라 풀어보긴 했는데요.
이번 문제는 진짜 풀다가 너무 화가 났고😠 답을 보고 어이없었던😓 그런 문제입니다.
이번 문제의 교훈
콘솔 창은 미리 없애고 제출 후 채점하기 하자
제가 답은 맞는데 이 콘솔 창 때문에 효율성 테스트에서 0점을 받아서 코드 삽질을 몇 시간 동안 했거든요😭
지금 생각해도 너무 화가 나네요.😠
담부터는 무조건 콘솔 창 주석 처리하고 제출 후 채점하기를 해야겠습니다!!
저는 여기서 n=42 result="1114"을 테스트 케이스 추가하기를 했습니다.
해결방안을 살펴보기 전 어떻게 풀었는지에 대해 설명을 하자면
이 문제를 딱 봤을때 이것도 전에 풀었던 "n^2 배열 자르기"와 마찬가지로 나눈 값과 나머지 값으로 구하면 되겠다 생각이 들었습니다.
124 나라의 숫자 문제를 보면 이문제도 1 2 4의 반복이라서 n/3, n%3을 하면 풀릴 것 같았거든요.
그래서 이번에도 쭉 써봤습니다.
a = Math.floor(n/3)
b = n%3
n=1 a=0 b=1 return =1
n=2 a=0 b=2 return =2
n=3 a=1 b=0 return =4
n=4 a=1 b=1 return =11
n=5 a=1 b=2 return =12
n=6 a=2 b=0 return =14
이걸 보시면 3씩 반복을 하고
나머지값(b)이 무엇인가에 따라 return값의 마지막 자리를 결정해준다는 것을 알 수 있습니다.
b=0일 때는 4로 고치면 되고요.
계속 3씩 반복을 하니까 나눈 값(a)에다가 나눈 값(a) / 3, 나눈 값(a) % 3을 해보면 해결방안이 나오지 않을까?
그래서 또해보았습니다.
a2 = Math.floor(a/3)
b2 = a%3
n=1 a=0 b=1 -> a2 = 0 b2=0 -> b2 b -> 0 1 (return =1)
n=2 a=0 b=2 -> a2 = 0 b2=0 -> b2 b -> 0 2 (return =2)
n=3 a=1 b=0 -> a2 = 0 b2=1 -> b2 b -> 1 4 (return =4)
n=4 a=1 b=1 -> a2 = 0 b2=1 -> b2 b -> 1 1 (return =11)
n=5 a=1 b=2 -> a2 = 0 b2=1 -> b2 b -> 1 2 (return =12)
n=6 a=2 b=0 -> a2 = 0 b2=2 -> b2 b -> 2 4 (return =14)
이렇게 쓰다 보면 3의 배수 자리마다 원하는 값이 나오지 않는다는 걸 알게 됩니다.
1, 2, 3 마다 a의 값이 같으면 계산하기 편할 것 같은 느낌이 들어서
3에 배수마다 즉 나머지 값(b)의 값이 0이면 a-1을 해주었습니다.
a2 = Math.floor(a/3)
b2 = a%3
n=1 a=0 b=1 -> a2 = 0 b2=0 -> b2 b -> 0 1 (return =1)
n=2 a=0 b=2 -> a2 = 0 b2=0 -> b2 b -> 0 2 (return =2)
n=3 a=1-1=0 b=0 -> a2 = 0 b2=0 -> b2 b -> 0 4 (return =4)
n=4 a=1 b=1 -> a2 = 0 b2=1 -> b2 b -> 1 1 (return =11)
n=5 a=1 b=2 -> a2 = 0 b2=1 -> b2 b -> 1 2 (return =12)
n=6 a=2-1=1 b=0 -> a2 = 0 b2=1 -> b2 b -> 1 4 (return =14)
이제 이걸 보시면 나눈 값(a), a2, a3... 값이 0이 될 때까지 나머지 값(b), b1, b2... 를 구해서 붙여주면 될 것 같습니다.
그래서 a를 구할 필요 없이 n = Math.floor(n / 3)을 반복해서 n이 0이 될 때까지 구하면 됩니다.
마지막 예시로 n=42이면 return = "1114"에 대해 구해보겠습니다.
n이 0이 될 때까지 반복
n=42
b = n%3 = 42%3 = 0 -> 0은 4로 교체 b=4
n = Math.floor(n / 3) = Math.floor(42 / 3) = 14 -> b가 0 임으로 n=13
return = 4
n=13
b = n%3 = 13%3 = 1
n = Math.floor(n / 3) = Math.floor(13 / 3) = 4 -> n=4
return = 14
n=4
b = n%3 = 4%3 = 1
n = Math.floor(n / 3) = Math.floor(4 / 3) = 1 -> n=1
return = 114
n=1
b = n%3 = 1%3 = 1
n = Math.floor(n / 3) = Math.floor(1 / 3) = 0 -> n=0
return = 1114
이렇게 구하면 됩니다. 이걸 코드로 작성해보았습니다.
해결방안
function solution(n) {
var answer = '';
let arr = [4, 1, 2]
while (n > 0){
let b = n%3;
b===0 ? n = Math.floor((n-1) / 3) : n = Math.floor(n / 3);
answer = arr[b]+answer;
}
return answer;
}
let arr = [4, 1, 2]
나머지 값을 구할 때 0, 1, 2 값만 나옵니다.
그래서 애초부터 arr = [4, 1, 2]을 만들면 나머지 값이 0일 때
- arr[0] = 4
- arr[1] = 1
- arr[2] = 2
사용하기 편해서 만들었습니다.
while (n > 0)
위에서 설명했듯이 n이 0일 때까지 반복하면 된다고 했습니다.
n===0일 때까지 반복하기를 코드로 쓴다면 for문보다는 while문이 더 좋은 선택이라 생각했습니다.
while문은 조건이 false가 될 때까지 반복함으로
조건에 n>0으로 설정해주었습니다.
let b = n%3;
여기서 n%3의 값은 1, 2, 4중 무엇인지 결정해주는 값입니다.
나중에 answer값에 값을 넣어주기 위한 식입니다.
b===0 ? n = Math.floor((n-1) / 3) : n = Math.floor(n / 3);
위에 설명에서 b의 값이 0이면 n-1을 해주어야 된다고 했습니다.
그래서 삼항 연산자를 사용해주어
b가 0이면 n-1 한 상태로 나누기 3을 해주었고
아닐 경우에는 n나누기 3을 해주었습니다.
answer = arr[b]+answer;
이제 앞에서 구한 b의 값으로 124 나라의 숫자에 알맞게 만들어 주어야 되는데요.
b의 값을 계속 이어 붙여주면 됩니다.
answer = arr[b]+answer; 해주면
bn ......b3 + b2 + b1 이런 식으로 b의 값이 이어 붙여집니다.
여기서 arr[b]을 해주어서 b의 값에 따라 알맞은 값을 나오게 해 주었습니다.
여기까지 프로그래머스 124 나라의 숫자 해결방안에 대해 설명해보았습니다.