숫자의 개수
2577번: 숫자의 개수
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.
www.acmicpc.net
1차원 배열
문제
세 개의 자연수 A, B, C가 주어질 때
예를 들어
입력
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.
출력
첫째 줄에는
예제 입력 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해서 출력한다.
'알고리즘 > Baekjoon' 카테고리의 다른 글
[Python] 1546번 평균 - 백준 (0) | 2021.10.11 |
---|---|
[Python] 3052번 나머지 - 백준 (0) | 2021.10.08 |
[Python] 2562번 최댓값 - 백준 (0) | 2021.10.05 |
[Python] 10818번 최소, 최대 - 백준 (0) | 2021.10.04 |
[Python] 1110번 더하기 사이클 - 백준 (0) | 2021.09.29 |
댓글