코테/프로그래머스

[프로그래머스/Level3] 징검다리 건너기 (JAVA)

imname1am 2024. 3. 8. 15:20
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

 

반응형