백준 1302번, 베스트셀러

95qwer·2022년 5월 24일
0

생태학과 매우 유사한 문제였습니다.
코드도 생태학 코드를 약간 변형하여 풀었습니다.
처음 생각했던 내용 중, 놓친 부분이 하나 있었는데 바로 ABC ABC AB AB와 같은 경우
짧은 제목의 책이 사전 순서 상 먼저 와야 한다는 것이었습니다.
이 부분만 유의하면 되겠습니다.

중복 처리

HashSet 활용
매 입력마다 HashSet의 contains() 메소드를 활용합니다.
만약 중복되지 않은 책 제목이라면 HashMap과 HashSet에 넣습니다.
(HashMap<String, Cnt(key)>) , Cnt 클래스는 사전 순서 정렬을 위해 멤버 변수로 책 제목을 갖습니다. 또한 팔린 횟수를 저장하기 위해 int형 변수를 갖습니다.

제목 세기

HashSet의 Contains()를 통해 조건 분기로 들어오면,
key를 통해 HashMap에
key를 통해 HashMap에서 원하는 원소를 찾고, 해당 원소의 value인 Cnt 클래스의 count를 1 증가시킵니다.

최종 뽑기

HashMap의 keySet을 가져와 반복문을 돌립니다.
우선 가장 첫 번째 원소를 maxCnt로 가진 후, 이 값과 다른 값들을 비교해나갑니다.
만약 판매 횟수가 더 많은 원소가 발견되면 스위칭을 진행합니다.
판매 횟수가 같은 원소를 발견하면 사전 순서상 앞에 있는 원소의 값으로 스위칭합니다.
책 제목이 포함 관계가 형성된다면,
ex) 셜록홈즈, 셜록홈즈12
짧은 제목으로 스위칭합니다. (사전 순서)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Main {

	static class Cnt {
		public int cnt = 1;
		public String key = null;

		public Cnt() {
		}

		public Cnt(String key) {
			this.key = key;
		}

		int getCnt() {
			return this.cnt;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		String key = null;
		HashSet<String> hSet = new HashSet<String>();
		HashMap<String, Cnt> hMap = new HashMap<>();

		// List<String> keySet = new LinkedList<>();

		int N = Integer.valueOf(bfr.readLine());
		for (int i = 0; i < N; i++) {
			key = bfr.readLine();
			if (key == null || key.length() == 0)
				break;

			if (hSet.contains(key))
				hMap.get(key).cnt++;
			else {
				hSet.add(key);
				hMap.put(key, new Cnt(key));
				// keySet.add(key);
			}
			key = null;
		}

		Set<String> keySet = hMap.keySet();
		int max = -1;
		Cnt maxCnt = null;
		for (String k : keySet) {
			Cnt tmp = hMap.get(k);
			if (tmp.cnt > max) {
				maxCnt = tmp;
				max = maxCnt.cnt;
			} else if (tmp.cnt == max) {
				boolean alpSort = false;
				int idx = tmp.key.length() > maxCnt.key.length() ? maxCnt.key.length() : tmp.key.length();
				int isIncluding = 0;
				for (int i = 0; i < idx; i++) {
					if (maxCnt.key.charAt(i) < tmp.key.charAt(i)) {
						break;
					} else if (maxCnt.key.charAt(i) == tmp.key.charAt(i)) {
						isIncluding++;
						continue;
					} else {
						alpSort = true;
						break;
					}
				}

				if (isIncluding == idx) {
					maxCnt = tmp.key.length() > maxCnt.key.length() ? maxCnt : tmp;
					max = maxCnt.cnt;
				}

				if (alpSort) {
					maxCnt = tmp;
					max = maxCnt.cnt;
				}
			} else
				continue;
		}
		System.out.println(maxCnt.key);
		bfr.close();
	}
}
profile
한땀한땀오타없이

0개의 댓글