본문 바로가기
알고리즘/Baekjoon

[Python] 2577번 숫자의 개수 - 백준

by Jun Shim 2021. 10. 7.
728x90

숫자의 개수

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

www.acmicpc.net

1차원 배열

 

문제

세 개의 자연수 A, B, C가 주어질 때 \( A \times B \times C \)를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

 

예를 들어 \( A = 150, B = 266, C = 427 \)이라면 \( A \times B \times C = 150 \times 266 \times 427 = 17037300 \)이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

 

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

출력

첫째 줄에는 \( A \times B \times C \)의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 \( A \times B \times C \)의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

예제 입력 1

150
266
427

예제 출력 1

3
1
0
2
0
0
0
2
0
0


 

다양한 Python 풀이

풀이 1

 

로그인

 

www.acmicpc.net

 

수학적인 풀이 방법이다.

import math
n = math.prod(int(input()) for _ in range(3))
a = [0] * 10
while n:
    n, r = divmod(n, 10)
    a[r] += 1
print(*a)

 

입력 받은 A, B, C를 모두 곱해주기 위해 기본 모듈인 math의 prod를 사용한다. 이는 곱(product)연산을 수행한다. 모듈을 사용하지 않겠다면 아래의 방법을 이용하여 계산하면 된다.

n = 1
for _ in range(3):
    n *= int(input())

 

0 ~ 9까지의 개수를 담기 위해 0으로 채워진 list를 만들어 준다. Python list에서 *연산자는 같은 값을 반복 생성해준다. 이제 while 반복문으로 몫이 0이 될 때까지 10으로 나눠주고, 1의 자리가 나올 나머지를 list index 탐색에 활용한다. 탐색된 index의 값에 개수 1을 더해준다. 몫이 존재하지 않아서 반복문이 끝나면 list unpacking을 통해서 모든 값을 출력해준다.

 

풀이 2

 

로그인

 

www.acmicpc.net

 

위에서 수학적인 방법을 활용했다면 이번엔 계산된 값을 iterable 자료형으로 바꿔서 탐색에 활용한다.

import math
a = [0] * 10
for n in str(math.prod(int(input()) for _ in range(3))):
    a[int(n)] += 1
print(*a)

 

 문자열로 바꾼 값을 for문을 통해 가장 높은 자리수부터 차례대로 뽑아온다. 뽑아온 값을 다시 int로 형 변환 후 list indexing에 활용한다.

 

풀이 3

 

로그인

 

www.acmicpc.net

 

추가로 조금 더 짧지만 덜 효율적인 원소의 개수를 탐색하는 count를 활용하는 방법이다. 

import math
n = sorted(str(math.prod(int(input()) for _ in range(3))))
print(*(n.count(str(i)) for i in range(10)))

 

값을 문자열로 바꿔주는 것까진 위와 같다. 다만 count는 정렬되어 있지 않은 자료형에서는 매 탐색마다 처음부터 끝까지 탐색할 것이다. 이는 값이 클수록 더 비효율적으로 시간을 소모할 것이기에 여기서 sorted를 활용한다면 조금 더 시간이 줄어드는 것을 확인했다. 마지막으로 문제에서 원하는 대로 0 ~ 9까지인 원소의 개수를 탐색하도록 generator를 만들고 unpacking해서 출력한다.

 

728x90

댓글