본문 바로가기

[BOJ] - JAVA

[백준] 10825 : 국영수 JAVA 풀이

이름과 성적들을 2차원 배열에 저장하고 람다식으로 정렬하려고 했는데 잘안됐다.

Student라는 클래스를 정의하고, 인원수 만큼 객체를 생성한 다음 조건에 맞게 정렬해줬다.

import java.io.*;
import java.util.*;
public class ArrayEx1{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 인원수를 입력받음
        int N = Integer.parseInt(br.readLine());
        
        // N명의 정보를 저장할 Student 타입의 배열 생성
        Student[] students = new Student[N];
        
        for(int i=0;i<N;i++) {
        // 입력받은 한 줄을 공백을 기준으로 나눔
        	String[] score = br.readLine().split(" ");
        	
            // 이름, 국어, 영어, 수학 값을 생성자에 넘겨줘서 객체를 생성함
        	students[i] = new Student(score[0],
        			Integer.parseInt(score[1]),
        			Integer.parseInt(score[2]),
        			Integer.parseInt(score[3]));
        	}
        
        Comparator<Student> myComparator = new Comparator<Student>() {
        	@Override
            // 두 Student 객체를 비교함
        	public int compare(Student o1, Student o2) {
        		if(o1.korean==o2.korean) {
        			if(o1.english==o2.english) {
        				if(o1.math==o2.math) {
                        	// 이름 오름차순으로 정렬
        					return o1.name.compareTo(o2.name);
        				}
        				// 수학 점수 내림차순으로 정렬
        				return o2.math-o1.math;
        			}
                    // 영어 점수 오름차순으로 정렬
        			return o1.english - o2.english;
        		}
                // 국어 점수 내림차순으로 정렬
        		return o2.korean-o1.korean;
        	}
        };
        // 위 조건을 이용해 students 배열을 정렬
        Arrays.sort(students, myComparator);
        // 정렬된 객체들의 이름만 출력
        for(int i=0;i<N;i++) System.out.println(students[i].name);
    }
    
    
}

class Student{
	String name;
	int korean;
	int english;
	int math;
	
	Student(String name, int korean, int english, int math){
		this.name = name;
		this.korean = korean;
		this.english = english;
		this.math = math;
	}
}

 

시간이 지나 다시 2차원 String 배열의 형태로 문제를 풀어봤다.

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());
        String[][] arr = new String[n][4];
        for(int i=0;i<n;i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            arr[i][0] = st.nextToken();
            arr[i][1] = st.nextToken();
            arr[i][2] = st.nextToken();
            arr[i][3] = st.nextToken();
        }
        
        Arrays.sort(arr,(o1,o2)->{
            
            // equals()는 문자열의 내용이 같은지 비교
            // String==String은 두 String의 주소값이 같은지 비교하는 것임
            
            if(o1[1].equals(o2[1])){
                if(o1[2].equals(o2[2])){
                    if(o1[3].equals(o2[3])){
                    
                    // String.compareTo()는 문자열을 비교하는 메서드
                    // a 같은 숫자가 아닌 문자열에는 Integer.parseInt()사용할 수 없음!!
                    // 문자열로 이루어진 과목명을 비교하기 위해서 사용함
                        return o1[0].compareTo(o2[0]);
                    }
                    
                    // 과목의 점수는 숫자이기 때문에 int로 변환해서 비교하는 것이 가능한 것
                    return Integer.parseInt(o2[3])-Integer.parseInt(o1[3]);
                }
                return Integer.parseInt(o1[2])-Integer.parseInt(o2[2]);
            }
            
                return Integer.parseInt(o2[1])-Integer.parseInt(o1[1]);
            
        });
        for(int i=0;i<n;i++){
            System.out.println(arr[i][0]);
        }
    }
}