μ•Œκ³ λ¦¬μ¦˜/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Programmers Level 3 ] 징검닀리 κ±΄λ„ˆκΈ° ( JAVA / μžλ°” )

KIMHYEYUN 2021. 10. 7. 16:47
λ°˜μ‘ν˜•

https://programmers.co.kr/learn/courses/30/lessons/64062

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 징검닀리 κ±΄λ„ˆκΈ°

[2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3

programmers.co.kr

 

문제


[λ³Έ λ¬Έμ œλŠ” μ •ν™•μ„±κ³Ό νš¨μœ¨μ„± ν…ŒμŠ€νŠΈ 각각 μ μˆ˜κ°€ μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.]

카카였 μ΄ˆλ“±ν•™κ΅μ˜ "λ‹ˆλ‹ˆμ¦ˆ μΉœκ΅¬λ“€"이 "라이언" μ„ μƒλ‹˜κ³Ό ν•¨κ»˜ 가을 μ†Œν’μ„ κ°€λŠ” 쀑에 μ§•검닀리가 μžˆλŠ” κ°œμšΈμ„ λ§Œλ‚˜μ„œ κ±΄λ„ˆνŽΈμœΌλ‘œ κ±΄λ„ˆλ €κ³  ν•©λ‹ˆλ‹€. "라이언" μ„ μƒλ‹˜μ€ "λ‹ˆλ‹ˆμ¦ˆ μΉœκ΅¬λ“€"이 λ¬΄μ‚¬νžˆ 징검닀리λ₯Ό 건널 수 μžˆλ„λ‘ λ‹€μŒκ³Ό 같이 κ·œμΉ™μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

  • μ§•κ²€λ‹€λ¦¬λŠ” 일렬둜 놓여 있고 각 μ§•κ²€λ‹€λ¦¬μ˜ λ””λ”€λŒμ—λŠ” λͺ¨λ‘ μˆ«μžκ°€ μ ν˜€ 있으며 λ””λ”€λŒμ˜ μˆ«μžλŠ” ν•œ 번 λ°Ÿμ„ λ•Œλ§ˆλ‹€ 1μ”© μ€„μ–΄λ“­λ‹ˆλ‹€.
  • λ””λ”€λŒμ˜ μˆ«μžκ°€ 0이 되면 더 이상 λ°Ÿμ„ 수 μ—†μœΌλ©° μ΄λ•ŒλŠ” κ·Έ λ‹€μŒ λ””λ”€λŒλ‘œ ν•œλ²ˆμ— μ—¬λŸ¬ 칸을 κ±΄λ„ˆ λ›Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 단, λ‹€μŒμœΌλ‘œ λ°Ÿμ„ 수 μžˆλŠ” λ””λ”€λŒμ΄ μ—¬λŸ¬ 개인 경우 무쑰건 κ°€μž₯ κ°€κΉŒμš΄ λ””λ”€λŒλ‘œλ§Œ κ±΄λ„ˆλ›Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

"λ‹ˆλ‹ˆμ¦ˆ μΉœκ΅¬λ“€"은 개울의 μ™Όμͺ½μ— 있으며, 개울의 였λ₯Έμͺ½ κ±΄λ„ˆνŽΈμ— 도착해야 징검닀리λ₯Ό κ±΄λ„Œ κ²ƒμœΌλ‘œ μΈμ •ν•©λ‹ˆλ‹€.
"λ‹ˆλ‹ˆμ¦ˆ μΉœκ΅¬λ“€"은 ν•œ λ²ˆμ— ν•œ λͺ…μ”© 징검닀리λ₯Ό κ±΄λ„ˆμ•Ό ν•˜λ©°, ν•œ μΉœκ΅¬κ°€ 징검닀리λ₯Ό λͺ¨λ‘ κ±΄λ„Œ 후에 κ·Έ λ‹€μŒ μΉœκ΅¬κ°€ κ±΄λ„ˆκΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

λ””λ”€λŒμ— 적힌 μˆ«μžκ°€ μˆœμ„œλŒ€λ‘œ λ‹΄κΈ΄ λ°°μ—΄ stones와 ν•œ λ²ˆμ— κ±΄λ„ˆλ›Έ 수 μžˆλŠ” λ””λ”€λŒμ˜ μ΅œλŒ€ 칸수 kκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ΅œλŒ€ λͺ‡ λͺ…κΉŒμ§€ 징검닀리λ₯Ό 건널 수 μžˆλŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œ 사항


  • 징검닀리λ₯Ό κ±΄λ„ˆμ•Ό ν•˜λŠ” λ‹ˆλ‹ˆμ¦ˆ μΉœκ΅¬λ“€μ˜ μˆ˜λŠ” λ¬΄μ œν•œ 이라고 κ°„μ£Όν•©λ‹ˆλ‹€.
  • stones λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 200,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • stones λ°°μ—΄ 각 μ›μ†Œλ“€μ˜ 값은 1 이상 200,000,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • kλŠ” 1 이상 stones의 길이 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

풀이


νš¨μœ¨μ„± 체크가 있기 λ•Œλ¬Έμ— 이뢄탐색 μœΌλ‘œ ν•΄κ²° ‼️

 

οΉ‘min : κ±΄λ„ˆλŠ” 친ꡬ의 μ΅œμ†Œμ˜ 수

οΉ‘max : κ±΄λ„ˆλŠ” 친ꡬ의 μ΅œλŒ€μ˜ 수

 

canCrossStone() : ν˜„μž¬μ˜ 친ꡬ의 μˆ˜κ°€ k칸수 미만으둜 건널 수 μžˆλŠ” μ§€ 확인 

μ½”λ“œ


public class μ§•κ²€λ‹€λ¦¬κ±΄λ„ˆκΈ° {
    public static int solution(int[] stones, int k) {
        int answer = 0;

        int min = 1;
        int max = 200000000;

        while(min <= max){
            int mid = (min+max)/2;

            if(canCrossStone(stones, k, mid)){
                min = mid + 1;
                answer = Math.max(answer, mid);
            }
            else
                max = mid - 1;
        }

        return answer;
    }

    private static boolean canCrossStone(int[] stones, int k, int mid) {

        int skip = 0;
        for(int s : stones){
            if(s - mid < 0)
                skip++;
            else
                skip = 0;
                
            if(skip == k)
                return false;
        }

        return true;
    }

    public static void main(String[] args) {
        int[] stones = {2, 4, 5, 3, 2, 1, 4, 2, 5, 1};
        System.out.println(solution(stones, 3));
    }
}

 

728x90
λ°˜μ‘ν˜•