일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 캡슐화
- azure
- dotenv
- PostgreSQL
- npm
- github
- MariaDB
- DP
- netlify
- 동적계획법
- 상속
- 디자인 패턴
- 서브셋폰트
- 추상화
- package
- git
- 메모이제이션
- CSS
- GOF
- Secret
- AOP
- 클라우드
- bfs
- 다형성
- Java
- 객체지향
- mock
- dfs
- Solid
- process.env
- Today
- Total
이것저것 해보기🌼
[프로그래머스] 124 나라의 숫자 본문
유형 : 수학
문제)
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
제한사항
- n은 500,000,000이하의 자연수 입니다.
풀이)
기본적인 n진법 변환 구조와 같게 풀면 된다.
나는 혼자서 고민하다가 도저히 안되서 자료를 조금 찾아보았는데,
포인트는 3으로 나누어지는 수와 3으로 나누어지지 않는 수가 약간의 차이가 있다는 것이다.
예를 들어 6의 경우
6 % 3 = 0 -> 4
6 / 3 = 2 -> 2-1 = 1
이지만 실제로는 0대신 4를 쓰고 몫에서 1을 빼주어야 정확한 결과 14가 나오게 된다.
n이 18인 경우
18 % 3 = 0 -> 4
18 / 3 = 6 -> 6-1 = 5 가 3보다 크므로 한번더 나누기
5 % 3 = 2 -> 2
5 / 3 = 1 -> 1
124 가 된다.
3으로 나누어지지 않는 경우에는 3진법 변환을 그대로 수행하면서,
1 -> 1, 2 ->2, 3-> 4로 결과를 바꾸어주기만 하면 된다.
n이 7인 경우
7 % 3 = 1 -> 1
7 / 3 = 2 -> 2
12가 된다.
n이 10인 경우
10 % 3 = 1 -> 1
10 / 3 = 3 -> 4
14가 된다.
n이 14인 경우
14 % 3 = 2 -> 2
14 / 3 = 4 (3보다 크므로 한번 더 나누기)
4 % 3 = 1 -> 1
4 / 3 = 1 -> 1
112가 된다.
가장 짧고 효율적으로 구현된 코드는 아래와 같다.
이외에 너무 많은 비교를 하게되면 효율성테스트에서 떨어지는 경우도 있었다.
class Solution {
public String solution(int n) {
String[] num = {"4","1","2"};
String answer = "";
while(n > 0){
answer = num[n % 3] + answer;
n = (n - 1) / 3;
}
return answer;
}
}
기본적인 n진법 변환 코드도 참고로 알아둔다.
int num = 48;
String answer = "";
while(num > 0){
answer=(answer%7)+answer;
num/=7;
}
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 카카오프렌즈 컬러링북 (0) | 2021.06.29 |
---|---|
[leetcode] 12. Integer to Roman (0) | 2021.06.27 |
[백준 온라인 저지] 2667번: 단지번호붙이기 (0) | 2021.06.27 |
[프로그래머스] 메뉴 리뉴얼 (0) | 2021.06.26 |
[프로그래머스] 오픈채팅방 (0) | 2021.06.25 |