문제 설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution함수를 완성해주세요.
제한사항
- n은 500,000,000이하의 자연수입니다.
1 | 1 | 11 | 42 |
2 | 2 | 12 | 44 |
3 | 4 | 13 | 111 |
4 | 11 | 14 | 112 |
5 | 12 | 15 | 114 |
6 | 14 | 16 | 121 |
7 | 21 | 17 | 122 |
8 | 22 | 18 | 124 |
9 | 24 | 19 | 141 |
10 | 41 | 20 | 142 |
1~20까지 입출력 예이다.
이런 문제는 이렇게 대입해서 결과를 도출해보면 규칙이 보이기 시작한다.
●규칙 1
- 3으로 나눈 나머지에 규칙이 있다.
- 나머지가 1이면 1, 나머지가 2이면 2, 나머지가 0이면 4이다.
●규칙 2
- n이 3보다 크다면 n을 n/3으로 바꿔서 다시 나눠준다.
- 예를 들어 4를 3으로 나눈다. 그러면 나머지가 1이므로 answer에다가 1을 추가해준다.
- 4를 3으로 나눈 몫을 다시 3으로 나눈다. 그러면 1%3이므로 1이다. 따라서 answer에다가 1을 추가해준다.
- 역순으로 추가해줬기 때문에 문자열을 뒤집어준다.
이렇게 하니까 3의 배수일 때 한 칸씩 늘어나서 문제가 생겼다.
ex) 6%3 =0 -> 4 추가 , 6/3=2 ->2 추가
내가 설계한 규칙대로라면 6은 24가 출력돼야 한다. 하지만 입출력예로 6은 14가 되야한다.
생각을 해보니 11,12,14 이렇게 3개씩 하고 범위를 벗어나야 하는데 만약 n이 3의 배수이면 바로 범위를 벗어나기 때문에 3의 배수일 때는 n을 (n/3)-1로 초기화해주니까 문제가 풀렸다.
정리
- 3으로 나눈 나머지에 따라 1,2,4를 넣어준다
- 만약 n이 3보다 클 경우 n을 3으로 나눈 나머지에 따라 answer에 추가해주고 그다음 n을 설정해준다
- n을 설정해주는 방식은 2가지이다.
- n이 3의 배수라면 n=(n/3)-1이다
- n이 3의 배수가 아니라면 n=n/3이다.
- n을 설정해주는 방식은 2가지이다.
코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string solution(int n);
int main()
{
int n;
cin >> n;
cout<<solution(n);
}
string solution(int n)
{
string answer;
string result;
string s = "412";
if (n <= 3)
{
answer = s[n % 3];
return answer;
}
while (n!=0)
{
int r;
r = n % 3;
//나머지가 1이면 1, 나머지가 2이면 2, 나머지가 0이면 4
answer += s[r];
if (n % 3 == 0)
n = (n / 3)-1;
else
n = n / 3;
}
reverse(answer.begin(), answer.end());
return answer;
}
느낀 점 : c++ 에는 다양한 기능이 있다는 것을 깨달았다. 문자열을 뒤집어서 넣는 게 있을 거라고 생각했는 데 있어서 편리하게 짤 수 있었다. 더 많은 기능을 숙지하고 있는 게 나중에도 유리할 것 같았다.
reverse(answer.begin(),answer.end()); //answer를 뒤집어줌.
'CodingTest > Programmers' 카테고리의 다른 글
프로그래머스[programmers] - 가장 큰 수 찾기(C++)[LV2] (0) | 2022.05.27 |
---|---|
프로그래머스[programmers] - 행렬 테두리 회전하기(C++)[LV2] (0) | 2022.05.26 |
프로그래머스[programmers] - 거리두기 확인하기(C++)[LV2] (0) | 2022.05.25 |
프로그래머스[programmers] - 오픈채팅방(C++)[LV2] (0) | 2022.05.16 |
프로그래머스[Programmers] - 메뉴 리뉴얼(C++)[LV2] (0) | 2022.05.11 |