본문 바로가기
알고리즘

백준_1300_K번째 수

by 매화of사군자 2020. 2. 21.

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

 

1300번: K번째 수

첫째 줄에 배열의 크기 N이 주어진다. N은 105보다 작거나 같은 자연수이다. 둘째 줄에 k가 주어진다. k는 min(109, n2)보다 작거나 같은 자연수이다.

www.acmicpc.net

해결 방법(초기)

> 문제를 읽고 나서 처음으로 든 생각은 이차원 배열을 선언하고 해당 값으로 초기화한다. 그 후 sum(array,[])을 통하여 1차원으로 만든 후 정렬을 통해 문제를 풀려고 했다.

> 위 방법으로 푼 결과는 다음과 같다.

 

메모리 초과 이유

  Int 4Byte
  1KB 1024Byte
  1MB 1024KB
  128MB 128*1024KB = 33554432개(Int)
문제 조건(입력) 10^5(2차원 배열) 10^10 > 128MB

> 그러므로 2차원 배열이든 쭉 늘여놓은 1차원 배열이든 메모리 초과가 날 수 밖에 없다.

 

해결 방법(결론)

> 문제에서 도출해내야 하는 정답은 K번째 있는 수를 출력하는것이다.

> 그러므로 N*N 배열을 전체 탐색하지 않아도 된다.

> left = 1, right = K로 놓는다. right를 K로 놓아도 이유는 아래에서 설명할 것이다.

> 예를 들어 N이 5, K가 7이라고 가정.

1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

위의 2차원 배열을 1차원으로 정렬해서 나열한다면 다음과 같이 나올 것이다.

1 2 2 3 3 4 4 4 .....

right가 K, 즉 7이라고 놓았는데 위에서 보이듯이 중복해서 들어오는 숫자가 존재하므로 K번째 수는 K보다 반드시 작다.

(증명은 어떻게 하는거지....)

 

 

'알고리즘' 카테고리의 다른 글

Winter-1DAB_시뮬레이션_2020-02-23  (0) 2020.02.23
Winter-1DAB_이분탐색  (0) 2020.02.21
백준_1620_나는야 포켓몬 마스터 이다솜  (0) 2020.02.21
백준_2110_공유기 설치  (0) 2020.02.21
백준_10816_숫자카드2(Counter)  (0) 2020.02.20

댓글