코딩테스트연습/이것이 취업을 위한 코딩테스트다

[이코테 - JAVA] 큰 수의 법칙

:)jun 2021. 11. 24. 00:12
// 프로덕션코드

import java.util.Scanner;

public class lawOfLargeNumber {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();

        String data = sc.nextLine();

    }
}

// 왜 nextInt만 3개 받아지고 바로 종료가 될까?

// 일단 하나씩 받아서 해결부터 해보자!

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

public class lawOfLargeNumber2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();

        int[] data = new int[n];
        for (int i = 0; i < n; i++) {
            data[i] = sc.nextInt();
        }

        Arrays.sort(data);
        int theMostLargestNumber = data[n - 1];
        int secondLargestNumber = data[n - 2];

        int[] arr = new int[k + 1];
        for (int i = 0; i < k; i++) {
            arr[i] = theMostLargestNumber;
        }
        arr[k] = secondLargestNumber;

        int cnt = 0;
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            cnt++;
            if (cnt == m) {
                break;
            }
            if (i == arr.length - 1) {
                i = -1;
            }
        }
        System.out.println(sum);
    }
}

// 성공! 처음 보는 사람도 읽기 쉽도록 리팩토링해보자.

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

public class lawOfLargeNumber2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();

        int[] data = new int[n];
        for (int i = 0; i < n; i++) {
            data[i] = sc.nextInt();
        }

        Arrays.sort(data);
        int theMostLargestNumber = data[n - 1];
        int secondLargestNumber = data[n - 2];

        int[] oneCycleArray = new int[k + 1];
        setOneCycleArray(k, theMostLargestNumber, secondLargestNumber, oneCycleArray);

        int cnt = 0;
        int sum = 0;
        System.out.println(getSum(m, oneCycleArray, cnt, sum));
    }

    private static int getSum(int m, int[] oneCycleArray, int cnt, int sum) {
        for (int i = 0; i < oneCycleArray.length; i++) {
            sum += oneCycleArray[i];
            cnt++;
            if (cnt == m) {
                break;
            }
            if (i == oneCycleArray.length - 1) {
                i = -1;
            }
        }
        return sum;
    }

    private static void setOneCycleArray(int k, int theMostLargestNumber, int secondLargestNumber, int[] oneCycleArray) {
        for (int i = 0; i < k; i++) {
            oneCycleArray[i] = theMostLargestNumber;
        }
        oneCycleArray[k] = secondLargestNumber;
    }
}

// 성공! 아래는 함께 모범 답안을 첨부한다.

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

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

        // N, M, K를 공백을 기준으로 구분하여 입력 받기
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();

        // N개의 수를 공백을 기준으로 구분하여 입력 받기
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        Arrays.sort(arr); // 입력 받은 수들 정렬하기
        int first = arr[n - 1]; // 가장 큰 수
        int second = arr[n - 2]; // 두 번째로 큰 수

        // 가장 큰 수가 더해지는 횟수 계산
        int cnt = (m / (k + 1)) * k;
        cnt += m % (k + 1);

        int result = 0;
        result += cnt * first; // 가장 큰 수 더하기
        result += (m - cnt) * second; // 두 번째로 큰 수 더하기

        System.out.println(result);
    }
}

 

 


 

첫번째 코드블록에서 왜 숫자 3개만 받아졌는지 알아냈다. (지연님 감사합니다!)

앞에 숫자를 받고 엔터를 쳐버리면 엔터가 입력값으로 받아진다.

이를 해결하기 위해서는

1. 중간에 scan.nextLine(); 삽입하기

2. nextLine()으로 받아서 parseInt로 변경해서 출력하기

3. 스캐너를 두 개 받기

그 중 1번이 가장 간단하다.

 

참고한 블로그를 아래에 첨부한다.

https://gongstudyit.tistory.com/m/18

 

[Java] nextInt( )사용 후 nextLine( ) 사용법

-Scanner.nextInt 메소드는 -->가장 마지막 개행문자(엔터,newline)을 제거하지않는다. 개행문자(엔터)전까지만 숫자로 입력받음. -->이부분에서 문제가 생김 nextInt( )와 nextLine( )을 사용시 넥스트인트에

gongstudyit.tistory.com