-
백준 13164번: 행복 유치원 (Python/Java)Algorithm/Algorithm Problem 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 알고리즘의 의미가 퇴색되는 기분이다. 그렇게 풀 바엔 그냥 볼일 다 보고 나중에 푸는 게 나을 수도 있다고 생각하기도 하고. 앞으로는 주의해서 미리 집중해서 풀어두거나, 아예 제대로 풀거나 해야겠다.
'Algorithm > Algorithm Problem' 카테고리의 다른 글
백준 16678번: 모독 (Python/Java) (0) 2022.01.20 백준 16564번: 히오스 프로게이머 (Python/Java) (0) 2022.01.19 백준 12904번: A와 B (Python/Java) (0) 2022.01.16 백준 3055번: 탈출 (Python/Java) (0) 2022.01.15 백준 16206번: 롤케이크 (Python/Java) (0) 2022.01.14