티스토리 뷰
반응형
📎 간략한 문제 정리
- 개수가 (1 ≤ N ≤ 500,000)인 숫자 배열 N이 주어집니다. 각 숫자의 범위는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같습니다. 그 후 새로운 숫자 배열 M을 입력 받는데, M의 숫자들이 N의 배열에서 몇번 나오는지 출력하는 문제입니다.
📈 문제 분석
- 문제 카테고리는 이분탐색입니다. 배열 N의 정보를 어떻게 처리할지가 중요합니다.
🙋♂️ 내가 처음 생각한 해결 방법
- Counterdict를 활용해서 배열 N을 정리하면 O(N)으로 처리 가능할 것 같습니다.
💻 풀이한 코드
from sys import stdin
from collections import Counter
input = stdin.readline
N = int(input())
N_dict = Counter(list(map(int, input().split())))
M = int(input())
count = [0 for _ in range(M)]
M_list = list(map(int, input().split()))
for i in range(len(M_list)):
if M_list[i] in N_dict:
count[i] = N_dict[M_list[i]]
print(' '.join(map(str, count)))
📝 해결 과정에서 만난 문제, 고민들
이분 탐색: 문제의 섹션이 이분 탐색이기 때문에 이분 탐색을 활용한 방법을 생각해봤습니다. 이분 탐색의 조건은 다음과 같습니다.
- 원소의 정렬 여부
- 원소에 Random Access 가능 여부
우선 원소가 오름차순이나 내림차순으로 정렬되어 있어야 대소 비교에 따른 검색 방향 설정이 가능하기 때문에 정렬이 필수입니다. 그리고 원소에 Random Access가 가능하다는 것은 예를 들어 Python의 list처럼 index만 알면 해당 자료에 O(1)로 접근 가능한지 여부입니다. 2번은 만족하지만 1번을 만족시키기 위해서는 최소 O(NlogN)의 Tim sort를 활용해야 합니다. 이분 탐색의 속도가 O(logN)이라고 하더라도 정렬 안된 배열에선 무의미합니다. 위의 코드에서 Counter 함수는 O(N)이고 for문 안에서 if 조건이 O(1)이므로 for문은 O(N)이 됩니다. 그래서 속도상 더 빠르다고 판단하여 위와 같이 구현했습니다.
반응형
'알고리즘 학습 > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘] - 행렬 제곱 (10830) with Python (0) | 2021.04.17 |
---|---|
[백준 알고리즘] - 곱셈 (1629번) with Python (0) | 2021.04.16 |
[백준 알고리즘] - 행렬 곱셈 (2740번) with Python (0) | 2021.04.14 |
[백준 알고리즘] - AC (5430번) with Python (0) | 2021.04.13 |
[백준 알고리즘] - 주유소 (13305번) with Python (0) | 2021.04.10 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 섬의개수#백준알고리즘#Python
- PassingCars#Codility#Python
- Triangle#Sorting#Codility#Python
- 텀 프로젝트#백준알고리즘#Python
- 리모컨#완전탐색#BOJ#Python
- 미로 탐색#백준알고리즘#Python
- Distinct#Codility#Python
- 나무자르기#BOJ#이분탐색#Python
- 파이썬알고리즘인터뷰#4장
- API#lazy#
- NumberofDiscIntersections#Codility#Sort#Python
- Brackets#Stacks and Queues#Codility#Python
- 배열합치기#분할정복#BOJ#Python
- django#slicing
- 종이자르기#분할정복#BOJ#Python
- 토마토#백준알고리즘#Python
- 병든 나이트#BOJ#탐욕법#Python
- 랜선자르기#이분탐색#BOJ#Python
- 암호코드#dp#BOJ#Python
- django
- filter#isalnum#lower
- 쿼드트리#BOJ#분할정복#Python
- 터틀비치#리콘#xbox#controller
- 공유기 설치#BOJ#이분탐색#Python
- Swift#Tuples#Range
- 백준 알고리즘#BackTracking
- 순열사이클#BOJ#Python
- N으로 표현#DP#Programmers#Python
- 반복수열#백준알고리즘#Python
- 날짜 계산#BOJ#완전탐색#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함