-
[Python] BOJ 1920 : 수 찾기코딩테스트/백준 2024. 9. 10. 11:40
https://www.acmicpc.net/problem/1920 <- 문제 click
1. 요구사항 분석
- N과 M 은 서로 다른 값이 될 수 있다.
- M개의 수들이 N개의 수에 있는 지 확인할 것.
- N에서 M의 여부를 순서대로 0,1 을 사용해서 보여줄 것.
2. 설계
- 우선, 구현을 한 뒤 리팩토링 해보자.
- 구현 설계
- 여러 요소를 한번에 int 형으로 바꾸기 위해서 map으로 N과 M 의 개수를 받는다.
- for 문을 이용하여 arr1 안에 arr2 가 있는 지 확인한다.
- 존재 유무를 가시적으로 보여줄 arr2만큼의 리스트를 초기화해준다.
- for 문을 이용하여 check_arr 를 하나씩 출력한다.
3. 실수
[실수 1 : TypeError]
# 오류 예시 arr_list = [1, 2, 3, 4] for index in len(arr_list): print(index)
- len(arr_list) 는 4를 반환하며, for 루프는 반복 가능한 객체(리스트, 튜플, 문자열 등)에만 사용할 수 있다.
- 정수는 (여기서는 4) 반복 가능한 객체가 아니기 때문에 TypeError 가 발생하는 것이다.
- 따라서 for문을 for index in range(len(arr_list)) 로 바꾸면 해결이 된다.
[실수 2 : TypeError]
# 오류 예시 arr_list = [1, 2, 3, 4] print(arr_list.index[4])
- index() 는 리스트의 메서드이기 때문에 호출하려면 소괄호를 사용해야 한다. index[4] 는 index라는 메서드에 대괄호로 접근하는 시도인데, 이는 타입에러를 발생시킨다.
[실수 3 : SyntaxError]
arr_list = [1, 2, 3, 4] 1 = arr_list[2]
- 위 코드에서 의도는 arr_list의 인덱스 2번에 1을 위치시키고 싶었던 것이다.
- 에러가 발생하는 이유는 값에 변수를 할당하려고 했기 때문이다. 왼쪽에 있는 값(1)은 수정할 수 없는 리터럴이므로 오류가 발생한다.
[실수 4 : ValueError]
# 오류 예시 arr1 = [1, 2, 3, 4] arr2 = [2, 3, 4, 5] print(arr1.index(arr2[3]))
- 에러가 발생하는 이유는 없는 arr2[3] 값을 arr1 에서 찾을 때, 해당 값이 arr1 에 존재하지 않기 때문이다.
- 2가지 방법으로 해결할 수 있겠다.
- 1번째 방법) in 연산자를 사용해 값이 리스트에 있는 지 확인한 후에 index()를 호출해보자.
arr1 = [1, 2, 3, 4] arr2 = [2, 3, 4, 5] if arr2[3] in arr1: # arr2[3]이 arr1에 있는지 확인 print(arr1.index(arr2[3])) else: print(f"{arr2[3]} is not in arr1")
- 2 번째 방법) try except 구문을 이용해보자
# 오류 예시 arr1 = [1, 2, 3, 4] arr2 = [2, 3, 4, 5] try: arr1.index(arr2[3]) print('arr1에 arr2에서 찾는 값이 존재합니다.') except: print('찾는 값이 arr1에 존재하지 않습니다.')
[실수 5 : <map object at 0x00000210194E96C0>]
# 오류 예시 arr = map(int, input().split()) print(arr)
- map() 함수는 출력 기능은 없고 메모리상에서만 계산이 이루어진다.
- 따라서 위 코드를 출력하고 싶을 때, arr = list(map, (int, input().split())) 으로 바꿔주자.
[실수 6 : 백준 시간초과]
- 짜둔 코드의 시간복잡도가 O(n^2) 이 되서 아마 그런 거 같다.
- 하나의 리스트의 자료구조를 list 가 아닌 set으로 변경해주었다.
- set 자료구조는 해시 테이블을 사용하여 원소의 존재 여부를 평균적으로 O(1) 로 확인할 수 있다고 한다.
- 따라서 해당 값이 있는 지 없는 지 확인하는 배열에 set 자료구조로 초기화 해주었다.
[실수 7 : 백준 런타임 에러(AttributeError]
- set 으로 변경 하였더니 발생한 오류이다.
- 오류가 발생한 원인은 set 객체에는 index() 메서드가 없기 때문이다. set은 순서가 없는 자료구조이기 때문에 인덱스 기반 접근이 불가능하며, index 메서드가 존재하지 않는다.
- 따라서 set 객체의 특정 원소를 찾을 때는 in 키워드를 이용하여, 원소가 set에 있는 지를 빠르게 확인할 수 있다.
* 최종 코드
arr1_N = int(input()) arr1 = set(map(int, input().split())) # set으로 변환하여 탐색 시간 O(1)로 줄임 arr2_N = int(input()) arr2 = list(map(int, input().split())) # check_arr 초기화 check_arr = [0] * len(arr2) # arr2의 각 원소가 arr1에 있는지 확인 for i in range(len(arr2)): if arr2[i] in arr1: # O(1)로 탐색 가능 check_arr[i] = 1 else: check_arr[i] = 0 # 결과 출력 for num in check_arr: print(num)
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 1436 영화감독 숌 (0) 2024.09.22 [Python] BOJ 1260 : BFS와 DFS (0) 2024.09.19 [Python] BOJ 1914 : 하노이 탑 (1) 2024.09.08 [Python] BOJ 9020 : 골드바흐의 추측 (1) 2024.09.08 [Python] 백준 10,818 : 최소, 최대 (0) 2024.06.19