일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 블록체인
- BlockChain
- docker
- 동시성
- Refactoring
- 알고리즘
- BAEKJOON
- Algorithm
- 전문가를 위한 파이썬
- 파이썬
- fluent python
- Python
- function
- Thread
- 백준
- 코어 이더리움 프로그래밍
- Ethereum
- dockerfile
- Container
- AWS
- RabbitMQ
- rust
- Network
- guru
- IMAGE
- 플랫폼
- 이더리움
- 러스트
- Fast API
- Kubernetes
Archives
- Today
- Total
글쓰기 | 방명록 | 관리 |
Victoree's Blog
1300_K번째수 본문
728x90
Concept & Idea
이 문제는 일단 배열을 사용하여 푸는 문제가 아니라는 점이다. 배열을 잡지 않고도 문제를 해결할 수 있고, 해결해야만 한다. ‘이분탐색을 어떻게 사용할 것인가’를 알아내는 것도 어려운 문제였다. 임의의 mid를 골라서, 해당 mid보다 작은 숫자의 갯수를 파악하여 K번째 수를 구한다. st는 1로 시작하고, end는 k로 끝나는데, 여기서 나는 N^2까지 돌아야 한다고 생각했었다. 왜 k까지 돌리는지는 증명을 통해 알아야내야 할 것 같다. N이 1000보다 커지게 되면, mid/i가 N보다 커질 수 있기 때문에 min(mid/i,N)을 한다.
Code
#include <iostream>
using namespace std;
int n,k;
int main(){
cin>>n>>k;
int st=1,en=k, mid, res;
while(st<=en){
mid = (st+en)/2;
int cnt=0;
for(int i=1; i<=n; i++)
cnt+=min(mid/i, n);
if(cnt<k) {
st=mid+1;
} else {
en=mid-1;
res=mid;
}
}
cout<<res<<endl;
}
Fealing
왜 end가 K까지 돌아가야 하는건지가 의문이었다. 완벽하게 와닿지 않는 문제라서 나중에 한번 다시 풀어봐야 할 것 같다. 갯수를 세는데 일일히 가능한지 아닌지 보는것이 아니라 약수의 갯수를 확인하여 더해나가는 것이 중요한 방식인 것 같다.
728x90
'Algorithm > 2019~2020' 카테고리의 다른 글
1389_케빈 베이컨의 6단계 법칙 (0) | 2021.04.23 |
---|---|
1922_네트워크의 연결 (0) | 2021.04.23 |
3020_개똥벌레 (0) | 2021.04.23 |
2110-공유기 설치 (0) | 2021.04.23 |
2169-로봇 조종하기 (0) | 2021.04.23 |
Comments