본문 바로가기

Algorithms/PS

[PS] 백준 #21968. 선린의 터를

문제 정보

 

문제

드높은 남산 위에 우뚝 선

(중략)

세워라 반석 위에

선린의 터를

1899년, 여러분들은 대한제국 고종 황제의 칙령을 받아 한국 최초의 실업교육기관인 관립상공학교를 세울 터를 선택해야 한다.

대한제국에서 학교를 지을만한 터는 여러 개 있는데, 각 터는 서로 다른 자연수를 번호로 갖고 있다. 특히, 선린의 터의 번호는 꼴의 자연수가 최대 한 번씩 더해진 자연수이다(단, ). 즉, 선린의 터의 번호는  등이 있다.

여러분은 번째로 작은 선린의 터를 탐색하라는 명령을 받았다. 번째 선린의 터를 구하는 프로그램을 작성하자.

 

나의 풀이

이 문제는 이진수, 삼진수를 변환하는 문제라서 알고리즘 자체는 간단했다. 먼저 입력값을 2진수로 변환하여 벡터에 저장하고, 그 벡터의 정보를 가지고 3진수 값을 만들어냈다. 근데 계속 123456789123을 입력했을 때 값이 이상하게 나왔다. 처음에는 int로 풀어서 안됐지만 long long 자료형으로 바꿔도 계속 다른 값이 나왔다. 한참을 고민해보다가 pow 함수를 일일이 tp 에 3을 거듭 곱하는 형식으로 바꾸니 코드가 통과했다. pow 함수는 double 타입을 리턴하는데 이 타입은 최대 $10^{15}$ 단위까지 나타낼 수 있다. 근데 우리가 출력하려는 값은 $10^{17}$ 단위이기 때문에 값에 오류가 생긴 것 같다.

#include <bits/stdc++.h>

using namespace std;

vector<int> vec;

int main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	long long t, n; cin >> t;
	while (t--) {
		cin >> n;
		vec.clear();

		// 1. n을 이진수로 변환
		while (n > 0) {
			vec.push_back(n % 2);
			n = (long long) (n / 2.0);
		}

		// 2. 삼진수로 다시 변환
		long long l = 0;
		for (int i = 0; i < vec.size(); i++) {
			long long tp = 1;
			if (vec[i] == 1) {
				for (int j = 0; j < i; j++) tp *= 3;
				l += tp;
			}
		}
		cout << l << endl;
	}
}

'Algorithms > PS' 카테고리의 다른 글

[PS] 백준 #2012. 등수 매기기  (0) 2022.01.31
[PS] 백준 #21313. 문어  (0) 2022.01.31
[PS] 백준 #21966. (중략)  (0) 2022.01.27
[PS] 백준 #1708. 볼록 껍질  (0) 2022.01.17
[PS] 백준 #14502. 연구소  (0) 2022.01.17