백준2776 - 암기왕 Python 본문
반응형
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)
반응형
'개발 > algorithm' 카테고리의 다른 글
백준15656 - N과 M (7) | Python itertools 모듈 (1) | 2023.10.23 |
---|---|
백준1966 - 프린터 큐 Python (1) | 2023.10.22 |
백준9506 - 약수들의 합 JS | Python (0) | 2023.10.20 |
백준2338 - 긴자리 계산 JS | Python (1) | 2023.10.17 |
프로그래머스 - 햄버거 만들기 (스택) JS (0) | 2023.10.16 |
Comments