세개의 자연수 A, B, C가 주어질 때,
A × B × C를 계산한 결과에
0부터 9까지 각각의 숫자가 몇번씩 쓰였는가?
순서대로, 하나씩 차근차근 풀어보자.
어떤 사람이 필요한가?
문제의 예제를 분석하며 한번 우리가 직접 세보고, 어떠한 과정을 거쳤는지 생각해보자.
- A, B, C를 곱한 결과값을 계산한다. 그 결과로 17037300 이라는 숫자가 등장했다.
- 우리는 그 다음, 각 자릿수별로 어떠한 숫자가 있는지를 확인했다.
- 근데 총 10종류의 숫자가 각각 등장한 횟수를 머릿속에서 다 외우고 있긴 어렵기 때문에, 아래에 각 숫자가 몇번 등장했는지를 기록하며 풀었다.
최종 결과로 3 1 0 2 0 0 2 0 0 이라는 결과가 등장했다.
이때 재미있게 볼만한 정보는 다음과 같다.
- 기존 숫자의 17037300 이라는 정보에 대해, 숫자의 등장 순서는 상관 없어졌다!
- 하나의 자릿수 내 숫자를 파악하는데, 다른 자릿수의 정보는 필요가 없어졌다!
우리는 이렇게 각 자릿수 내 숫자의 정보만 파악하면 되고, 다른 정보는 필요가 없다는 걸 깨달았다.
그래서 자릿수 정보를 어떻게 파악하지?
이제 우리는 각 자릿수별로 어떠한 숫자가 있는지를 확인해야 하는데, 너무나 자연스럽게 사용하고 있는 추상적 정보라 이걸 컴퓨터에게 어떻게 명령해야 할지 접근하기 어려워진다.
우리가 사용하는 진법은 10진법이기에, 여기서 간단히 사용 가능한 수학적 테크닉을 설명하겠다.
10진법 내에서, 숫자 표현은 다음과 같이 10으로 나눈 나머지를 구하면, 1의 자릿수의 정보만 추출할 수 있다.
또한, 10으로 나눈 몫만 구하면, 기존에 있던 1의 자릿수의 정보가 날아가고, 나머지 자릿수들의 정보만 남길 수 있다.
계산한 건 좋은데, 그래서 이 값들을 어떻게 저장하지?
우리는 이렇게 ①번을 통해 5라는 정보를 획득했는데, 이 정보를 저장할 방법을 고민해봐야 한다.
가장 단순한 방법은 아래와 같을 것이다.
우리는 각각의 숫자들이 등장한 횟수를 알기 위해 다음과 같이 각 숫자의 등장 횟수를 저장할 방법을 생각해보게 됐다.
근데... 딱 봐도 귀찮을 것 같지 않은가? 만약 이 값들을 출력하려고 한다면...
위와 같이 출력을 해야 한다. 이런 방식으로 작성한 코드는 ,어이없는 실수를 할 확률이 매우 높고 위험하다.
(위 출력문은 사실 버그가 하나 숨어있다. 당장 이렇게 봐도 찾기 힘든데, 만약 코드가 수천줄이 넘어간다면?)
따라서 우리는 좀 더 우아하고, 고상한 방법들을 원하게 된다.
그래서 "배열"을 이용해보도록 하자.
우리는 총 10개의 인덱스를 가지는 배열을 선언했다.
다음과 같은 배열을 선언하면 장점은 다음과 같다.
- 10개의 정수의 등장 횟수를, 각각 1개씩 10개의 개념으로 나누는 게 아닌, 하나의 "배열" 이라는 형태로 개념적으로 깔끔하게 묶을 수 있다!
깔끔하게 추상화된 코드일수록, 좋은 의미로 관습적인 코드가 되고, 모두에게 읽기 쉽도록 변한다는 것을 명심하자.
정답 코드
'PS > Baekjoon OJ' 카테고리의 다른 글
[2213] 트리의 독립집합 (0) | 2024.12.03 |
---|---|
[1475] 방 번호 (0) | 2024.12.03 |