[코테 준비 : day15] 정렬

Eunjin·2023년 5월 3일
0

1. K번째수(다시 풀기)

https://school.programmers.co.kr/learn/courses/30/lessons/42748

[문제 풀이 고민]
1. command에서 i,j,k를 하나씩 저장함
2. i ~ j까지 자른 배열을 저장
3. 자른 배열을 새로 재정렬
4. 재정렬한 배열에서 k번째 수를 뽑아서 answer에 저장

import java.util.*;
class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];

        for(int a = 0; a < commands.length; a++){
            int i = commands[a][0];
            int j = commands[a][1];
            int k = commands[a][2] - 1;

            //새로 정렬할 배열의 길이 계산
            int position = j - i + 1;

            //i ~ j 까지의 길이를 저장하기 위한 배열
            int[] arr = new int[position];
            //0부터 저장하기 위한 숫자
            int c = 0;

            //i ~ j 까지 저장
            for(int b = i; b < j - i; b++){
                arr[c] = array[b];
                c++;
            }

            //정렬
            Arrays.sort(arr);

            //k번째 있는 수를 저장
            answer[a] = arr[k];
        }

        return answer;
    }
}


2. 가장 큰 수

https://school.programmers.co.kr/learn/courses/30/lessons/42746


[문제 풀이 고민]

(출력) 배열을 재배치해서 만들 수 있는 가장 큰 수를 문자열로 바꾸어 리턴

  • 배열의 숫자들을 조합해서 가장 큰 숫자를 만드는 것
  1. 먼저 String 배열에 number들을 넣는다.
  2. 넣은 number들을 비교해서 큰수가 올 수 있도록 함
    : (o1, o2) -> (o2 + o1).compareTo(o1 + o2)은, 두 개의 문자열 o1과 o2를 받아서, 두 문자열을 이어붙인 o2+o1와 o1+o2를 비교하여, 더 큰 문자열이 먼저 오도록 정렬하는 기준을 정의
  3. StringBuffer를 사용해서 큰순서대로 있는 string배열을 이어 붙인다.
    : StringBuffer를 사용하는 이유는 String을 합치는 연산이 많을수록 StringBuilder가 유리하기 때문이다.
import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {
        String[] arr = new String[numbers.length];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = String.valueOf(numbers[i]);
        }

        //큰 수가 먼저 올 수 있도록
        Arrays.sort(arr ,(o1, o2) -> (o2 + o1).compareTo(o1 + o2));

        if(arr[0].equals("0"))
            return "0";

        StringBuffer answer = new StringBuffer();

        for(int i = 0; i < arr.length; i++){
            answer.append(arr[i]);
        }

        return answer.toString();
    }
}

[주의]
1. (o2 + o1).compareTo(o1 + o2)와 (o1 + o2).compareTo(o2 + o1)의 차이
o1이 "3"이고 o2가 "30"이라면,
(o2 + o1).compareTo(o1 + o2)은 "330"이 "303"보다 크다고 판단하고,
(o1 + o2).compareTo(o2 + o1)은 "330"이 "303"보다 작다고 판단

  1. StringBuffer 자료형
  • append 메서드를 사용하여 계속해서 문자열을 추가해 나갈 수 있다.
  • toString() 메서드를 이용하여 String 자료형으로 변경이 가능하다
    (참고) https://wikidocs.net/276


3. H-Index

https://school.programmers.co.kr/learn/courses/30/lessons/42747


문제 풀이 고민 과학자의 H-Index를 리턴
H-Index : 발표한 논문n편 중, h번 이상 인용된 눈문이 h편 이상이고 나머지 논문이 h번 이하 인용 되었다면 h의 최댓값이 결과

  • n은 citations.length가 됨
  • 논문의 수를 줄여가면서 비교
  1. 먼저 과학자가 쓴 논문의 인용 배열을 큰수부터 차례대로 재정렬
  2. 정렬된 부분에서 점점 i 만큼 논문수에서 줄여가면서 비교함
    만약 논문수보다 크거나 같을때가 답이 됨
import java.util.Arrays;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;

        //과학자의 논문 인용 높은 순
        Arrays.sort(citations);

        for(int i = 0; i < citations.length; i++){
            int h = citations.length - i;

            if(citations[i] >= h){
                answer = h;
                break;
            }
        }

        return answer;
    }
}

-> 처음에 문제 이해가 안되서 이상한 방향으로 풀고 있었다.

0개의 댓글

관련 채용 정보