Coding Test

백준 2217번 : 로프 (시간초과 해결과정)

연_우리 2021. 10. 25. 03:35
반응형


문제 이해하기

(예시가 하나밖에 없어서 이해하기 어려웠다..)

서로 다른 중량의 로프는 1개만 존재한다. 편하게 kg으로 생각해보자

10kg만큼 들 수 있는 로프가 1개, 15kg만큼 들 수 있는 로프가 1개이다.

10kg로프는 8kg을 들 수 있지만 12kg은 들 수 없다.

 

10kg과 15kg을 함께 사용할 떄,

15kg로프는 12kg을 들 수 있지만, 10kg로프는 12kg을 들 수 없다! 

▶ 결국엔 10kg 2개까지만 들 수 있다는 것이다.

 

예를 하나 더 들어보자

[8, 12, 5, 20, 4, 30] 총 6개 로프가 있다.

가장 높은 중량을 들기위해선 가장 높은 로프부터 선택해야한다

 

내림차순 정렬 : [30, 20, 12, 8, 5, 4] 

30 로프 사용 시 최대중량은 30

30+20 로프 사용 시 최대중량은 20+20 = 40 ⭐최대값

30+20+12 로프 사용 시 최대중량은 12+12+12 = 36

30+20+12+8 로프 사용 시 최대중량은 8+8+8+8 = 32

30+20+12+8+5 로프 사용 시 최대중량은 5+5+5+5+5 = 25

30+20+12+8+5+4 로프 사용 시 최대중량은 4+4+4+4+4+4 = 26

▶ N로프 사용 시 최대중량은 N*선택한순서

 

코드

import java.util.Scanner;

class Rope {
    int ropecount;
    int[] ropes;

    void scan_input(String inputed) {
        InputStream in = new ByteArrayInputStream(inputed.getBytes());
        System.setIn(in);
    }

    void scan() {
        Scanner scan = new Scanner(System.in);
        ropecount = scan.nextInt();
        ropes = new int[ropecount];
        for (int i = 0; i < ropes.length; i++) {
            ropes[i] = scan.nextInt();
        }
        scan.close();
    }

    void process() {
    
        //정렬
        int temp = 0;
        for (int i = 1; i < ropes.length; i++) {
            for (int j = 0; j < i; j++) {                       
                if(ropes[j] > ropes[i]){                        
                    temp = ropes[i];
                    for (int k = i; k > j; k--) {
                        ropes[k] = ropes[k-1];
                    }
                    ropes[j] = temp;
                }
            }
        }

		//최대값 확인
        int max = ropes[0] * (ropes.length);
        for (int i = 1; i < ropes.length; i++) {
            ropes[i] = ropes[i] * (ropes.length-i);
            if(max < ropes[i]){
                max = ropes[i];
            }
        }

        System.out.println(max);
    }
}

public class Main {
    public static void main(String[] args) {
        Rope r = new Rope();
        r.scan();
        r.process();
    }
}

 

위 코드의 결과는

 

혹시 Scanner때문인가.. 해서 다시 풀어봤다

import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

class Rope {
    int ropecount;
    int[] ropes;

    void scan_input(String inputed) {
        InputStream in = new ByteArrayInputStream(inputed.getBytes());
        System.setIn(in);
    }

    void scan() throws IOException {
//        Scanner scan = new Scanner(System.in);
//        ropecount = scan.nextInt();
//        ropes = new int[ropecount];
//        for (int i = 0; i < ropes.length; i++) {
//            ropes[i] = scan.nextInt();
//        }
//        scan.close();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        ropecount = Integer.parseInt(st.nextToken());
        ropes = new int[ropecount];
        for (int i = 0; i < ropes.length; i++) {
            st = new StringTokenizer(br.readLine());
            ropes[i] = Integer.parseInt(st.nextToken());
        }
    }

    void process() {
    
        //정렬
        int temp = 0;
        for (int i = 1; i < ropes.length; i++) {
            for (int j = 0; j < i; j++) {                       
                if(ropes[j] > ropes[i]){                        
                    temp = ropes[i];
                    for (int k = i; k > j; k--) {
                        ropes[k] = ropes[k-1];
                    }
                    ropes[j] = temp;
                }
            }
        }

		//최대값 확인
        int max = ropes[0] * (ropes.length);
        for (int i = 1; i < ropes.length; i++) {
            ropes[i] = ropes[i] * (ropes.length-i);
            if(max < ropes[i]){
                max = ropes[i];
            }
        }

        System.out.println(max);
    }
}

public class Main {
    public static void main(String[] args) {
        Rope r = new Rope();
        try {
            r.scan();
        } catch (IOException e) {
            e.printStackTrace();
        }
        r.process();
    }
}

과연 결과는?!

 

이제 예상해볼수있는건 정렬시간 뿐이다....

정렬하는 과정이 문제의 의도라고 생각했는데..?????

확인을 위해 Scanner로 다시 돌려보겠다

package BJ211024_2217;

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;

class Rope {
    int ropecount;
    int[] ropes;

    void scan_input(String inputed) {
        InputStream in = new ByteArrayInputStream(inputed.getBytes());
        System.setIn(in);
    }

    void scan() throws IOException {
        Scanner scan = new Scanner(System.in);
        ropecount = scan.nextInt();
        ropes = new int[ropecount];
        for (int i = 0; i < ropes.length; i++) {
            ropes[i] = scan.nextInt();
        }
        scan.close();

//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        StringTokenizer st = new StringTokenizer(br.readLine());
//
//        ropecount = Integer.parseInt(st.nextToken());
//        ropes = new int[ropecount];
//        for (int i = 0; i < ropes.length; i++) {
//            st = new StringTokenizer(br.readLine());
//            ropes[i] = Integer.parseInt(st.nextToken());
//        }
    }

    void process() {
        //정렬
//        int temp = 0;
//        //System.out.println(Arrays.toString(ropes));
//        for (int i = 1; i < ropes.length; i++) {
//            for (int j = 0; j < i; j++) {                       //System.out.print("key="+ropes[i]+" vs ropes["+j+"]="+ropes[j]);
//                if(ropes[j] > ropes[i]){                        //System.out.print(" insert  ");
//                    temp = ropes[i];
//                    for (int k = i; k > j; k--) {
//                        ropes[k] = ropes[k-1];
//                    }
//                    ropes[j] = temp;
//                }
//                //System.out.println();
//                //System.out.println(Arrays.toString(ropes));
//            }
//            //System.out.println();
//        }

        Arrays.sort(ropes);

        int max = ropes[0] * (ropes.length);
        for (int i = 1; i < ropes.length; i++) {
            ropes[i] = ropes[i] * (ropes.length-i);
            if(max < ropes[i]){
                max = ropes[i];
            }
        }
        System.out.println(max);
    }
}

public class Main {
    public static void main(String[] args) {
        Rope r = new Rope();
        r.scan();
        r.process();
    }
}

 

아.. 정렬시간이 문제였다!

정렬방법의 시간복잡도를 찾아보게 해준 문제였다

나중에 정리해봐야겠당

반응형

'Coding Test' 카테고리의 다른 글

백준 1026번 : 보물  (0) 2021.10.27
백준 1946번 : 신입사원  (0) 2021.10.26
백준 2839번 : 설탕 배달  (2) 2021.10.23
백준 19941번 : 햄버거 분배  (0) 2021.10.21
백준 9009번 : 피보나치  (0) 2021.10.20
  • 네이버 블러그 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 구글 플러스 공유하기
  • 카카오톡 공유하기