-
[Python] BOJ 10816 : 숫자 카드 2코딩테스트/백준 2024. 9. 22. 21:36
https://www.acmicpc.net/problem/10815
위 문제의 변형이다.
요구사항
- 비교할 숫자 카드 집합 = A, 비교 당할 숫자 카드 집합 = B 라고 하겠다.
- B 집합에 A 집합이 몇 개씩 들어 있는 지 출력하는 문제이다.
설계
- 두 리스트를 비교하고 개수를 저장할 리스트를 초기화한다.
- 저장된 리스트를 출력한다.
틀린 답안 예시
import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) arr1 = list(map(int, input().split())) print(arr1) M = int(input()) arr2 = list(map(int, input().split())) print(arr2) result = [0] * M for i in range(M): if arr2[i] in arr1: result[i] += 1 print(result)
- 위 소스 코드의 의도는 arr[i] 를 arr1에 찾을 때 마다, result[i] 번 째을 1씩 증가시켜주는 것이였다.
- 하지만 i는 다시 0으로 돌아오지 않기 때문에 숫자 카드 문제와 다를 바 없었다.
정답 답안 예시
import sys from collections import Counter input = lambda: sys.stdin.readline().rstrip() N = int(input()) arr1 = list(map(int, input().split())) print(arr1) M = int(input()) arr2 = list(map(int, input().split())) print(arr2) # arr1의 각 요소의 개수를 세기 count_arr1 = Counter(arr1) # arr2의 각 요소에 대해 arr1에 있는 개수를 result에 저장 result = [count_arr1[i] for i in arr2] print(result)
- Counter(arr1): arr1의 각 요소를 세어 count_arr1에 저장합니다. 이 객체는 각 요소를 키로 하고 그 요소의 개수를 값으로 가지는 딕셔너리와 유사합니다. 예를 들어, arr1이 [1, 1, 2, 3]이라면 count_arr1은 Counter({1: 2, 2: 1, 3: 1})이 됩니다.
- 리스트 컴프리헨션을 사용하여 arr2의 각 요소 i에 대해 count_arr1[i]의 값을 가져와 result 리스트를 만듭니다. arr2의 요소가 arr1에 얼마나 나타나는지를 기록합니다. 만약 arr2가 [1, 2]라면, result는 [2, 1]이 됩니다.
추가로 (잡담)
다양한 방법을 시도해보다가 counter 모듈을 불러와 간단하게 구현하는 방법을 알게 되어 좋다. 파이썬 쵝오...
어디서 봤는 데 파이썬의 모듈을 최대한 활용하게 된다면 박사님들이 만드신 알고리즘이라 시간초과날 가능성은 매우 적다고 했던것 같다..
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 4134 : 다음 소수 (0) 2024.09.23 [Python] BOJ 2485 : 가로수 (0) 2024.09.23 [Python] BOJ 7785 : 회사에 있는 사람 (2) 2024.09.22 [Python] BOJ 10815 : 숫자 카드 [9.26 이후 다시 볼 게시물] (0) 2024.09.22 [Python] BOJ 2839 : 설탕 배달 (0) 2024.09.22