본문 바로가기

백준2776 - 암기왕 Python 본문

개발/algorithm

백준2776 - 암기왕 Python

자전하는명왕성 2023. 10. 21. 09:16

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

문제는 다음과 같다.

쉽게 얘기하면, N개의 테스트 케이스 | 수첩1의 길이 | 수첩1의 내용 | 수첩2의 길이 | 수첩2의 내용이 주어질 때,

수첩2의 요소가 순서 상관없이 수첩1에 포함되어 있다면 1을, 그렇지 않다면 0을 반환하면 된다.

 

a : [1,2,2,3] 배열과 b : [2,3,4] 배열이 있다고 가정했을 때, b의 요소가 a 배열에 포함되있는지 확인하는 방법은

딕셔너리를 활용하거나 혹은 정렬하여 이분탐색으로 활용하는 등 여러 방법이 있겠지만,

나는 중복된 요소를 제거하고 고유한 요소만 남긴다는 특징을 가진 set를 활용하여 문제를 해결했다. 

(문제에서 주어지는 정수 데이터의 수가 1백만 이하이기 때문에, 키 | 밸류값을 함께 저장하는 딕셔너리는 메모리 초과가 우려되어 사용하지 않았고, 같은 이유로 정렬이 필요한 이분탐색은 탐색 전 버블 정렬로 인한 시간초과가 우려되어 사용하지 않았다.)

 

그리고 컴프리헨션과 삼항연산자를 활용하여 간단하게 코드를 작성했다.

a = [1,2,2,3]
b = [2,3,4]

_a = set(a)
arr = ['1' if v in _a else '0' for v in b]
# [1,1,0] => 배열 b순서대로 2,3은 _a에 존재하므로 1 | 4는 존재하지 않으므로 0

 

전체 소스 코드

import sys
data_temp = sys.stdin if sys.platform == 'linux' else open('입력.txt', 'r')
input_data = data_temp.read().splitlines()
    
def solution (data) :
  N = int(data.pop(0))
  
  # 테스트 케이스 분리
  testCases = []
  for i in range(0, len(data), 4) :
    testCases.append(data[i:i+4])
  
  # 결괏값 추가
  result = []
  for arr in testCases :
    result += act(arr)
    
  print('\n'.join(result))

# 검증 | 반환하는 역할을 하는 act 함수
def act (arr) :
  _, a, __, b = [list(map(int, v.split())) for v in arr]
  _a = set(a)
  arr = ['1' if v in _a else '0' for v in b]
  return arr

    
solution(input_data)
Comments