본문 바로가기
PS 문제 풀이/HackerRank

[HackerRank] Cut the sticks (Java)

by 까망 하르방 2021. 2. 14.
반응형

출처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

댓글