[백준] 11652번 카드 (Python3)
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값을 출력하면 답을 쉽게 구할 수 있다.
이는 코드도 훨씬 짧고, 시간도 훨씬 적게 사용하면서 간단하게 풀 수 있는 방법이다.
Author And Source
이 문제에 관하여([백준] 11652번 카드 (Python3)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sloools/백준-11652번-카드-Python3저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)