TIL 2022-03-13-일

그린·2022년 3월 13일
0

TIL

목록 보기
20/47

1. 오늘 학습한 내용

백준 카운팅정렬 2108번 문제

2. 알게 된 내용

  • 배열 복사 방법
    배열 복사에는 얕은 복사와 깊은 복사가 있다.
    얕은 복사 : 이름만 다르게 해서 같은 배열을 가리키는 것
    [깊은 복사] : 배열 요소들을 복사해서 다른 복제 배열을 만드는 것
    int[] a = { 1, 2, 3, 4 };
    int[] b = a.clone();      // 배열.clone() 메서드로 쉽게 깊은 복사 가능
    출처 : [Java] 자바 배열을 복사하는 다양한 방법 (깊은복사, 얕은복사)

  • Math.round() : 정수로 반올림
    Math클래스의 round()함수는 실수의 소수점 첫번째 자리를 반올림하여 정수로 리턴시켜준다.
    double pie = 3.14159265358979;
    System.out.println(Math.round(pie)); //결과 : 3
    출처 : [Java] 자바 소수점 n번째 자리까지 반올림하기

  • 자바에서 배열을 원하는 값으로 모두 초기화하고 싶을 때
    Arrays클래스의 fill() 메서드를 이용하면 된다.
    Arrays.fill(arr, -1); // arr배열의 요소 값을 모두 -1으로 초기화
    출처 : Java에서 모든 배열 요소를 0으로 초기화

  • 2108번 문제에서 최빈값 구하기
    여러가지 방법이 있지만, 여러가지를 읽어봤는데 개인적으로 이해가 잘 되지는 않아서.. 아래 링크 영상에서 설명해주신 원리대로, 카운팅정렬에서 카운팅 배열을 만드는 것처럼 카운팅 배열을 만들고 그 배열을 순회하면서 최빈값 (+ 여러개가 있는 경우 두번째로 큰 값)을 출력하도록 했다.
    * 원리를 보고 구현한 코드

    	```java
        int[] counting_2 = new int[8001]; // [3. 최빈값]에서 이용할 배열
        
        for (int i = 0; i < arr.length; i++) {
            counting[arr[i]+4000]++;
            counting_2[arr[i]+4000]++;    // [3. 최빈값]에서 이용할 것임
        }
        
        // 3. 최빈값
        int max_count = 0;     // 최빈값의 개수
        int max_num_idx = 0;   // 처음 나온 최빈값의 인덱스
        for (int i = 0; i < counting_2.length; i++) {  // 가장 많은 개수 찾기
            if (counting_2[i] > max_count) {
                max_count = counting_2[i];
                max_num_idx = i;
            }
        }
        for (int i = 0; i < counting_2.length; i++) {
            if (counting_2[i] == max_count && max_num_idx != i) { // 최빈값이 여러개가 있는 경우
                bw.write(i - 4000 + "\n");       // 두번째로 작은 값을 출력
                break;
            }
            if (i == counting_2.length - 1)   // 마지막까지 갔는데도 최빈값이 여러개가 아닌 경우
                bw.write(max_num_idx - 4000 + "\n");
        }
     	```

    (메모리 사용량/시간 모두 괜찮아보인다!)

    원리 출처 : 알고리즘 문제풀이 - 백준 온라인(BOJ) 2108번 문제

  • 카운팅 정렬에서 누적 개수 합 꼭 구하기!!
    처음에 구현할 때 그냥 개수만 세고 누적 개수 합을 빠뜨렸었는데 잊지 말고 꼭 구현하자!!

3. 느낀 점

최빈값만 구하는 것에서 그치지 않고 최빈값이 여러개가 있을 경우 두번째로 큰 값을 출력하는 것이 어려워서 결국 여러 설명들을 찾아보았다. 여러 사람들이 올려주신 코드들을 다 이해하지는 못했지만.. 위에서 쓴대로 구현한 코드의 원리도 좋은 것 같다.
어제오늘 카운팅 정렬 문제들을 풀면서 이제 카운팅 정렬 원리에 대해 많이 익숙해진 것 같다. 하지만 합병정렬은 혼자 구현하기에는 아직도 많이 어색한데, 다음주에 합병정렬을 이용해서 정렬문제들을 조금 풀어봐야겠다.

profile
기록하자

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN