이번 문제는 정수 범위 (1 ≤ N ≤ 100,000,000,000,000)의 자연수를 받아서 이진수로 만드는 문제였다.
이진수로의 변환은 long long 타입의 정수 n을 받아서 계속해서 2로 나누어 주며 이때의 나머지를 n을 2로 나누었을 때의 몫이 0이 될 때 까지 순서대로 쭉 저장 시켜주고 마지막에 저장한 수 부터 거꾸로 출력 시키면 된다.
이 문제를 보고 100조개의 정수를 이진수로 바꾸면 대체 얼마나 많은 정수 범위가 필요하지? 얼마나 많은 범위가 필요한거지? 이런 바보 같은 고민을 하면서, 배열을 사용할 생각을 안하고 이런식으로 long long을 활용한 코드를 짰다.
오답 코드
#include <stdio.h>
long long Z (long long n){ // long long 타입 n을 받아서 10의 n제곱의 수를 반환
long long temp = 1;
if(n == 0){
return 1;
}else{
for(int i = 0; i < n; i++){
temp = 10 * temp;
}
return temp;
}
}
int main() {
long long n = 0, result = 0;
scanf("%lld", &n);
long i;
for(i = 0; n / 2 != 0; i++){
result += (n%2) * (Z(i));
n = n/2;
}
result += n * (Z(i));
printf("%lld", result);
return 0;
}
이런식으로 말이다. 이렇게 짜면 범위 안에서는 되긴 하지만, 우리가 원하는 100조단위의 자연수를 받아 이걸 또 이진수로 표현하려면 더 많은 범위가 필요할테니 이렇게 짠 코드는 무조건 overflow가 날 것이다.
그렇기에 난 생각을 했다. 처음엔 '문자열로 받아서 하면 되지 않나? '라고 생각을 했지만 또 다시 '이러면 대체 얼마나 많은 양을 할당해야하는거지?' 라는 바보같은 생각에 빠졌다.
그러던 중 배열은 한 공간당 하나의 숫자를 저장하고,
'배열의 크기가 100이면 100개의 숫자를 저장, 즉 1 * 10^100 만큼의 범위를 가진다.'는것을 깨달았다. 만약 100만의 숫자를 저장하려면 배열로는 7칸의 공간만 있어도 충분히 표현할 수 있을것이다. 이 생각을 하고 난 뒤 왜 바보같이 숫자 크기만큼의 배열을 선언해야 한다고 생각했는지 자책했다. 그래도 이제라도 깨달아서 다행이야..😁
그래서 완성한 코드는 다음과 같다.
[백준] 10829 - C언어
#include <stdio.h>
int main() {
long long n = 0;
int result[101] = {0}; // 배열이 100개 있으면 1 * 10^100의 수가 있는것이다.
// 1xxx,xxx,xxx...이렇게 표현할 수 있으므로, 예를 들어백만이라는 수를 표현할라면 배열로는 7칸이면 충분하다.
scanf("%lld", &n);
int i;
for(i = 0; n / 2 != 0; i++){
result[i] = (n % 2);
n = n/2;
}
result[i] = n;
for(int j = i; j >= 0; j--){
printf("%d", result[j]);
}
return 0;
}
완성!!
이번 문제는 다른 구현은 그래도 할만 했는데, 숫자의 범위에 대한 것 때문에 틀에 박힌 생각을 해버려 많이 막혔던 문제였던 것 같다.
https://www.acmicpc.net/problem/10829
10829번: 이진수 변환
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 100,000,000,000,000)
www.acmicpc.net
'프로그래밍 > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 10828(스택) - Python(파이썬) - 2 (feat. 파이썬 빠른 입출력, SYS) (0) | 2023.07.24 |
---|---|
[백준] 10828(스택) - Python(파이썬) - 1 (feat. split() 사용법) (0) | 2023.07.17 |
[백준] 24416(피보나치 수 1) - C언어 (0) | 2023.07.16 |
[백준] 14915(진수 변환기) - C언어 (0) | 2023.05.07 |