출처 : https://www.acmicpc.net/problem/1713
코딩 테스트 문제에서 자주 출현하는 구현 알고리즘이다.
보통 1, 2번 문제에 출제되고 긴장하면 말리기 쉬운 문제 유형이니 많이 풀어서 익숙해지는 게 중요한 것 같다.
풀이
보통 구현 문제는 여러가지 조건을 그대로 구현하면 정답을 맞힐 수 있는 구조로 많이 출제된다.
성급하게 접근하기 보단 문제의 조건을 읽어보고 정리한 뒤에 알고리즘을 설계하는 것을 추천한다.
문제의 조건은 다음과 같다.
- 학생들이 추천을 시작하기 전에 모든 사진틀은 비어있다.
- 어떤 학생이 특정 학생을 추천하면, 추천받은 학생의 사진이 반드시 사진틀에 게시되어야 한다.
- 비어있는 사진틀이 없는 경우에는 현재까지 추천받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 자리에 새롭게 추천받은 학생의 사진을 게시한다. 이때, 현재까지 추천받은 횟수가 가장 적은 학생이 두 명 이상일 경우에는 게시된 지 가장 오래된 사진을 삭제한다.
- 현재 사진이 게시된 학생이 다른 학생의 추천을 받은 경우에는 추천받은 횟수만 증가시킨다.
- 사진틀에 게시된 사진이 삭제되는 경우에는 해당 학생이 추천받은 횟수는 0으로 바뀐다.
조건을 조금 추려보면,
- 추천받은 학생이 사진틀에 존재하는지 확인한다.
- 존재한다면 해당 사진의 추천수를 증가시키고, 존재하지 않는다면 3번을 수행한다.
- 사진틀이 비어있다면 사진을 추가해주고, 사진틀이 꽉 차있다면 주어진 조건에 따라 사진을 교체한다.
이제 자신있는 컴퓨터 언어로 조건에 맞게 구현을 하면 된다.
- 정답 코드
n = int(input())
num = int(input())
def is_in_arr(arr , w):
for i in arr:
if i[2] == w:
return True
return False
arr = []
who = input().split()
for idx, w in enumerate(who):
#1
if is_in_arr(arr, w):
#2
for index, var in enumerate(arr):
if var[2] == w:
arr[index][0] += 1
break
else:
#3
if len(arr) < n:
arr.append([1, idx, w])
else:
arr[0] = [1, idx, w]
arr.sort(key=lambda x: (x[0], x[1]))
arr.sort(key=lambda x:int(x[2]))
for i in range(n):
if i == n-1:
print(arr[i][2])
else:
print(arr[i][2], end = ' ')
결과
문제를 얕보다가 5번의 실패를 하고 6번 째 정답을 맞힐 수 있었다.
이 문제가 초등부 알고리즘 경진대회라는게 충격이었다..
'Computer_Language > Algorithm' 카테고리의 다른 글
[백준] 2252번 줄 세우기 파이썬 해설 (0) | 2020.01.19 |
---|---|
[백준] 4949번 균형잡힌 세상 파이썬 해설 (2) | 2020.01.05 |
[백준] 7576번 토마토 파이썬 해설 (BFS) (0) | 2019.12.15 |
[백준] 1541번 잃어버린 괄호 Python 해설 (그리디 알고리즘) (1) | 2019.12.08 |
[백준] 2661번 좋은수열 Python 해설 (백트래킹 알고리즘) (0) | 2019.12.07 |