-
[프로그래머스 5단계] 알고리즘 41. 124 나라의 숫자24년 11월 이전/레거시-알고리즘(3) 2018. 5. 24. 13:11반응형
문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)
알고리즘 41. 124 나라의 숫자
1,2,4 세 개의 숫자만 쓰는 124나라가 있습니다. 124나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
- 10진법의 1 → 1
- 10진법의 2 → 2
- 10진법의 3 → 4
- 10진법의 4 → 11
- 10진법의 5 → 12
- 10진법의 6 → 14
- 10진법의 7 → 21
10진법의 수 N이 입력될 때, 124나라에서 쓰는 숫자로 변환하여 반환해주는 change124 함수를 완성해 보세요. 예를 들어 N = 10이면 “41”를 반환해주면 됩니다. 리턴 타입은 문자열입니다.
class OneTwoFour {public String change124(int n) {String answer = "0";return answer;}// 아래는 테스트로 출력해 보기 위한 코드입니다.public static void main(String[] args) {OneTwoFour oneTwoFour = new OneTwoFour();System.out.println(oneTwoFour.change124(10));}}풀이:
이 문제는 생각보다 난해했다. 처음에는 3진수로 바꾸어서 또 바꿔주면 되겠다 싶었는데... 미묘하게 숫자가 맞지 않았다. 이 문제의 핵심은 3진수로 만들되 3으로 나누어 떨어졌을 때 몫을 1을 빼주어야 한다는 것이다. 나의 알고리즘은 다음과 같다.
- n을 3으로 나눈다.
- 몫은 n에 나머지는 리스트 첫 자리에 저장한다. -> 끝자리부터 구하는 것을 의미한다.
- 만약 나머지가 0이라면 몫에서 1을 뺴주어야 한다.
- 얻은 리스트를 문자열로 바꾼다.
- 다만 리스트에서 0 일때는 "4"로 나머지는 그 숫자에 해당하는 문자열로 바꿔준다.
다음은 나의 코드이다.
public String change124(int n) {String answer;List<Integer> list = new ArrayList<>();//끝자리부터 구하는 것이기 때문에 원소를 추가해야 할 때는 앞에서 추가해야 한다.while(n > 0){int a = n % 3;n /= 3;//3으로 나누어 떨어질 때는 몫에서 1을 뺴주어야 한다.if (a == 0){n-=1;}list.add(0, a);}//이제 얻은 리스트를 문자열로 바꾼다. 다만 0일 때는 4로 바꿔주어야 한다.answer = list.stream().map(i -> (i == 0) ? "4" : i.toString()).reduce("", (a,b) -> a+b);return answer;}막상 코드를 보면 어렵지 않다. 다만 몫에서 1을 빼주는 것을 생각하기가 힘들었다. 부끄럽게도 이 문제를 풀지 못하고 다른 사람의 코드와 풀이를 보고 내 입맛에 맞춰 바꾼 코드이다. 5단계 들어서 거의 내 힘으로 풀기가 버거워지고 있다. 점점... 아무튼 5단계 역시 클리어! 이제 6단계 문제를 풀어보자!
728x90'레거시 > 레거시-알고리즘(3)' 카테고리의 다른 글
[프로그래머스 3단계] 알고리즘 43. 거스름돈 (13) 2018.05.31 [프로그래머스 5단계] 알고리즘 40. 줄 서는 방법 (0) 2018.05.23 [프로그래머스 5단계] 알고리즘 39. 2 x n 타일링 (0) 2018.05.17 [프로그래머스 5단계]알고리즘 38. 하노이 탑 (0) 2018.05.15 [프로그래머스 4단계] 알고리즘 37. 땅따먹기 게임 (0) 2018.05.11