Tiny Bunny
본문 바로가기
Algorithm/Python

[BOJ #10815] 숫자 카드

by nowag 2024. 2. 4.

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

 

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

 

내가 쓴 코드1

N = int(input())                            # N : 카드 개수
cards = list(map(int, input().split()))     # 카드에 적힌 정수 리스트 (중복 x)
M = int(input())                            # M : 정수 개수
numbers = list(map(int, input().split()))   # M 개의 정수 리스트

ex_lst = []                     # 존재 여부 저장 리스트
for num in numbers:             # numbers 의 정수 모두 접근
    exist = 0                   # cards 존재 여부
    for c in cards:             # cards 의 카드 모두 접근
        if c == num:
            exist = 1
    ex_lst.append(exist)

print(*ex_lst)

 

출력 결과

문제 읽고 20분도 안돼서 짠 코드다. 답도 잘나와서 틀릴거란 생각을 안했는데,, 웬걸 시간초과가 떴다.

구글링 결과, 백준 시간초과가 뜨면, 입출력할 때 쓰는 함수들과 리스트를 선언하고 할당하는 과정에서 append를 쓰는 것도 시간 복잡도가 크다는 것을 알게 되었다. 그것을 수정하여 코드의 함수들을 모두 수정하였다.

 

내가 쓴 코드2

from sys import stdin

N = int(stdin.readline())                            # N : 카드 개수
cards = list(map(int, stdin.readline().split()))     # 카드에 적힌 정수 리스트 (중복 x)
M = int(stdin.readline())                            # M : 정수 개수
numbers = list(map(int, stdin.readline().split()))   # M 개의 정수 리스트

ex_lst = [0]*M                  # 존재 여부 저장 리스트
for num in range(M):            # numbers 의 정수 모두 접근
    exist = 0                   # cards 존재 여부
    for c in cards:             # cards 의 카드 모두 접근
        if c == numbers[num]:
            exist = 1
    ex_lst[num] = exist

print(*ex_lst)

 

출력 결과는 위와 동일하고, 제출 결과도... 동일했다.. (충격) (스트레스,,)

같이 스터디하는 사람들에게 도움을 청했다[!!!sos!!!] 그리고 몇 가지를 수정할 수 있었다. 하나씩 고쳐서 제출해봤는데,, 이것도 몇 번을 고쳐나간지 모르겠다... 이놈의 시간초과,,ㅠㅠ

 

1) 이중 for문 쓰지 않기. (메모리)
2) 변수를 최소한으로.. (시간)
3)  list 보다는 set 쓰기. (시간)


 

내가 쓴 최종 코드1

N = int(input())                            # N : 카드 개수
cards = set(map(int, input().split()))	    # 카드에 적힌 정수 리스트 (중복 x)
M = int(input())                            # M : 정수 개수
numbers = list(map(int, input().split()))   # M 개의 정수 리스트

ex_lst = []                 	# 존재 여부 저장 리스트
for num in range(M):         	# numbers 의 정수 모두 접근
    if numbers[num] in cards:   # cards 의 카드 모두 접근
        ex_lst.append(1)
    else:
        ex_lst.append(0)

print(*ex_lst)

 

제출 결과

 

내가 쓴 최종 코드2

from sys import stdin

N = int(stdin.readline())                            # N : 카드 개수
cards = set(map(int, stdin.readline().split()))      # 카드에 적힌 정수 리스트 (중복 x)
M = int(stdin.readline())                            # M : 정수 개수
numbers = list(map(int, stdin.readline().split()))   # M 개의 정수 리스트

ex_lst = [0]*M                  # 존재 여부 저장 리스트
for num in range(M):            # numbers 의 정수 모두 접근
    if numbers[num] in cards:   # cards 의 카드 모두 접근
        ex_lst[num] = 1         # cards 존재 여부
    else:
        ex_lst[num] = 0

print(*ex_lst)

 

제출 결과

 

내가 시도한 모든 제출들의 결과...

ㅋㅋㅋㅋㅋ 이렇게 많이 시도한 사람이 또 있을까 싶은,,, 

백준에서 시간 초과 안당하려면, 오늘 알게 된 최적화 방법들을 항상 염두에 두고 풀어야겠다.. 시간초과 너무 열받아!!!

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ #2167] 2차원 배열의 합  (2) 2024.02.05
[BOJ #28445] 알록달록 앵무새  (2) 2024.02.05
[BOJ #1181] 단어 정렬  (0) 2024.02.02
[SWEA #16268] 풍선팡2  (1) 2024.02.02
[SWEA #9367] 점점 커지는 당근의 개수  (2) 2024.02.02