이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Baekjoon] 1654: 랜선 자르기

  • 2023.03.11 16:03
  • Algorithm/PS
글 작성자: SeoArc

문제

다양한 길이를 가진 n개의 랜선을 가지고 일정한 길이를 가진 k개의 랜선을 만들 때 만들 수 있는 최대 길이를 구하는 문제이다.

 

풀이

내 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Q1654 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] nk = br.readLine().split(" ");
        int n = Integer.parseInt(nk[0]);
        int k = Integer.parseInt(nk[1]);
        long[] lines = new long[n];

        long max = 0;
        for (int i = 0; i < n; i++) {
            lines[i] = Long.parseLong(br.readLine());
            max = Long.max(max, lines[i]);
        }
        
        // 이분 탐색
        // 랜선 개수는 중복으로 나올 수 있기 때문에 UpperBound로 접근 후 -1
        long left = 0;
        long right = max + 1;
        while (left < right) {
            long mid = (left + right) / 2;

            long count = 0; // 자른 랜선 개수
            for (long line : lines) {
                count += line / mid;
            }
            
            // 개수가 k보다 작으면 랜선을 길게 자른 것이므로 right 값 변경
            if (count < k) {
                right = mid;
                continue;
            }
            
            // 아니면 left 값 변경
            left = mid + 1;
        }

        System.out.println(right - 1);
    }
}

선형 탐색으로는 시간초과가 나기 때문에 이분 탐색으로 접근했다.

처음에 UpperBound / LowerBound 개념을 몰라서 헤메다가 결국 공부하고 다시 문제를 풀었다.

 

간단하게 기본 예제를 예를 들어 설명하면,

4 11
802
743
457
539

이 값에서 이분 탐색을 한다 하면, 1부터 803 사이의 값을 탐색한다.

즉 다음과 같이 803개의 배열에서 각 인덱스의 값은 랜선의 개수라고 생각하면 편리하다.

여기서 왜 802가 아닌 803을 right값으로 잡을까?

 

이유는, UpperBound이기 때문이다. UpperBound는 항상 원하는 값의 초과값을 가져다준다.

여기서 802를 right로 잡게될 경우, n과 k값이 1일 때 결과는 802여야 한다. 하지만 right는 절대 803이 될 수 없기 때문에 802 - 1인 801이 결과로 나오게 된다. 때문에 right를 나올 수 있는 최대 길이보다 +1 된 상태로 만들어 주어야 한다.

여기서 UpperBound로 값을 구하면 k+1의 첫번째 값, 즉 201을 구할 수 있다.

여기서 k의 최대길이 값은 구한 값에서 -1 이기 때문에 결괏값에 -1 을 하면 정답을 구할 수 있다.

 

회고

이분 탐색의 경곗값에 대한 개념과 right값 설정에서 많이 막힌 것 같다. 실버 문제라고 해서 만만하게 봤었지만 푸는데 좀 힘들었던 것 같다. 좀 더 기본을 단단히 다져야겠다.

'Algorithm > PS' 카테고리의 다른 글

[Baekjoon] 6064: 카잉 달력  (0) 2023.03.18
[Baekjoon] 17626: Four Squares  (0) 2023.03.17
[Baekjoon] 1167: 트리의 지름  (0) 2023.03.08
[Baekjoon] 7662: 이중 우선순위 큐  (0) 2023.03.08
[Baekjoon] 2533: 사회망 서비스(SNS)  (0) 2023.03.02

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Baekjoon] 6064: 카잉 달력

    [Baekjoon] 6064: 카잉 달력

    2023.03.18
  • [Baekjoon] 17626: Four Squares

    [Baekjoon] 17626: Four Squares

    2023.03.17
  • [Baekjoon] 1167: 트리의 지름

    [Baekjoon] 1167: 트리의 지름

    2023.03.08
  • [Baekjoon] 7662: 이중 우선순위 큐

    [Baekjoon] 7662: 이중 우선순위 큐

    2023.03.08
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (109)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (5)
      • Spring (3)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (1)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • algorithm
  • 알고리즘
  • 네트워크
  • java
  • network
  • 그래프
  • graph
  • 자바

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바