알고리즘 공부/플레이데이터 알고리즘 스터디

210531 완전/이진탐색 - 숫자카드2

vs질럿 2021. 5. 31. 21:36

문제주소 : https://www.acmicpc.net/problem/10816

 

이중 for문으로 결과를 내기는 쉬웠으나 시간초과 해결이 어려웠다. 

dict를 이용해 이중 for문을 2개의 for문으로 바꿔서 해결할 수 있었다.

 

이중 for문

import sys

# 입력값 넘겨받기
n = int(sys.stdin.readline())
value_n = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline())
value_m = list(map(int, sys.stdin.readline().split()))

# 개수세기 - 완전탐색 -> 시간초과로 실패
count = [0] * m
value_n.sort()

for i in range(m):
    for j in range(n):
        if value_m[i] == value_n[j]:
            count[i] += 1
        if value_m[i] < value_n[j]:
            break

# 출력
for x in count:
    sys.stdout.write(str(x) + " ")

최대한 시간을 줄이기 위해 sort도 해보고 입력 출력구문도 바꿔보았지만 최종적으로 실패했다.

 

 

dict를 이용한 2개의 for문

import sys

# 입력값 넘겨받기
n = int(sys.stdin.readline())
value_n = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline())
value_m = list(map(int, sys.stdin.readline().split()))

# 개수세기 - 딕셔너리에 해당 숫자를 가진 개수를 누적 COUNT해서 조회만 함
count = {}

for i in range(n):
    try:
        count[value_n[i]] += 1
    except:
        count[value_n[i]] = 1

for j in range(m):
    try:
        sys.stdout.write(str(count[value_m[j]]) + " ")
    except:
        sys.stdout.write(str(0) + " ")

 

count[value_n[i]]를 if문으로 확인하는 방법이 잘 안됐지만 결과적으로 이게 더 편한것 같다.