상세 컨텐츠

본문 제목

백준 1654: 랜선 자르기 (Swift)

Swift알고리즘

by 앱등개발자IOS 2022. 8. 17. 14:10

본문

전형적인 이분탐색 문제에서 한 단계를 더 거치도록 만들어진 문제이다.

잘라낼  랜선의 길이를 이분탐색하며 해당 값을 get_lan()함수에 넣어 출력된 값이 

문제에 주어진 조건을 만족하는지 기록하며 풀이해나가야한다.

Parametric Search라고 할 수 있을 것 같다.

 

위처럼 python으로 어렵지 않게 해결했지만, Swift로 풀이하면서는 알 수 없는 이유로 계속 틀렸다..

두가지 이유가 있었다.

1. 틀렸습니다. 를 유발한 원인

2. 런타임 에러 를 유발한 원인

 

 

1.17번 줄 ( 이분탐색의 end 포인터 시작점 )

이 부분을 처음에는 data.min()!으로 작성하였었다.

그러면 안되는 예시는 아래와 같다.

 

극단적인 예를 들어, 3 3 / 200 / 100 / 1 이  입력으로 주어졌을 때, 답은 100이 되어야한다.

하지만 data.min()!, 즉 1이 end의 시작점으로 설정된다면 답을 구해낼 수 없을 것이다.

 

2. 16번 줄( 이분탐색의 start 포인터 시작점 )

처음에는 start = 0 으로 작성했었다. 

이는 12번 줄에서 결국 0으로 나누는 계산으로 오류를 유발하게 된다.

처음에는 이것을 0으로 두나 1로 두나 크게 영향이 없을 것이라고 생각했으나,

본 문제 특성상, 이분탐색은 start와 end 포인터가 완전히 엇갈려야 로직이 끝나게된다.

 

start와 end가 엇갈리는 현상이 1과 data.max()!사이에서 일어나면 상관이 없으나, 

길이가 1인 랜선으로 나누어야만 k개의 랜선을 n개의 랜선으로 나눌 수 있는 경우,  마지막에 0을 get_lan()의 parameter로 넘겨주는 상황이 필연적으로 발생하게 된다.

따라서 "런타임 에러"가 발생하게 된다.

=> start = 1로 두어야한다.

 

 

 

 

 

관련글 더보기