ProblemSolving/정렬

백준 11652 카드 (python)

OSNIM 2022. 3. 28. 16:44
반응형

문제

출처: 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로 설정되어있기 때문입니다.

최종 결과입니다.

참고

[백준] 11652 카드 (파이썬 Python)

반응형