https://www.acmicpc.net/problem/11652
카드의 번호가 주어지고, 가장 많이 가지고 있는 카드의 숫자를 출력하는 문제. (개수가 중복일 경우 가장 작은 수를 출력)
위 로직을 구현해 보았다.
import sys n = int(sys.stdin.readline()) dic = {} answer_nums = [] for i in range(n): #딕셔너리로 가지고 있는 카드와 개수를 표현 input_num = int(sys.stdin.readline()) if input_num not in dic.keys(): dic[input_num] = 1 else: dic[input_num] += 1 dic_list = sorted(dic.items(), key=lambda x : x[1], reverse=True) #카드의 개수를 기준으로 역순으로 정렬 biggest = dic_list[0][1] # answer_nums.append(dic_list.pop(0)[0]) while len(dic_list) != 0: next_biggest= dic_list[0][1] if biggest != next_biggest: break else: answer_nums.append(dic_list.pop(0)[0]) answer_nums.sort() print(answer_nums.pop(0))
딕셔너리를 sorted() 함수를 사용하면 다음과 같이 리스트 형태로 정렬된다.
[(3, 3), (2, 3), (1, 1)]
value 값을 기준으로 정렬을 하였기 때문에 key 값에 해당되는 3, 2 는 입력이 들어온 순서대(stable sorting) 정렬이 된다.
그래서 마지막 bigget부터는 value가 가장 큰 값들 중에서 key값이 가장 작은 값을 출력하는 로직을 구현하였다.
하지만, 이 코드들은 필요가 없었다. sorted()함수로 정렬을 할 때 lambda에 조건을 두개를 넣으면 간단하게 풀 수 있었다.
import sys n = int(sys.stdin.readline()) dic = {} answer_nums = [] for i in range(n): input_num = int(sys.stdin.readline()) if input_num not in dic.keys(): dic[input_num] = 1 else: dic[input_num] += 1 dic_list = sorted(dic.items(), key=lambda x : (-x[1], x[0])) print(dic_list[0][0])
{key:value} 형식의 딕셔너리에서 위와 같이 정렬을 하면 value가 큰 값부터 정렬한 뒤에 key가 작은 값부터 정렬하기 때문에 정렬된 가장 첫 번째에 놓인 key값을 출력하면 답을 쉽게 구할 수 있다.
이는 코드도 훨씬 짧고, 시간도 훨씬 적게 사용하면서 간단하게 풀 수 있는 방법이다.