[프로그래머스] Lv.4 징검다리 (Java)

2023. 6. 26. 01:19·Algorithms(CT)/Programmers

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/43236

 

프로그래머스

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

programmers.co.kr

 

문제 설명


💡 아이디어

도착 지점 distance는 최대 1,000,000,000이므로 완전탐색을 통해 찾으면 분명 시간 초과가 나올 것입니다.

따라서 이 문제는 이분탐색을 사용해 각 지점 사이의 거리의 최솟값을 구하도록 하겠습니다.

 

 

📃 풀이과정

 

1. 이분탐색을 위해 출발지점을 left에 넣고 도착지점을 right에 넣어두어 탐색을 시작합니다.

int left=0; //출발지점
int right=distance; //도착지점

 

2. 돌의 위치를 나타내는 rocks배열은 순서가 섞여있기 때문에, 돌 사이 거리를 구하기 위해 정렬합니다.

Arrays.sort(rocks);

 

3. 이분탐색을 구현하기 위해 while문에 left가 right보다 크지 않을 때까지 반복문을 진행해 줍니다.

 

4. left와 right의 절반인 half를 구해주고, 여기서 half는 돌 사이 거리의 최솟값을 나타냅니다.

int half=(left+right)/2;

 

5. while문 안에 반복문을 돌면서 출발지점부터 도착지점까지 돌 사이의 거리가 half보다 작으면

해당 돌을 제거하여 총 몇 개의 돌이 제거되는지 구합니다.

int removeRock=0; //제거해야 할 돌 개수
int befRock=0; //이전 돌 위치

for(int i=0;i<rocks.length;i++){
    if(rock[i]-befRock>=half) befRock=rocks[i]; //돌 제거하지 않으면 이전 돌 위치를 변경
    else removeRock++;
}

 

6. 만약 제거할 돌 개수가 n개 보다 크다면 돌 사이의 거리를 너무 큰 것으로

     => right를 half-1로 재설정해 범위를 [left ~ half-1]로 만들고 while문을 돌면서 다시 탐색합니다.

 

7. 만약 제거할 돌 개수가 n이하이면

     => answer에 half값을 저장하고, 최댓값을 찾기 위해 범위를 [half+1 ~ right]로 다시 탐색합니다.

if(removeRock>n){ //바위를 더 많이 제거해야 할 경우
    right=half-1;
}
else{
    answer=half;
    left=half+1;
}

 

8. 이 과정을 left가 right보다 커질 때까지 반복하고, 반복문을 나왔을 때의 answer값이 최댓값입니다.

 


전체코드

import java.util.*;
class Solution {
    public int solution(int distance, int[] rocks, int n) {
        int answer = 0;
        
        int left=0;//출발지점
        int right=distance;//도착지점
        
        Arrays.sort(rocks);// 돌 사이 거리를 알기 위해 정렬.
        
        while(left<=right){
            
            int half=(left+right)/2;
            
            
            int removeRock=0; //제거해야 할 돌 개수
            
            int befRock=0;//이전 돌 위치
            for(int i=0;i<rocks.length;i++){
                if(rocks[i]-befRock>=half) befRock=rocks[i];
                else removeRock++; //최소거리보다 작으면 돌 삭제 개수 추가
            }
            if(distance-befRock<half) removeRock++; // 마지막 돌과 도착 지점도 해줘야함.!!
            
            
            //System.out.println(left+" "+right+" "+half+" : "+rockNum+" "+answer);
            
            if(removeRock>n){//바위를 더 많이 제거했을 때
                right=half-1;
            }else{
                answer=half;
                left=half+1;
            }
        }
        
        return answer;
    }
}

'Algorithms(CT) > Programmers' 카테고리의 다른 글

[프로그래머스] Lv.2 땅따먹기 (Java)  (0) 2023.06.29
[프로그래머스] Lv.3 순위 (Java)  (0) 2023.06.27
[Java] Lv.2 N진수 게임  (0) 2023.06.24
[프로그래머스][Java] Lv.2 k진수에서 소수 개수 구하기  (0) 2023.06.22
[프로그래머스] Lv2. 뉴스 클러스터링 (Java)  (0) 2023.06.21
'Algorithms(CT)/Programmers' 카테고리의 다른 글
  • [프로그래머스] Lv.2 땅따먹기 (Java)
  • [프로그래머스] Lv.3 순위 (Java)
  • [Java] Lv.2 N진수 게임
  • [프로그래머스][Java] Lv.2 k진수에서 소수 개수 구하기
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    호텔 대실
    프로그래머스
    IT 잡학사전
    백준
    LV.3
    LV.2
    java
    코딩테스트
    스택
    제대로 파는 자바스크립트
    자바
    HTML
    IT 5분 잡학사전
    Lv.1
    구름
    노마드코더
    BOJ
    Til
    개발자북클럽
    Greedy
    구름톤 챌린지
    존안님
    그리디
    따라하며 배우는 html css
    lv2
    lv.4
    DFS
    인프런
    BFS
    DP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스] Lv.4 징검다리 (Java)
상단으로

티스토리툴바