백준 1300 파이썬 시간 복잡도 N^2인 알고리즘 불가

2024. 5. 21. 06:55코딩/백준

반응형

백준 1300 - k번째 수

문제

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

 

1300번: K번째 수

세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B

www.acmicpc.net

1300

답안 코드 :

N = int(input())
K = int(input())
start = 1
end = K
ans = 0
# 이진 탐색 수행
while start <= end:
    middle = int((start + end) / 2)
    cnt = 0
    # 중앙 값보다 작은 수 계산
    for i in range(1, N + 1):
        cnt += min(int(middle / i), N)  # 작은 수 카운트 핵심 로직
    if cnt < K:
        start = middle + 1
    else:
        ans = middle
        end = middle - 1
print(ans)

 

생각 :

# 문제 분석
# k는 min(10^9, N^2)이므로 시간 복잡도 N^2인 알고리즘 불가
# 이진 탐색으로 중앙값보다 작은 수의 개수를 세면서 범위를 절반씩 줄여서 B[k]값을 구함.

# 문제 풀이
# 2차원 리스트는 N행이 N의 배수로 구성
# 2차원 리스트에서 k번쨰 수는 k를 넘지 않음. 1~k번째 안에 답이 있음

# 시작 인덱스 1, 종료 인덱스를 k

# 중앙값보다 작은 수의 개수가 k보다 작으면 
# 시작 인덱스를 중앙값 + 1
# 중앙값보다 작은 수의 개수가 k보다 크거나 같으면
# 종료 인덱스를 중앙값 - 1 
# 정답을 중앙값으로 업뎃하면서 시작 인덱스가 종료 인덱스보다 커질 때까지 이진 탐색

 

탐색 알고리즘 정리 블로그

https://mkisos.tistory.com/entry/%ED%83%90%EC%83%89-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A0%95%EB%A6%AC

 

탐색 알고리즘 정리

탐색 탐색은 주어진 데이터에서 자신이 원하는 데이터를 찾아내는 알고리즘을 말한다. 주어진 데이터의 성질(정렬 데이터 또는 비정렬 데이터)에 따라 적절한 탐색 알고리즘을 선택하는 것이

mkisos.tistory.com

# 어렵다 완벽이해 x

반응형