프로그래머스 - 124 나라의 숫자(C++)

woga·2020년 8월 18일
0

프로그래머스

목록 보기
5/21
post-thumbnail

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/12899

문제 난이도

Lv 2


문제 접근법

규칙을 찾으면 된다.

대충 이런 규칙을 찾을 수 있게 된다. 3개씩 분류한 이유는 숫자가 1,2,4 3개이기 때문에 숫자 3개가 끝나면 일의 자리 숫자가 다시 1로 돌아오기 때문이다. 이런 특이점에서 숫자 n을 3으로 나누어서 어떻게 하는 규칙이 있겠구나!를 알아차릴 수 있다.

우측에 써놓은 회색 숫자는 이미 10진법을 3으로 나눈 몫이고 몫에서 또 몫과 나머지로 이어지게 된다. 이렇게 계속 하다보면 몫으로 나온 1,2,0은 일의자리 숫자와 관계 있다고 추리할 수 있다.

주의할 점
3마다 나뉘었지만 그 나눌 타이밍에 3으로 나누어 떨어지는 값 처리를 해줘야한다.
몫이 1이 나오기 때문에 3 -> 4로 나오지 않고 3->14로 나오기 때문이다.
그래서 3으로 나누고 3으로 나누어 떨어진 n만 n--; 처리를 해줬다.


통과 코드

#include <string>
#include <vector>

using namespace std;


string return124Num(int n) {
	string res = "";
	while (n > 0) {
		int idx = n % 3;
		n /= 3;
		if (idx == 0) {
            res = "4" + res;
            n--;
        }else{
            res = to_string(idx) + res;
        }
	}
	return res;
}

string solution(int n) {
	string answer = "";
	answer = return124Num(n);
	return answer;
}

피드백

처음에는 아래와 같이 짰다.

int num[3] = { 4,1,2 };

int return124Num(int n) {
	int res = 0;
	while (n > 0) {
		int idx = n % 3;
		res = (res * 10) + num[idx];
		n /= 3;
		if (idx == 0) n--;
	}
	return res;
}

string solution(int n) {
	string answer = "";
	int res = return124Num(n);
	answer = to_string(res);
	reverse(answer.begin(), answer.end());
	return answer;
}

그러나 정확성 테케 12,13,14 에서 틀리고 효율성 테스트에서 0점이 나왔다. 아마 int로 받고 string으로 변환하는데 여기서 또 다시 reverse 하는 과정에서 오류가 생기거나 시간 초과가 나는 거 같다고 추측했다.
하지만 string으로 받자고 생각하니 res += var; 만을 생각한 난 아무리 생각해도 push_back이 됐다. 다른 분의 코드를 참고해서 res = var + res;로 해도 된다는 걸ㅋㅋ 깨달았고.. 멍청이 됐다.. 그리고 if else로 나누어 var을 지정해서 넣었다. 이것도 char num[3] = {'4','1','2'} 해서 풀어도 될듯하다.

profile
와니와니와니와니 당근당근

0개의 댓글