본문 바로가기

Algorithm/Brute-force

[C++] 백준 2798번 : 거꾸로 구구단 (B2)

#문제

https://www.acmicpc.net/problem/13410

13410번: 거꾸로 구구단

일반적인 구구단에서 가장 큰 수는 마지막 항의 값이 제일 크다. 거꾸로 구구단에서는, 각 항에 구구단의 계산 결과로 나온 값을 뒤집어 저장을 한다. 이렇게 하면 가장 큰 값이 항상 마지막이 ��

www.acmicpc.net

#풀이

처음에 풀이 방향을 잘못 잡아 매우 고생했던 문제이다. 문제 의도가 수를 직접 직접 뒤집어 대소비교를 하는 게 아니라, 수는 가만히 내버려 둔 상태에서 거꾸로 읽으며 대소 비교를 하게 하는 것이라고 생각했기 때문이다. 물론 이 방법으로도 문제를 해결할 수 있겠지만, 고려해야 할 점이 너무 많았다. 특히 자리에 0이 들어가 있는 경우에 대소비교 처리가 매우 힘들었다.

이번 문제를 통해 수를 뒤집어 저장하는 방법에 대해 학습할 수 있었다. 소스코드 15행의 for문내용과 같은 구성을 확실하게 익혀두자. 이는 수의 각 자리수에 접근하는 방법(10으로 나눈 나머지를 구한 뒤, 10으로 나누기)의 심화라고 할 수 있겠다.
그리고 어이없게 이번 문제에서 실수했던 부분이 머리로는 while논리를 생각하며 if를 적고 한참 헤맸다. 자주하는 실수들은 항상 명심하고 있자.

#소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
using namespace std;
 
int main(void)
{
    int arr[1001];
    int N, K;
    cin >> N >> K;
 
    for (int i = 1; i <= K; i++) {
        arr[i] = i * N;
    }//안 뒤집은 상태로 먼저 배열에 저장(index 1부터)
 
 
    for (int i = 1; i <= K; i++) {
        int num = arr[i];
        int sum = 0;//뒤집은 값을 저장할 변수
        int cnt = 1;//자리수 증가에 맞춰 10씩 증가시켜준다
        while (num / cnt != 0) {
            cnt *= 10;
        }
        cnt /= 10;//만약 세자리수라면 cnt는 100이 되도록
        while (arr[i] != 0) {
            sum += (arr[i] % 10)*cnt;
            arr[i] /= 10;
            cnt /= 10;
        }
        arr[i] = sum;
    }
 
    int max = arr[1];
    for (int i = 2; i <= K; i++) {
        if (arr[i] > max)
            max = arr[i];
    }
    cout << max;
 
    return 0;
}
cs