Algorithm/Algorithm Problem

백준 13164번: 행복 유치원 (Python/Java)

주유소짜글이 2022. 1. 17. 08:46

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

 

13164번: 행복 유치원

행복 유치원 원장인 태양이는 어느 날 N명의 원생들을 키 순서대로 일렬로 줄 세우고, 총 K개의 조로 나누려고 한다. 각 조에는 원생이 적어도 한 명 있어야 하며, 같은 조에 속한 원생들은 서로

www.acmicpc.net

 

 

 

접근


우선 근처에 있는 원생들의 키 차이를 알아야 한다. 그래야 어떻게 원생 그룹을 나눴을 때, 가장 많은 차이가 나는지 알 수 있기 때문이다. 바로 옆 원생들끼리의 차이를 구해 따로 리스트를 만든다. 이제 해당 리스트들을 오름차순으로 정렬한다. 이때 이 정렬을 기준으로 원생들의 키를 나눌 수 있다. 가장 차이가 많이 나는 원생들을 기준으로 나누는 건 피하고 나머지 원생들을 기준으로 더해준다. 즉, 정렬된 리스트들을 앞에서부터 더해주면 가장 작은 차이의 그룹 합을 구할 수 있다.

 

 

 

풀이


Python

kidsNum, groupNum = map(int, (input()).split())
heightList = list(map(int, (input()).split()))

diffList = []
for i in range(1, kidsNum):
    diffList.append(heightList[i]-heightList[i-1])
diffList.sort()

result = 0
for i in range(kidsNum-groupNum):
    result += diffList[i]

print(result)

 

Java

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);

        String[] firstLine = (scan.nextLine()).split(" ");
        int kidsNum = Integer.parseInt(firstLine[0]), groupNum = Integer.parseInt(firstLine[1]);

        String[] secondLine = (scan.nextLine()).split(" ");
        int[] heightList = new int[kidsNum];
        for(int i = 0 ; i < kidsNum ; i++){
            heightList[i] = Integer.parseInt(secondLine[i]);
        }

        int[] diffList = new int[kidsNum-1];
        for(int i = 1 ; i < kidsNum ; i++){
            diffList[i-1] = (heightList[i]-heightList[i-1]);
        }
        Arrays.sort(diffList);

        int result = 0;
        for(int i = 0 ; i < (kidsNum-groupNum) ; i++){
            result += diffList[i];
        }

        System.out.println(result);

    }

}

 

Java

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);

        String[] firstLine = (scan.nextLine()).split(" ");
        int kidsNum = Integer.parseInt(firstLine[0]), groupNum = Integer.parseInt(firstLine[1]);

        String[] secondLine = (scan.nextLine()).split(" ");
        int[] heightList = new int[kidsNum];
        for(int i = 0 ; i < kidsNum ; i++){
            heightList[i] = Integer.parseInt(secondLine[i]);
        }

        int[] diffList = new int[kidsNum-1];
        for(int i = 1 ; i < kidsNum ; i++){
            diffList[i-1] = (heightList[i]-heightList[i-1]);
        }
        Arrays.sort(diffList);

        int result = 0;
        for(int i = 0 ; i < (kidsNum-groupNum) ; i++){
            result += diffList[i];
        }

        System.out.println(result);

    }

}

 

후기


개인적인 일정으로 인해 문제를 풀 시간이 없어 엄청 대충 풀었던 문제다. 다시 생각해보니 풀이도 헷갈리고 나 스스로도 문제를 통해 얻을 수 있는 지식들이 제대로 체득되지 않은 것이 느껴졌다. 알고리즘을 풀 때, 이렇게 급하게 풀면 스스로도 이게 제대로 풀린 건지 모르고 허겁지겁 풀 때가 있다. 사실 그렇게 푸는 게 무슨 의미가 있냐는 생각이 들고, 1일 1 알고리즘의 의미가 퇴색되는 기분이다. 그렇게 풀 바엔 그냥 볼일 다 보고 나중에 푸는 게 나을 수도 있다고 생각하기도 하고. 앞으로는 주의해서 미리 집중해서 풀어두거나, 아예 제대로 풀거나 해야겠다.