#문제
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 |
'Algorithm > Brute-force' 카테고리의 다른 글
[Python] 백준 2231번 : 분해합 (B2) - 브루트포스단계별2 (0) | 2021.01.28 |
---|---|
[Python] 백준 2798번 : 블랙잭 (B2) - 브루트포스단계별1 (0) | 2021.01.28 |
[C++] 백준 4641번 : Doubles (B1) (0) | 2020.07.15 |
[C++] 백준 1065번 : 한수 (S4) (0) | 2020.07.15 |
[C++] 백준 7568번 : 덩치 (S5) (0) | 2020.07.15 |