반응형
출처: https://www.hackerrank.com/challenges/cut-the-sticks/problem
① 막대기들에서 가장 작은 길이를 구한다.
② 위에서 구한 길이로 각 막대길의 길이를 잘라낸다.
길이가 0 이하이면 배열(리스트)에서 제외
③ 남은 막대의 개수를 결과로 출력하고,
리스트에는 남은 막대기의 길이를 표시
④ 위의 과정 ①~③ 반복하며 남은 막대기가 없어질 때까지 반복
Input
6
5 4 4 2 2 8
Output
6
4
2
1
- 1단계) [5 4 4 2 2 8]에서 가장 작은 길이 = 2 | 자른 막대기 개수 = 6개
- 2단계) [3 2 2 _ _ 6]에서 가장 작은 길이 = 2 | 자른 막대기 개수 = 4개
- 3단계) [1 _ _ _ _ 4]에서 가장 작은 길이 = 1 | 자른 막대기 개수 = 2개
- 4단계) [_ _ _ _ _ 3]에서 가장 작은 길이 = 3 | 자른 막대기 개수 = 1개
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 막대기 개수
int n = sc.nextInt();
// 각 막대기 입력
List<Integer> sticks = new ArrayList<>();
for(int i=0; i<n; i++) {
sticks.add(sc.nextInt());
}
// 막대가 없어질 때까지
while(sticks.size() > 0) {
// 현재 남은 막대의 개수
System.out.println(sticks.size());
// 남은 막대기에서 가장 작은 막대의 길이 구하기
int minLen = MinOfSticks(sticks);
// 구한 길이로 각 막대기의 길이를 줄인다.
// 리스트는 배열과 달리 함수 반환값을 받을 필요가 없다.
CutSticks(sticks, minLen);
}
}
private static int MinOfSticks(List<Integer> sticks) {
int minVal = sticks.get(0);
for(int i=1; i<sticks.size(); i++) {
minVal = (minVal < sticks.get(i)) ? minVal : sticks.get(i);
}
return minVal;
}
// 막대기가 한개라도 남아 있다는 조건하에 동작된다.
private static void CutSticks(List<Integer> sticks, int minLen) {
int idx = 0;
while(true) {
// 더이상 탐색할 막대기가 없다면 종료
if(idx >= sticks.size()) break;
// 막대기 자르기
int temp = sticks.get(idx) - minLen;
// 막대기가 없어졌다면 리스트에서 제거
if(temp <= 0) {
// 원소에서 제거함으로서 인덱스 변화는 없다.
sticks.remove(idx);
}else {
// 아직 막대기 길이가 남아 있다면 길이만 변경
sticks.set(idx, temp);
// 다음 막대기로 탐색
idx++;
}
}
}
}
반응형
'PS 문제 풀이 > HackerRank' 카테고리의 다른 글
[HackerRank] Repeated String (Java) (0) | 2021.02.14 |
---|---|
[HackerRank] Almost Sorted (Java) (0) | 2021.02.14 |
[HackerRank] Kangaroo (Java) (0) | 2021.02.14 |
[HackerRank] The Power Sum (0) | 2021.02.14 |
[HackerRank] Absolute Permutation (0) | 2021.02.14 |
댓글