[프로그래머스/Level3] 징검다리 건너기 (JAVA)
📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 이분 탐색 ▷ 대상 : 징검다리 건널 수 있는 친구들 수
1. 탐색하는 친구가 건널 수 있다면, 중간 값보다 작은 값들로 모두 건널 수 있음을 의미한다. 그러면 그 때 중간 값보다 많은 인원으로 건널 수 있는지 확인한다.
2. 탐색하는 친구가 건널 수 없다면, 중간 값보다 큰 수로는 건널 수 없음을 의미하므로, 중간 값보다 적은 인원으로 건널 수 있는지 확인한다.
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
class Solution {
static int[] stones;
static int k;
public int solution(int[] stones, int k) {
this.stones = stones;
this.k = k;
int answer = 0;
int left = 1;
int right = Integer.MAX_VALUE;
while (left <= right) { // 💥 이분탐색 대상 : 징검다리 건널 수 있는 친구 수
int mid = (left + right) / 2;
if (canCross(mid)) { // 다리 건널 수 있으면, 더 많은 친구들이 가능한지 친구 수 넓히기
left = mid + 1;
answer = Math.max(answer, mid);
} else { // 다리 건널 수 없으면, 친구 수 좁히기
right = mid - 1;
}
}
return answer;
}
// 징검다리 건널 수 있는지 확인하는 메서드
private static boolean canCross(int num) {
int count = 0; // 연속으로 0이 되는 횟수
for (int stone : stones) {
if (stone - num < 0) { // 디딤돌 숫자 - 건너는 친구 수
count++;
if (count >= k) { // 최대칸 수 넘으면 건널 수 없음
return false;
}
} else {
count = 0;
}
}
return true;
}
}
|
cs |
➕ 다른 풀이 방식
- 이분 탐색 대상이 "지점 간 최소 거리"인 풀이. 돌을 하나씩 지우면서 진행한다. (+친절한 그림 설명들)
[프로그래머스] 징검다리 (Java)
문제 https://programmers.co.kr/learn/courses/30/lessons/43236?language=java# 코딩테스트 연습 - 징검다리 출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다.
gom20.tistory.com
[프로그래머스] 징검다리-JAVA
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/43236 코딩테스트 연습 - 징검다리 출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위
born2bedeveloper.tistory.com
💦 어려웠던 점
- 이분 탐색 대상을 잘 잡고 가면 풀 수 있을 것 같다.. 이분 탐색 문제를 더 풀어봐야겠다..
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 풀이 참고
[프로그래머스/640464] 징검다리 건너기 (Java)
프로그래머스 64064 징검다리 건너기 Java 이진탐색
velog.io
[프로그래머스]징검다리 건너기 - JAVA
[프로그래머스]징검다리 건너기 programmers.co.kr/learn/courses/30/lessons/64062 코딩테스트 연습 - 징검다리 건너기 [2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3 programmers.co.kr 풀이 이분탐색 문제이다! 이분탐색을 하지 않고
moonsbeen.tistory.com
✔ 유사한 이분탐색 문제
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net