문제 링크
https://www.acmicpc.net/problem/2577
정답 코드는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
|
A = int(input())
B = int(input())
C = int(input())
T = A * B * C
hist = [0] * 10
while T != 0:
hist[T % 10] += 1
T //= 10
for item in hist:
print(item)
|
cs |
프로그래밍 언어를 맨 처음 배울 때, 기초적인 문법에 대하여 학습한 다음에 과제로 가장 빈번하게 나오는 유형이라고 할 수 있습니다.
각 자릿수에 적혀있는 숫자를 뽑아내는 것이 핵심이며, 간단한 수학 지식을 필요로 합니다.
이번 글에서는 간단한 수학 지식을 간단하게 알아보도록 하겠습니다.
작은 경우부터 시작해서 점점 큰 경우를 생각해보도록 하겠습니다.
한 자릿수가 있고 각 숫자가 몇 개 있는지 확인해보겠습니다.
예를 들어 "3" 이라는 숫자가 있다고 해보겠습니다. 그럼 3이 1개 있는 것이죠.
한 자릿수는 그냥 그 숫자가 1개 있는 것으로 끝인 겁니다.
두 자릿수가 있고 각 숫자가 몇 개 있는지 확인해보겠습니다.
예를 들어 "45" 라는 숫자가 있다고 해보겠습니다. 그럼 4가 1개, 5가 1개 있는 것입니다.
여기서 4와 5는 어떻게 분리할 수 있었나요? 힌트는 숫자 10 입니다.
그냥 "일의 자리에 5가 적혀있으니까 5라고 찾았다" , "십의 자리에 4가 적혀있으니까 4라고 찾았다" 라고 할 수 있습니다.
맞는 말입니다. 그런데 제가 말하는 건 일의 자릿수에 적혀 있는 수를 그리고 십의 자릿수에 적혀 있는 수를 원래 수로부터 어떻게 분리해 내었냐는 것입니다.
좀 더 정확하게는 수학적인 등식으로 나타내보면 어떻겠냐는 것입니다.
다시 말하지만 힌트는 숫자 10 입니다.
(생각해봅시다)
"곰곰이" 생각해보면 10으로 나누었을 때 나머지가 5 인 것을 발견할 수 있습니다.
그럼 4는 어떻게 얻을 수 있을까요?
45 에서 5를 빼고, 이걸 10으로 나누면 얻을 수 있는 것을 알 수 있습니다.
두 자릿수는 그럼 정리가 되었네요.
이번에는 세 자릿수가 있고, 각 숫자가 몇 개 있는지 확인해보겠습니다.
예를 들어 "691" 이라는 숫자를 생각해보겠습니다. 그럼 6이 1개, 9가 1개, 1이 1개 있는 것입니다.
1을 분리해내는 것은 이미 위에서 했던 것과 같기 때문에 금방 하실 수 있을 겁니다.
691 % 10 = 1 이렇게 1을 얻었습니다.
그럼 9는 어떻게 얻을 수 있을까요?
위에서 했던거랑 똑같이 해보겠습니다. (추출한 일의 자리 수로 빼고, 10으로 나누기)
(691 - 1) / 10 = 69
9만 빼내고 싶었는데, 69가 되어버렸네요.
69에서 9만 분리해내려면 어떻게 해야 할까요?
이거 아까 45 에서 5를 분리해 내는 문제와 동일하다는 것을 알 수 있습니다.
마찬가지로 69에서 6을 분리하는 것은 45 에서 4를 분리하는 문제랑 동일한 것을 알 수 있습니다.
결국 세 자릿수 문제를 푸는 것은 일의 자릿수를 추출하고 나서, 원래 수에서 추출한 일의 자릿수를 빼고,
10으로 나눈 숫자(여기 예시에서는 69) 에 대해서 두 자릿수 문제를 풀면 되는 것입니다.
이런 방식으로 생각하면 네 자릿수, 다섯 자릿수 ... n 자릿수의 경우도 모두 같은 방식으로 해결할 수 있음을 알 수 있습니다.
코드를 분석하기에 앞서 간단한 내용 하나만 짚고 넘어가겠습니다.
프로그래밍 언어에는 일반 수학과는 다르게 몫만 구하는 연산이 있습니다.
(따라서 10으로 나누기 전에 굳이 추출한 일의 자릿수를 빼 줄 필요가 없습니다)
언어마다 다르지만 python3 에서는 // 연산자가 바로 그것입니다.
자 그럼 이제 코드를 분석해보겠습니다.
T 라는 변수가 몇 자리 숫자인지는 모르겠지만, 아무튼 일의 자리수에 적혀 있는 값은 분명히 T % 10 입니다.
그럼 그 값이 1개 있다고 할 수 있겠죠?
따라서 hist[T%10] 의 값을 1 증가시키는 것입니다.
그리고 이제 일의 자리 숫자에는 관심이 없기 때문에(이미 갯수를 세었기 때문에) 십의 자리 숫자가 마치 일의 자리 숫자인 것처럼 T의 값을 변경합니다. (T //= 10)
만일 처음에 T 가 3이었다면 T 는 0이 되었겠죠. 그럼 더 이상 while loop 를 실행하지 않고 종료하게 됩니다.
만일 처음에 T 가 45 였다면, T 는 4가 되었습니다. 이 다음부터는 마치 T 가 처음부터 한 자릿수 이었던 것 처럼 동일하게 동작할 것입니다.
만일 처음에 T 가 691 이었다면, T 는 69가 되었습니다. 이 다음부터는 마치 T 가 처음부터 두 자릿수 이었던 것처럼 동일하게 동작할 것입니다.
네 자릿수, 다섯 자릿수 숫자에 대해서도 문제 없이 동작할 것을 예상할 수 있습니다.
상당히 자주 질문하는 문제라서, 자세히 설명해보았습니다.
풀이는 아래 영상 참고 바랍니다.
https://www.youtube.com/watch?v=WEvNfTI4Vfc
저작권 라이선스: CC BY (출처만 표시하면 자유롭게 이용 가능)
'백준(BOJ) 문제 풀이' 카테고리의 다른 글
백준 2739번 문제(구구단) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.04 |
---|---|
백준 2675번 문제(문자열 반복) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.03 |
백준 2562번 문제(최댓값) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.03 |
백준 2557번 문제(Hello World) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.03 |
백준 2475번 문제(검증수) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.03 |