코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍
알고리즘/백준

24938번 : 키트 분배하기

알고리즘/백준

24938번 : 키트 분배하기

2023. 7. 31. 10:49

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

 

24938번: 키트 분배하기

서울과학고 기숙사에는 $N$개의 방이 일렬로 나열되어 있습니다. 교사들은 교내 방역을 위해 기숙사의 각 방에 진단 키트를 제공했습니다. 그러나 분배 과정에서 실수가 있었고, 방마다 받은 키

www.acmicpc.net

 

 

문제

서울과학고 기숙사에는 N개의 방이 일렬로 나열되어 있습니다. 교사들은 교내 방역을 위해 기숙사의 각 방에 진단 키트를 제공했습니다.

그러나 분배 과정에서 실수가 있었고, 방마다 받은 키트의 수가 다르게 되었습니다. 구체적으로, i번 방에서 받은 키트의 수는 Ai개입니다. 학생들은 이 상황을 해결하기 위해 키트를 서로 주고받기로 했습니다.

서로 멀리 떨어진 방끼리 키트를 주고받으면 소란스럽기 때문에, 키트는 인접한 방끼리만 주고받을 수 있습니다. 이때 한 방에서 인접한 다른 방으로 키트 한 개를 건네줄 때 혼잡도가 1 증가합니다. 당연하게도, 키트가 없는 방에서는 다른 방으로 키트를 건네줄 수 없습니다.

혼잡도가 너무 높으면 학생들이 벌점을 받을 수 있기 때문에, 학생들은 혼잡도를 최소로 하여 모든 방이 같은 수의 키트를 가지고 있도록 할 계획입니다. 이때 목표를 달성하기 위한 혼잡도의 최솟값을 구해 봅시다. 전체 키트의 수는 방의 수의 배수임이 보장됩니다.

 

 

입력

첫 줄에는 방의 개수를 나타내는 정수 N이 주어집니다.

다음 줄에는 각 방이 초기에 받은 키트 수를 나타내는 정수 A1, A2, ⋯, An이 공백을 사이에 두고 주어집니다.

 

 

출력

최소의 혼잡도를 출력합니다.

 

 

제한

ㅁㅁ

 

 

소스코드

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

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

        int n = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        long arr[] = new long[n];
        long sum = 0;
        
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            sum += arr[i];
        }
        
        long r = sum / n;
        long result = 0;
        for (int i = 0; i < n - 1; i++) {
            if(arr[i]>=r) {
                arr[i + 1] += (arr[i] - r);
                result += (arr[i] - r);
            } else {
                arr[i + 1] -= (r - arr[i]);
                result += (r - arr[i]);
            }
        }
        
        System.out.println(result);
    }
}

 

 

해결방법

결국 모든 키트의 수를 일정하게 나눠야 하기 때문에 [키트의 개수 / 방의 개수] 결과 값(R)으로 분배되어야 한다.

단순히 1번방이 R보다 작다면 인접한 2번방에서 필요한 만큼 받으면 되고, R보다 크다면 큰만큼 2번방에게 건네주면 된다. 이를 n-1번 반복하면 된다.

 

1번방이 R보다 작다 => 결국 어디선가 받아야 한다.

1번방이 R보다 크다 => 결국 누군가에게 넘기긴 해야한다.

 

예제2

7
2 6 3 2 5 4 6
4 4 3 2 5 4 6 => 혼잡도 2 증가
4 4 3 2 5 4 6 => 혼잡도 0 증가
4 4 4 1 5 4 6 => 혼잡도 1 증가
4 4 4 4 2 4 6 => 혼잡도 3 증가
4 4 4 4 4 2 6 => 혼잡도 2 증가
4 4 4 4 4 4 4 => 혼잡도 2 증가
총 혼잡도 => 10

'알고리즘 > 백준' 카테고리의 다른 글

2212번 : 센서  (0) 2023.08.02
19539번 : 사과나무  (0) 2023.07.31
3216번 : 다운로드  (0) 2023.07.30
14502번 연구소  (0) 2023.06.20
오큰수  (0) 2023.06.14
  • 문제
  • 입력
  • 출력
  • 제한
  • 소스코드
  • 해결방법
'알고리즘/백준' 카테고리의 다른 글
  • 2212번 : 센서
  • 19539번 : 사과나무
  • 3216번 : 다운로드
  • 14502번 연구소
코딍코딍
코딍코딍
ㅎ2

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.