[백준] 6679번 싱기한 네자리 숫자

반응형
반응형

문제

싱기한 네자리 숫자란, [1000,9999]인 10진수 숫자중에서,  다음의 조건을 만족하는 숫자를 말한다.

  • 숫자를 10진수, 12진수, 16진수로 나타낸 다음, 각각의 숫자에 대해, 각 숫자의 자리수를 더했을 때, 세 값이 모두 같아야 한다.

여러분은 싱기한 네자리 숫자를 모두 출력해야 한다.

입력

입력은 주어지지 않는다.

출력

싱기한 네자리 숫자를 오름차순으로 한줄에 하나씩 출력한다.

 

브론즈... 문제 오랜만에 푸는것 같다. 요즘들어 문제가 잘 안 풀려서 브론즈 문제를 풀었다.

원래 재귀로 풀려고 했는데 재귀로 풀게 되면 메소드에 계속 접근하기 때문에 내 의도와 다르게 답이 나올거라 생각했다. 그게 아니라면 메소드를 3개 써야 되는건데... 그럴빠야 차라리 1개 쓰고, 재귀로 풀지 않는편이 낫다고 생각이 들었다.

 

#include <bits/stdc++.h>
using namespace std;

int solve(int num, int index) {
  int r = 0;
  while (num > 0) {
    r += (num%index);
    num/=index;
  }

  return r;
}

int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);
  
  for(int i = 1000;i<=9999;i++) {
    if (solve(i,10) == solve(i,12) && 
        solve(i,10) == solve(i,16) &&
        solve(i,12) == solve(i,16)) {
          cout << i << "\n";
      }
  }
} 

이 문제는 예제 출력이 함정이다. 출력처럼 나올리는 없다. 왜냐하면 실제로는 더 길기 때문이다. 이것때문에 솔직히 당황스러웠다. 

메소드는 while문을 사용해서 풀었다. 

메소드를 사용하니 코드가 더 간결해졌다.

 

각 자리수에 대한 합을 구한뒤  for문으로 9999까지 돌렸다.

그리고 결과값을 도출했다.

 

#include <stdio.h>
int val10, val12, val16;
int main(void) {
	for (int i = 2992; i <= 9999; i++) {
		val10 = val12 = val16 = 0;
		int N = i;
		while (N > 0) {
			val10 += N % 10;
			N /= 10;
		}
		N = i;
		while (N > 0) {
			val12 += N % 12;
			N /= 12;
		}
		N = i;
		while (N > 0) {
			val16 += N % 16;
			N /= 16;
		}
		if (val10 == val12 && val12 == val16)
			printf("%d\n", i);
	}
}

메소드 없이 풀어도 간단하기는 마찬가지인것 같다.

 

반응형

댓글

Designed by JB FACTORY