일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java 객체지향 프로그래밍
- 코딩테스트
- it 뉴스
- 코테
- 싸피
- html
- 리얼클래스
- 프로그래머스
- SSAFY 7기
- IT 트렌드
- 우테코
- 코딩테스트 연습
- KT
- SSAFY
- 신문스크랩
- 백준위
- 백준
- Java
- 싸피셜
- 카카오
- 인앱결제
- 구글
- 네트워크 관리사 2급 실기
- IT 동향
- it 이슈
- 네트워크 관리사 2급
- SSAFYcial
- python
- 신문 스크랩
- 네트워크 관리사
- Today
- Total
개발자일걸요..?
1300번 K번째 수 본문
문제링크 : 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
<알고리즘>
1) 범위를 [1,K]로 지정하고 그 범위의 중앙값인 mid보다 작은 숫자의 개수(cnt)를 파악합니다.
1-1) cnt 파악방법
i*j<=mid 가 가장 손쉽게 셀수 있는 방법이지만 이 방법은 같은 숫자 중복에 대응하기 어렵습니다.
따라서, 좀 더 손쉽게 보기 위해 j<=mid/i 즉, mid값을 행으로 나누어 범위안에 들어오는 수를 찾습니다.
그러한 방법으로 변환하면 cnt = min(N, mid/i)(1<=i<=N) 이 됩니다.
N값과 비교하는 이유는 몫이 주어진 범위보다 큰 경우를 배제하기 위해서 입니다.
2) cnt와 K를 비교하여 범위를 조정합니다.
2-1) cnt>=K 일경우, [1,mid-1]로 범위를 변경합니다.
2-2) cnt<K일 경우 [mid+1,K]로 범위를 변경합니다.
3) 범위의 좌측값이 우측값보다 작은 동안 2번을 반복합니다.
범위를 K로 지정하는 이유 : 모든 K에 대해 K번째로 작은 수가 K이하이기 때문에
+) 참고 www.acmicpc.net/board/view/37110
글 읽기 - 소스코드 및 해설을 봐도 잘 모르겠습니다.
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
+) 참고 : www.acmicpc.net/board/view/31679#comment-57064
글 읽기 - 이분탐색으로 풀었지만 최대수와 if문에서 의문점이 남습니다.
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
메모리 : 2016KB 시간 : 32ms
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
//파라미터의 수보다 작은 수의 개수 return
int cntSmaller(long long N, long long m) {
int total = 0;
for (int i = 1; i <= N; i++) {
total += min(N, m / i);
}
return total;
}
int main() {
long long N = 0;
long long K = 0;
cin >> N >> K;
long long left = 1;
long long right = K;
long long middle = 0;
long long result = 0;
int cnt = 0;
while (left <= right) {
middle = (left + right) / 2;
cnt = cntSmaller(N, middle);
if (cnt >= K) {
right = middle - 1;
result = middle;
}
else{
left = middle + 1;
}
}
cout << result;
return 0;
}
+) 문제 그대로 코딩 했을 경우 => 메모리 초과
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N = 0;
int K = 0;
cin >> N >> K;
vector<long long> number;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
number.push_back(i*j);
}
}
sort(number.begin(), number.end());
cout << number[K];
return 0;
}
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
12015번 가장 긴 증가하는 부분 수열 (0) | 2021.03.30 |
---|---|
2110번 공유기 설치 (0) | 2021.03.29 |
2805번 나무자르기 (0) | 2021.03.27 |
1149번 RGB 거리 (0) | 2021.03.25 |
2156번 포도주 시식 (0) | 2021.03.24 |