Home 백준 11652 카드 (python)
Post
Cancel

백준 11652 카드 (python)

문제

출처: https://www.acmicpc.net/problem/11652

image

풀이

제 코드는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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가 같다면 정수가 작은 순으로 정렬되게 했습니다.

모범 답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
n = int(sys.stdin.readline())

#a = []

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

최종 결과입니다.

image

참고

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

This post is licensed under CC BY 4.0 by the author.

백준 10989 수 정렬하기 3 (python)

백준 10610 30 (python)