본문 바로가기
알고리즘/백준

[백준]230204-05 문제풀이

by stubborngastropod 2023. 2. 5.
728x90

2108. 통계학

import sys
import collections

n = int(input())
num_list = []
for line in sys.stdin:
    num_list.append(int(line))

print(round(sum(num_list)/n))

num_list.sort()
print(num_list[n//2])

fre_dict = dict(collections.Counter(num_list))
fre_list = list(fre_dict.items())
fre_list.sort(key = lambda x: x[1], reverse = True)
if len(fre_list) > 1:
    if fre_list[0][1] == fre_list[1][1]:
        print(fre_list[1][0])
    else:
        print(fre_list[0][0])
else:
    print(fre_list[0][0])

print(max(num_list) - min(num_list))

평균값, 중간값, 최빈값, 범위를 구하는 간단한 문제. 라고 생각했는데 최빈값이 여러개일 경우 두번째로 작은 수를 출력해야 한다. 다른건 한두줄로 끝났고 최빈값도 금방 구하지만 시간 제한 때문에 collections 라이브러리를 써야 했고 이 라이브러리가 익숙치 않아 고생 좀 했다. collections의 Counter 메서드를 썼을 때 각 숫자와 숫자의 개수가 딕셔너리 형태로 반환된다. 키 기준 오름차순으로 정렬되므로 딕셔너리를 리스트로 변환 후 첫번째와 두번째 요소의 value가 같을 때 두번째의 키를, 아니면 첫번째의 키를 출력하도록 했다.

1874. 스택 수열

n = int(input())
num_list = []
for i in range(n):
    num_list.append(i+1)
stack = []
seq = []
no = False

for i in range(n):
    target = int(input())
    if target not in stack and target not in num_list:
        no = True
        break
    elif target in stack:
        while target in stack:
            seq.append('-')
            stack.pop()
    elif target not in stack:
        while target in num_list:
            seq.append('+')
            stack.append(num_list.pop(0))
        seq.append('-')
        stack.pop()

if no:
    print('NO')
else:
    for i in seq:
        print(i)

실버2 문제인데 20분도 안돼서 푼 것 같다(뿌듯). 물론 Pypy를 썼지만... 숫자 list와 스택에 타겟값이 있는지를 계속 확인하면서 push와 pop을 반복하고 실행할 때마다 +와 -를 저장했다. 이제 나름 스택에 대한 개념이 익숙해진 것 같다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준]230207 문제풀이  (0) 2023.02.07
[백준]230206 문제풀이  (0) 2023.02.06
[백준]230203 문제풀이  (0) 2023.02.04
[백준]230202 문제풀이  (2) 2023.02.02
[백준]230131 문제풀이  (0) 2023.01.31

댓글