일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- Django
- MYSQL
- til
- JavaScript
- MyPick31
- 개발
- 장고 프로젝트 순서
- python
- Algorithm
- Bookmark
- mongodb
- 알고리즘
- 독립영화플랫폼
- ART_Cinema
- Exercism
- Node.js
- join()
- 장고 개발 순서
- 장고 프로젝트
- 프로젝트
- Django Blog
- 예술영화추천
- 북마크만들기
- 타사인증
- Blog
- 파이썬 웹프로그래밍 장고
- passport.js
- 자바스크립트
- 장고
- 북마크앱
- Today
- Total
Juni_Dev_log
[이분 탐색(결정 알고리즘) & 그리디 알고리즘] 파이썬 알고리즘 문제 3-1 "이분 검색" 본문
[이분 탐색(결정 알고리즘) & 그리디 알고리즘] 파이썬 알고리즘 문제 3-1 "이분 검색"
Juni_K 2021. 3. 10. 21:28
[시간복잡도]
O(logN) : 이진탐색은 계속해서 리스트를 반으로 줄이는 것이기 때문에 logN에 해당한다.
[공간복잡도]
O(N)
Problem
임의의 N개의 숫자가 입력으로 주어집니다.
N개의 수를 오름차순으로 정렬한 다음 N개의 수 중 한 개의 수인 M이 주어지면 이분검색으로 M이 정렬된 상태에서 몇 번째에 있는지 구하는 프로그램을 작성하세요.
단 중복값은 존재하지 않습니다.
▣ 입력설명
첫 줄에 한 줄에 자연수 N(3<=N<=1,000,000)과 M이 주어집니다.
두 번째 줄에 N개의 수가 공백을 사이에 두고 주어집니다.
▣ 출력설명
첫 줄에 정렬 후 M의 값의 위치 번호를 출력한다.
▣ 입력예제
8 32
23 87 65 12 57 32 99 81
▣ 출력예제
3
💯 Solution ①
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
|
import sys
sys.stdin=open("input.txt","rt")
# n : 리스트의 갯수 , m : 찾아야하는 수
n, m = map(int,input().split())
a = list(map(int,input().split()))
# 오름차순으로 정렬
a.sort()
# lt : 제일 왼쪽 인덱스 번호 , rt : 제일 오른쪽 인덱스 번호
lt=0
rt=n-1
for i in range(n):
# mid : 가운데 인덱스 번호
mid = (lt + rt)//2
# 중간값이 m과 같을 때
if a[mid]==m:
# 인덱스에 +1를 해야 몇번째인지 계산할 수 있다.
print(mid+1)
# for문 중단
break
# 중간값이 m보다 클 때
elif a[mid] > m:
rt=mid-1
# 중간값이 m보다 작을 때
else:
lt=mid+1
|
cs |
> '이분 검색(Binary Search)' 를 하기 위해서는?
1. 이분 검색을 위해서는 무조건 오름차순/내림차순으로 리스트를 정렬해야한다.
2. 처음에 lt(제일 왼쪽 인덱스 값), rt(제일 오른쪽 인덱스 값)를 설정한다.
3. 해당 리스트의 인덱스에서 가운데 값을 mid로 설정한다. mid=((lt+rt)//2)
4. 반복문을 통해서 리스트의 [mid] 값이 같은지 파악한다.
5. 다르다면, 경우에 따라서 lt와 rt의 값을 변경하면서 범위를 좁힌다.
6. 리스트의 [mid]값이 찾으려는 값과 같다면 반복문을 종료한다.
💯 Solution ②
: Tutor's Code
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
|
import sys
sys.stdin=open("input.txt","rt")
# n : 리스트의 갯수 , m : 찾아야하는 수
n, m = map(int,input().split())
a = list(map(int,input().split()))
# 오름차순으로 정렬
a.sort()
# lt : 제일 왼쪽 인덱스 번호 , rt : 제일 오른쪽 인덱스 번호
lt=0
rt=n-1
for i in range(n):
# mid : 가운데 인덱스 번호
mid = (lt + rt)//2
# 중간값이 m과 같을 때
if a[mid]==m:
# 인덱스에 +1를 해야 몇번째인지 계산할 수 있다.
print(mid+1)
# for문 중단
break
# 중간값이 m보다 클 때
elif a[mid] > m:
rt=mid-1
# 중간값이 m보다 작을 때
else:
lt=mid+1
|
cs |
튜터님과의 코드가 굉장히 유사하지만,
반복문을 시작하는 조건을 다르게 정의했다.
나는 for 문을 사용해서 for i in range(n): 을 사용했고
튜터님은 while lt<=rt: 로 lt값이 rt값과 같거나 rt값이 더 크다면 반복문을 실행하는 것으로 작성을 했다.
📚 참고
(이진 탐색 정리)
⚙️저장소
github.com/JiHoon-JK/Algorithm/blob/main/inflearn/python/%EC%84%B9%EC%85%984-1.py
'CodingTest > 인프런 (Algorithm)' 카테고리의 다른 글
[이분 탐색(결정 알고리즘) & 그리디 알고리즘] 파이썬 알고리즘 문제 3-3 "뮤직비디오 (결정 알고리즘)" (0) | 2021.03.12 |
---|---|
[이분 탐색(결정 알고리즘) & 그리디 알고리즘] 파이썬 알고리즘 문제 3-2 "랜선자르기 (결정 알고리즘)" (0) | 2021.03.11 |
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-11 "격자판 회문수" (0) | 2021.03.05 |
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-10 "스도쿠 검사" (0) | 2021.03.04 |
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-9 "봉우리" (0) | 2021.03.03 |