Algorithm/정렬(Sort)

[백준 1302번] 베스트셀러(Java 풀이)

agility 2020. 2. 15. 15:49

백준알고리즘 1302번 : 베스트셀러

 

기존에 풀었던 문제와 조금은 달랐던 것이, sort를 할 숫자와 문자를 주어주었던 반면,

이번엔 직접 받아서 어느 책이 몇개 팔렸는지 세고, 이를 정렬하여 출력하여야 했기 때문이다.

그래서 solved.ac에서 silver 4레벨로 책정된 것인지. 물론 체감은 크지 않았다.

 

책의 이름(String)과 판매된 갯수(int)를 field로 갖는 book 객체를 선언하고,

Comparable interface를 implements하여 compareTo method를 override하는 것 까지는 일치하다.

 

차이는 book 객체를 parameter로 받는 ArrayList에 book 객체를 담을 때이다.

ArrayList내에 담겨 있는 book 객체들의 String field 값 중,

1. Scanner로 받아온 책의 이름과 일치하는 것이 없으면, 새로운 객체를 ArrayList에 담아주고

2. Scanner로 받아온 책의 이름과 일치하는 것이 있으면, 기존 객체의 int field 값(판매된 갯수)을 늘려준다.

 

또 한가지 주의할 점은,

판매된 갯수가 같고, 앞 글자에서부터 비교했는데도 동일한 경우이다.

예를 들어, 책이름 top이 3권 팔렸고, 책이름 topkim이 3권 팔렸다고 가정해보자.

글자 길이만큼 비교를 해도 모두 동일한 경우에는 책의 이름이 더 짧은 것을 우선순위로 비교해야한다.

 

 

 

풀이 과정


1. 도서명(String), 판매부수(int)를 field로 갖는 객체를 선언한다.
2. ArrayList를 1번의 객체에 담는다. 단, List에 동일한 도서명의 객체가 있다면
   List에 추가가 아닌 판매부수를 1 증가시켜준다.
3. 1번의 객체는 Comparable interface를 implements하여
    주어진 조건에 맞도록 정렬한다.
4. 정렬 후, ArrayList의 가장 첫번째에 놓인 객체의 도서명을 출력한다. 

 

 

 

<< 백준알고리즘 1302번 반례 >>

4
kim
kimtop
kim
kimtop

예상 결과 : kim

 

 

 

 

소스 ▽

더보기
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class Main {// 1302번 베스트 셀러
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int sell = Integer.parseInt(sc.nextLine());
		ArrayList<book> arr = new ArrayList<book>();

		for (int j = 0; j < sell; j++) {
			String name = sc.nextLine();

			insert(arr, name);
		}

		arr.sort(Comparator.naturalOrder());

		System.out.println(arr.get(0).name);

	}

	public static void insert(ArrayList<book> arrBk, String name) {
		boolean makeFlag = true;
		for (int i = 0; i < arrBk.size(); i++) {
			if (arrBk.get(i).name.equals(name)) {
				arrBk.get(i).count++;
				makeFlag = false;
				break;
			}
		}

		if (makeFlag == true) {
			book bk = new book();
			bk.name = name;
			bk.count = 1;
			arrBk.add(bk);
		}
	}
}

class book implements Comparable<book> {
	String name;
	int count;

	@Override
	public int compareTo(book o) {
		if (this.count < o.count) {// 판매 부수 비교
			return 1;
		} else if (this.count == o.count) {// 판매 부수가 같을 경우

			int length = 0;// 더 짧은 길이만큼 비교할 수 있도록
			if (this.name.length() >= o.name.length()) {
				length = o.name.length();
			} else {
				length = this.name.length();
			}

			for (int i = 0; i < length; i++) {// 첫 번째 글자부터 비교
				if (this.name.charAt(i) > o.name.charAt(i)) {
					return 1;
				} else if (this.name.charAt(i) < o.name.charAt(i)) {
					return -1;
				}
			}

			// 이 조건문까지 왔다는 것은, return이 이뤄지지 않았다는 의미. 즉 판매 부수도, 더 짧은 길이만큼 비교를해도 일치한경우
			if (length == o.name.length()) {// 더 짧은 길이를 갖는 책이 우선 정렬이 되어야한다.
				return 1;
			}

		}

		return -1;
	}

}