1. 문제

www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

2. 접근방법

조건에 맞춰 정렬을 시킨 뒤

이름을 출력하는 문제

 

정렬만 하면 돼서 어렵지 않은 문제인데

 

merge sort 연습 할 겸 직접 정렬 알고리즘을 짜서 풀이 해봤다.

 

그리고 N이 10만 개라

하나하나 다 출력하면 시간이 오래 걸리니

 

StringBuilder 등을 활용해 

이름 + "\n" 을 저장하고

출력은 한번만 하도록 하자.

3. 자바 코드

package Silver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class P10825국영수 {
	static class person {
		String name;
		int guk;
		int yung;
		int su;

		public person(String name, int guk, int yung, int su) {
			this.name = name;
			this.guk = guk;
			this.yung = yung;
			this.su = su;
		}

	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int N = Integer.parseInt(br.readLine());

		person arr[] = new person[N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i] = new person(st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()),
					Integer.parseInt(st.nextToken()));
		}
		merge_sort(arr, 0, arr.length - 1);
		StringBuilder sb = new StringBuilder();
		for (person i : arr)
			sb.append(i.name + "\n");

		System.out.println(sb);
	}

	static void merge_sort(person arr[], int left, int right) {
		int mid;

		if (left < right) {
			mid = (left + right) / 2;
			merge_sort(arr, left, mid);
			merge_sort(arr, mid + 1, right);
			merge(arr, left, mid, right);
		}

	}

	static int compare(person a, person b) {
		if (a.guk < b.guk)
			return 1;
		else if (a.guk > b.guk)
			return -1;
		else {
			if (a.yung < b.yung)
				return -1;
			else if (a.yung > b.yung)
				return 1;
			else {
				if (a.su < b.su)
					return 1;
				else if (a.su > b.su)
					return -1;
				else {
					if (a.name.compareTo(b.name) <= 0)
						return -1;
					else
						return 1;
				}
			}
		}

	}

	static void merge(person arr[], int left, int mid, int right) {
		person sort[] = new person[right - left + 1];
		// 하나씩 비교
		int l = left;
		int r = mid + 1;
		int k = 0;
		while (l <= mid && r <= right) {
			int com = compare(arr[l], arr[r]);
			if (com < 0)
				sort[k++] = arr[l++];
			else
				sort[k++] = arr[r++];
		}
		// 남은 거 넣기
		if (l > mid)
			for (int i = r; i <= right; i++)
				sort[k++] = arr[i];
		else
			for (int i = l; i <= mid; i++)
				sort[k++] = arr[i];

		for (person i : sort)
			arr[left++] = i;
	}
}

4. 마치며

merge 소트는 어느정도 손에 익은 것 같다.

 

 

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준] 1270 전쟁 - 땅따먹기  (0) 2021.02.23
[백준] 1016 제곱ㄴㄴ수  (0) 2021.02.13
[백준] 2169 로봇조종하기  (1) 2021.02.07
[백준] 2056 작업  (0) 2021.02.03
[백준] 13460 구슬 탈출2  (0) 2021.02.03

+ Recent posts