시나브로

[ 프로그래머스 ] 124 나라의 숫자 본문

알고리즘/프로그래머스

[ 프로그래머스 ] 124 나라의 숫자

혬혬 2020. 4. 4. 15:04
728x90

진짜 많은 고생을 한 문제이다. 

3진법으로 변환하는 것을 알았는데 진법 변화할 때 나오는 0이 문제였다. 

point1 . 진법 변환시 나오는 0,3을 4로 대처한다. 그 이유는 변화할 때, 나오는 숫자가 0,1,2 이기 때문에 0,3이 4를 의미한다. 

point2. 0을 4로 변경하면, 앞에 수를 하나 줄여야한다. 그 이유는 뺄셈을 할 때와 유사하다.

point3. 진법 변환시 나오는 3은 그 이상 진법번환을 진행하지 않고, 3을 4로 대처한다.

1. 나머지 값을 계산하여 box에 숫자를 입력한다. 이때 0을 4로 변경하였으면, 내림이 필요하기 때문에 signal 변수로 내림을 표시해준다.

2. n/3을 한다.

3. 이후, 1,2 과정을 반복하는데 내림이 표시되어있을 경우, 하나 단계 숫자를 줄일다. 여기서 줄여서 0이 된다면, 내림 표시를 해주는 것을 유의하자.

4. 위의 과정을 반복한 후, 3보다 작아지면, 숫자를 list에 넣고 break 해준다. 여기서는 0과 내림이 발생할 수 없으니 처리해 줄 필요 없다. 

5. list 변수에 거꾸로 답을 넣어둬서 for문을 이용해 정방향으로 바꾼다. 

#include <string>
#include <vector>

using namespace std;
string solution(int n) {
	string answer = "";
	int signal = 1;
	vector<char> list;
	while (1) {
		if (n <= 3) {

			if (n == 1) {
				if (signal != 0)
					list.push_back('1');
			}
			else if (n == 2) {
				if (signal == 0)
					list.push_back('1');
				else
					list.push_back('2');
			}
			else if (n== 3) {
				if (signal == 0)
					list.push_back('2');
				else
					list.push_back('4');
			}
			break;
		}

		int box = n % 3;
		if (box == 0) {
			if (signal == 0)
				box = 2;
			else
				box = 4;
			signal = 0;
		}
		else if (box == 1) {
			if (signal == 0) {
				box = 4;
				signal = 0;
			}
			else {
				box = 1;
				signal = 1;
			}
		}
		else if (box == 2) {
			if (signal == 0)
				box = 1;
			else
				box = 2;
			signal = 1;
		}
		n /= 3;
		if (box == 1) {
			list.push_back('1');
		}
		else if (box == 2) {
			list.push_back('2');
		}
		else if (box == 4) {
			list.push_back('4');
		}
	}

	for (int i = list.size()-1; i >= 0; i--) {
		answer += list[i];
	}

	return answer;
}

 

 

https://programmers.co.kr/learn/courses/30/lessons/12899

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

728x90
Comments