관리 메뉴

사과하는 제라스

[백준 BOJ 2562번] 최댓값 본문

JAVA 백준 알고리즘 문제풀이/1차원 배열

[백준 BOJ 2562번] 최댓값

Xerath(제라스) 2021. 10. 12. 20:46

목차

    728x90
    반응형

    출처 : https://www.acmicpc.net/problem/2562

     

    2562번: 최댓값

    9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어

    www.acmicpc.net

     

    1. 문제

    9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

    예를 들어, 서로 다른 9개의 자연수

    3, 29, 38, 12, 57, 74, 40, 85, 61

    이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.


    2. 입력

    첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

     

    3
    29
    38
    12
    57
    74
    40
    85
    61

    3. 출력

    첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

    85
    8

    4. 풀이

    입력은 한 줄씩 읽어오기에 간단하게 BufferedReader로만 읽어오면 된다. 입력받은 값은 이전에 풀이한 10818번 문제 풀이와 같이 MIN_VALUE로 최댓값을 고정해두고 이후 for문으로 입력한 데이터들과 비교하며 최댓값을 변경 혹은 유지하면 된다. 이때 추가로 idx라는 변수를 미리 설정해두어 최댓값이 바뀔때 그때의 위치값(index)를 저장해둔다. 출력은 항상 쓰는 1. println() 2. StringBuilder 3. BufferedWriter를 사용하면 된다. 이번 문제에서는 BufferedWriter를 사용해보았다.

     

    다른 방법으로는 입력받은 데이터 배열을 Arrays.sort 함수를 활용하여 정렬한 배열을 하나 만들어서 그 최대값을 이용하는 방법을 사용했다.


    5. 소스코드

    1. 비교문을 통해서 최댓값 추출

    import java.io.*;
    
    class Main{
        public static void main(String [] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            int [] nums = new int [9];
            int stnd_Max = Integer.MIN_VALUE;
            int idx = 0;
            for(int i=0; i<9; i++) {
                nums[i] = Integer.parseInt(br.readLine());
                if(nums[i] > stnd_Max) {
                    stnd_Max = nums[i];
                    idx = i+1;
                }
            }
            bw.write(stnd_Max+"\n"+idx);
            bw.flush();
            bw.close();
        }
    }

    2. Arrays.sort 함수를 이용하여 정렬 후 최댓값 도출

    import java.io.*;
    import java.util.*;
    
    class Main{
        public static void main(String [] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            int [] nums = new int [9];
            for(int i=0; i<9; i++){
                nums[i] = Integer.parseInt(br.readLine());
            }
            int [] arr_nums = nums.clone();
            Arrays.sort(arr_nums);
            for(int i=0; i<9; i++){
                if(nums[i] == arr_nums[8]) bw.write(arr_nums[8]+"\n"+Integer.toString(i+1));
            }
            bw.flush();
            bw.close();
        }
    }

     

    6. 배운 것

    Arrays 클래스에 있는 sort함수를 사용하면 원하는 배열을 오름차순 or 내림차순으로 정렬을 할 수 있다.

    Arrays.sort(nums) -> 오름차순 정렬

    Arrays.sort(nums, Collections.reverseOrder()) -> 내림차순 정렬

    Arrays.sort(nums, 0, 5) -> 일부분( = [0]~[4]까지만) 정렬

    이는 String을 포함한 타 자료형들에도 적용할 수 있다.

    추가로, 객체 배열(2개 이상의 정보가 담긴 객체 배열)도 정렬을 할 수 있다.

     

    깊은 복사 vs 얕은 복사

    깊은 복사를 통해 아예 서로 다른 인스턴스를 갖는 것이 필요할 때는 Objects.clone()을 사용해서 for문없이 깊은 복사를 간단하게 할 수 있다.

    다음 글에서 깊은 복사와 얕은 복사를 할 수 있는 다양한 방법들을 알 수 있다.

    https://coding-factory.tistory.com/548

     

    [Java] 자바 배열을 복사하는 다양한 방법 (깊은복사, 얕은복사)

    자바에서 객체를 복사하는 유형으로 깊은 복사와 얕은 복사가 있습니다. 깊은 복사의 경우 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소 값만을 복사하는

    coding-factory.tistory.com

     

    728x90
    반응형