ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 10816 : 숫자 카드 2
    코딩테스트/백준 2024. 9. 22. 21:36

    https://www.acmicpc.net/problem/10815

    위 문제의 변형이다. 

    요구사항

    1. 비교할 숫자 카드 집합 = A, 비교 당할 숫자 카드 집합 = B 라고 하겠다. 
    2. B 집합에 A 집합이  몇 개씩 들어 있는 지 출력하는 문제이다.

    설계

    1. 두 리스트를 비교하고 개수를 저장할 리스트를 초기화한다.
    2. 저장된 리스트를 출력한다.

    틀린 답안 예시

    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 모듈을 불러와 간단하게 구현하는 방법을 알게 되어 좋다. 파이썬 쵝오...

    어디서 봤는 데 파이썬의 모듈을 최대한 활용하게 된다면 박사님들이 만드신 알고리즘이라 시간초과날 가능성은 매우 적다고 했던것 같다..

Designed by Tistory.