반응형
문제
출처: https://www.acmicpc.net/problem/11652
풀이
제 코드는 다음과 같습니다.
import sys
n = int(sys.stdin.readline())
a =[]
for i in range(n):
a.append(int(sys.stdin.readline().rstrip()))
a.sort()
count = 1
result = [[a[0], count]]
for i in range(1, n):
if result[-1][0] == a[i]:
count += 1
result[-1][1] = count
else:
count = 1
result.append([a[i], count])
result.sort(key = lambda x:(-x[1], x[0]))
sys.stdout.write(str(result[0][0]))
제 코드의 핵심은 입력받은 카드를 오름차순으로 정렬하고 result라는 리스트를 새로 만들어 정렬된 a 리스트에서 첫번째 원소를 넣었습니다.
1 부터 n-1번째 인덱스까지 반복문을 통해 모든 a 리스트의 원소를 접근하여 result 에 넣은 원소와 다른 원소가 나올때 까지 같은 원소의 개수를 셉니다.
그 후 result 리스트를 정렬하여 count가 내림차순으로 우선 정렬을 하고 count가 같다면 정수가 작은 순으로 정렬되게 했습니다.
모범 답안
import sys
n = int(sys.stdin.readline())
a={}
for i in range(n):
data = int(sys.stdin.readline().rstrip())
if data in a:
a[data] += 1
else:
a[data] = 1
result = sorted(a.items(), key = lambda x:(-x[1], x[0]))
sys.stdout.write(str(result[0][0]))
a[i]와 result를 비교하여 코드를 작성할 경우 에러가 발생할 수 있는 여지가 많아져 직관적이지 못한 코드가 되었습니다. 저는 in 이라는 키워드를 사용하면 list 안에 원소가 존재하는지 아닌지를 빠르게 판별할 수 있으며 굳이 array 리스트를 정렬할 필요가 없다는 것을 새롭게 알고 코드를 다시 짜게 되었습니다.
a 라는 입력받은 데이터를 in 키워드를 사용하여 저장하는 딕셔너리에 값이 이미 있으면 +1 을 하고 아니면 =1을 대입합니다.
주의할 점은 여기서 a를 딕셔너리가 아닌 리스트로 사용하려면 a = [0]x(n+1) 로 초기화 하거나 정수의 최대값으로 초기화 해야하지만 이렇게 할 경우 불필요한 메모리 공간을 할당하므로 딕셔너리를 사용하는 것이 좋습니다. 알아서 key, value로 설정되어있기 때문입니다.
최종 결과입니다.
참고
반응형
'ProblemSolving > 정렬' 카테고리의 다른 글
백준 1181 단어정렬 (파이썬) (0) | 2022.05.13 |
---|---|
프로그래머스 H-index (파이썬) (0) | 2022.05.06 |
프로그래머스 가장 큰 수 (0) | 2022.05.06 |
백준 10989 수 정렬하기 3 (python) (0) | 2022.03.28 |
백준 2751 수 정렬하기 2 (python) (0) | 2022.03.28 |