[백준] 6679번 싱기한 네자리 숫자
- 알고리즘/백준
- 2020. 5. 19. 10:23
반응형
반응형
문제
싱기한 네자리 숫자란, [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);
}
}
메소드 없이 풀어도 간단하기는 마찬가지인것 같다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1331번 나이트 투어 & 2251번 물통 (0) | 2020.05.24 |
---|---|
[백준] 10987번 모음의 개수 (0) | 2020.05.22 |
[백준] 16197번 두 동전 (0) | 2020.05.17 |
[백준] 16922번 로마 숫자 만들기 (0) | 2020.05.16 |
[백준] 14226번 이모티콘 (0) | 2020.05.15 |