[C++] 백준 2110 - 공유기 설치

2023. 8. 28. 00:43·알고리즘 문제풀이/백준
반응형

<문제 링크> 

https://www.acmicpc.net/problem/2110

 

1450번: 냅색문제

첫째 줄에 N과 C가 주어진다. N은 30보다 작거나 같은 자연수, C는 109보다 작거나 같은 음이 아닌 정수이다. 둘째 줄에 물건의 무게가 주어진다. 무게도 109보다 작거나 같은 자연수이다.

www.acmicpc.net

<알고리즘 분류> 

 - 이분 탐색(Binary Search) 

<풀이> 

이 문제를 풀기 전에 파악해야 하는 점은, 

문제의 조건(가장 인접한 두 공유기 사이의 최대 거리)을 구하는 데에 있어서, "첫 번째 공유기"는 무조건 포함한다는 것이다. 

또한, 우리가 Focus해야 하는 부분은 "간격"이다. (공유기의 위치가 아니다.) 

예제를 예로 들어 보자. 

[1, 2, 4, 8, 9] 에서, 공유기 2개만 사용한다고 가정했을 때, 공유기 2개의 최대 간격은 8이다. 최소 간격은 1이다. 

결국 공유기 몇 개를 사용하던지 간에, 이 문제의 답은 1과 8 사이에 존재하는 것이다. 

여기까지 이해가 됐다면, 이제 그림을 보자. 

 

<코드>

#include <iostream>
#include <vector> 
#include <algorithm>
using namespace std;

int N, C; //N : 집의개수, C: 
vector <int> router; // 집 저장

int ShareCount(int mid){

    int prev = router[0];
    int count = 1;
    
    for(int i=1; i<N; i++){
        if (router[i] - prev >= mid){
            count++;
            prev = router[i];
        }
    }

    return count;
}
int main(){
    cin >> N >> C;
    for (int i=0; i<N; i++){
        int x;
        cin >> x;
        router.push_back(x);
    }
    int ans;
    sort(router.begin(), router.end());

    int l_gap = 1; 
    int r_gap = router[N-1];

    while(l_gap <= r_gap){
        int mid_gap = (l_gap + r_gap) / 2;

        if(ShareCount(mid_gap) >= C){
            ans = mid_gap;
            cout << "지금" <<ans << "\n";
            l_gap = mid_gap+1;
        }
        else{
            r_gap = mid_gap - 1;
        }
    }

    cout << ans;

}

 

이분 탐색 문제들이 그동안 나에게 조금 어렵게 느껴졌던 듯하다. 개강 전까지 이분탐색 문제들(응용+심화문제)을 풀어봐서 이분탐색에 익숙해져야겠다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 12015 - 가장 긴 증가하는 부분 수열 2  (1) 2023.08.28
[C++] 백준 1253 - 좋다  (2) 2023.08.28
[C++] 백준 1450 - 냅색문제  (1) 2023.08.26
[C++] 백준 2565 - 전깃줄  (0) 2023.08.24
[C++] 백준 2056 - 작업  (2) 2023.08.18
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [C++] 백준 12015 - 가장 긴 증가하는 부분 수열 2
  • [C++] 백준 1253 - 좋다
  • [C++] 백준 1450 - 냅색문제
  • [C++] 백준 2565 - 전깃줄
jiminai
jiminai
안녕하세요, 고려대학교 컴퓨터학과 학부생의 컴퓨터 공부 기록입니다👻
    반응형
  • jiminai
    컴퓨터 공부 Blog
    jiminai
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • AI Paper Review (9)
        • MLLMs (4)
        • Reinforcement Learning (2)
        • NLP (3)
      • 알고리즘 문제풀이 (18)
        • 백준 (17)
        • 프로그래머스 (1)
        • 알고리즘 이론 공부 (0)
      • AI 개념 정리 (2)
        • Pytorch 공부 (1)
      • Web Development (1)
      • 대외활동&프로젝트&대회 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 프로필
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다이나믹프로그래밍
    DP
    2056
    BFS
    벡준
    백준
    13975
    dfs
    2467
    개발
    이분탐색
    누적합
    두 배열의 합
    투포인터
    Dikjstra
    HACKUTHON 2023
    fasttext
    11000
    냅색문제
    가장긴증가하는부분수열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jiminai
[C++] 백준 2110 - 공유기 설치
상단으로

티스토리툴바