문제

programmers 순위 검색 문제 보러가기



문제점 해결

카카오 문제는 언제 풀어도 어렵다 ..ㅠㅠ 하지만 포기하자니 아쉽고 결국 문제 해설을 참고하여 풀었다.

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설



풀이

import java.util.*;

class Solution {
	static Map<ArrayList<String>, ArrayList<Integer>> map;

	public int[] solution(String[] info, String[] query) {
		int[] answer = new int[query.length];

		map = new HashMap<>();
		String[][] row = new String[info.length][5];

		for (int i = 0; i < info.length; i++) {
			row[i] = info[i].split(" ");
		}

		Arrays.sort(row, new Comparator<String[]>() {

			@Override
			public int compare(String[] o1, String[] o2) {
				return Integer.parseInt(o1[4]) - Integer.parseInt(o2[4]);
			}
		});

		for (int i = 0; i < info.length; i++) {
			boolean[] used = new boolean[5];
			comb(row[i], used, 0);
		}

		ArrayList<String> tmp = new ArrayList<>();

		for (int i = 0; i < query.length; i++) {
			String[] q = query[i].split(" ");

			for (int j = 0; j < q.length; j += 2) {
				tmp.add(q[j]);
			}

			int num = Integer.parseInt(q[7]);

			ArrayList<Integer> result = map.get(tmp);

			if (result != null) {
				int st = 0, end = result.size() - 1;

				while (st <= end) {
					int mid = (st + end) / 2;

					if (result.get(mid) < num) {
						st = mid + 1;
					} else {
						end = mid - 1;
					}
				}

				answer[i] = result.size() - st;
			}

			tmp.clear();
		}

		return answer;
	}

	static void comb(String[] row, boolean[] used, int index) {
		ArrayList<String> list = new ArrayList<>();

		for (int i = 0; i < used.length - 1; i++) {
			if (used[i]) {
				list.add(row[i]);
			} else {
				list.add("-");
			}
		}

		map.computeIfAbsent(list, key -> new ArrayList<>()).add(Integer.parseInt(row[4]));

		if (index == used.length)
			return;

		for (int i = index; i < used.length - 1; i++) {
			if (!used[i]) {
				used[i] = true;
				comb(row, used, i + 1);
				used[i] = false;
			}
		}
	}
}