[이코테] 정렬(Sort)

2024. 12. 26. 23:25·PS/이코테

정렬

  • 정렬이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다.
  • 일반적으로 문제 상황에 따라서 적절한 정렬 알고리즘이 공식처럼 사용되며, 가장 많이 사용되는 알고리즘 중 하나이다.

예제 1) 위에서 아래로

다양한 수로 이루어진 하나의 수열을 내림차순으로 정렬하는 프로그램을 만드시오.

 

문제 해설

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        Integer[] array = new Integer[n];
        for (int i = 0; i < n; i++) {
            array[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(array, Collections.reverseOrder());

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append(array[i] + " ");
        }

        System.out.println(sb);
    }
}

 

 

 

 

예제 2) 성적이 낮은 순서로 학생 출력하기

N명의 학생 정보(학생의 이름, 학생의 성적)가 주어졌을 때, 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오.

 

문제 해설

  • Comparable의 compareTo 메서드로 학생의 성적을 기준으로 정해서 성적이 낮은 순서대로(오름차순) 정렬한다.
import java.io.*;
import java.util.*;

class Student implements Comparable<Student>{
    String name;
    int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return this.name;
    }

    public int getScore() {
        return this.score;
    }

    //성적이 낮은 순서대로 정렬(오름차순)
    @Override
    public int compareTo(Student other) {
        return this.score - other.score;
    }
}

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int n = Integer.parseInt(br.readLine());    //학생 수

        List<Student> students = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            int score = Integer.parseInt(st.nextToken());

            students.add(new Student(name, score));
        }

        Collections.sort(students);

        for (int i = 0; i < students.size(); i++) {
            System.out.print(students.get(i).getName() + " ");
        }
    }
}



 

 

 

예제 3) 두 배열의 원소 교체

N개의 자연수인 원소로 구성된 배열 A와 B가 주어졌을 때, 최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A 중에서 모든 원소의 합이 최대가 되도록 프로그램을 작성하시오. 바뀌치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는 원소를 서로 바꾸는 것을 말한다.

 

문제 해설

  • 배열 A의 모든 원소의 합이 최대가 되도록 하려면, 배열 A의 가장 작은 수와 배열 B의 가장 큰 수를 교체한다.
  • 배열 A는 오름차순, 배열 B는 내림차순 정렬한 후, 첫 번째 인덱스부터 비교한다.
  • 이 때, (배열 A의 원소) < (배열 B의 원소) 일 때에만 교체한다.
import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());   //원소 개수
        int k = Integer.parseInt(st.nextToken());   //바꿔치기 연산 횟수

        Integer[] arrayA = new Integer[n];
        Integer[] arrayB = new Integer[n];
        StringTokenizer st1 = new StringTokenizer(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            arrayA[i] = Integer.parseInt(st1.nextToken());
            arrayB[i] = Integer.parseInt(st2.nextToken());
        }

        Arrays.sort(arrayA);    //배열A 오름차순 정렬
        Arrays.sort(arrayB, Collections.reverseOrder());    //배열B 내림차순 정렬

        for (int i = 0; i < k; i++) {
            if (arrayA[i] < arrayB[i]) {    //배열A의 원소가 배열B의 원소보다 작을 때만 바꿔치기 수행
                int temp = arrayA[i];
                arrayA[i] = arrayB[i];
                arrayB[i] = temp;
            } else {
                break;
            }
        }

        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += arrayA[i];
        }

        System.out.println(sum);
    }
}

[참고]

이것이 취업을 위한 코딩 테스트다 with 파이썬

저작자표시 비영리 변경금지 (새창열림)

'PS > 이코테' 카테고리의 다른 글

[이코테][Java] 국영수  (0) 2025.01.09
[이코테][Java] 안테나  (0) 2024.12.28
[이코테][Java] 문자열 재정렬  (0) 2024.11.19
[이코테][Java] 럭키 스트레이트  (0) 2024.11.19
[이코테] 구현(Implementation)  (0) 2024.11.18
'PS/이코테' 카테고리의 다른 글
  • [이코테][Java] 국영수
  • [이코테][Java] 안테나
  • [이코테][Java] 문자열 재정렬
  • [이코테][Java] 럭키 스트레이트
nyrimmm
nyrimmm
  • nyrimmm
    개발기록
    nyrimmm
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (69)
      • Java (6)
      • Spring & SpringBoot (3)
      • Network (1)
      • DataBase (0)
      • SQL (1)
      • IntelliJ (3)
      • Git (0)
      • 자료구조 & 알고리즘 (2)
      • 트러블 슈팅 (1)
        • Spring (1)
      • PS (51)
        • 백준 (11)
        • 프로그래머스 (0)
        • SQL (9)
        • 이코테 (31)
      • 후기 & 회고 (1)
  • 태그

  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
nyrimmm
[이코테] 정렬(Sort)
상단으로

티스토리툴바