rueki

BOJ 1713. 후보 추천하기(구현) 본문

python

BOJ 1713. 후보 추천하기(구현)

륵기 2022. 10. 3. 14:58
728x90
반응형

https://www.acmicpc.net/problem/1713

 

1713번: 후보 추천하기

첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대

www.acmicpc.net

1. 사진틀 꽉 차있는 경우, 안 차있는 경우로 나눈다.

2.1 안 차있는 경우에는 

    - 투표된 학생이 존재하는 경우에는 투표수만 증가

    - 그렇지 않은 경우에는 사진틀에 새 학생 추가하기

2.2 차있는 경우

    - 투표된 학생이 존재하는 경우에는 투표수만 증가

    - 그렇지 않은 경우에는 기존 사진틀에 존재하는 학생들 사이에서 최소 투표수 찾아야함

    - 최소 투표수 갖고 있는 학생 여러명인 경우에는 인덱스 먼저 들어가있는 학생을 제거해야함

    - 어차피 사진틀 첫 학생 기준으로 비교 시작하기 때문에 최소 수가 같은 학생의 경우 앞의 학생으로 남게됨(별도 설정X)

    

n = int(input())
v = int(input())
vote_list = list(map(int, input().split()))

stu = [0] * 101
temp = [] #사진틀

for c in vote_list:

    #이미 꽉 차 있는 경우
    if len(temp) == n:
        if c in temp:
            stu[c] += 1
        else:
            mid = temp[0] 
            mc = stu[mid] #학생 번호, 투표 받은 수
            
            for i in temp[1:]:
                if mc > stu[i]:
                    mc = stu[i]
                    mid = i
                
            temp.remove(mid)
            stu[mid] = 0 

            temp.append(c)
            stu[c] += 1
        
    #사진틀 꽉 차있지 않은 경우
    else:
        if c in temp:
            stu[c] += 1
        else:
            temp.append(c)
            stu[c] += 1
        
result = [[i,stu[i]] for i in temp]
result.sort(key = lambda x : x[0])
result = [r[0] for r in result]

print(*result)

 

 

* 다른 분 풀이 비교해보기

- 학생 투표수 리스트를 나는 고정된 길이로 정해버렸는데 사진틀의 학생만 비교하게 된다면 더 효율적인 것 같다.

N = int(input()) # 사진틀 개수
Vote = int(input()) # 총 추천 회수
students = list(map(int, input().split())) # 추천 학생 번호
picture = [] # 사진틀
score = [] # 사진틀 인덱스와 매치해서 추천수 저장할 리스트

for i in range(Vote):
    if students[i] in picture: # 사진틀에 있으면
    	#해당 부분은 나랑 유사 프로세스
        for j in range(len(picture)): 
            if students[i] == picture[j]:
                score[j] += 1 #점수증가
    else: # 사진틀에 없고
        if len(picture) >= N: # 사진틀 꽉차있으면
            for j in range(N):
            	#min, max 함수에서 적용하면 빠른 순서의 변수로 적용된다는 점
                if score[j] == min(score): #가장 작은 점수 찾고
                    del picture[j]
                    del score[j]
                    break #먼저 찾으면 스탑 왜냐면 오래된거일수록 인덱스 앞에 있음
        picture.append(students[i]) #새로운거 뒤에 더해줌
        score.append(1)

picture.sort()
print(' '.join(map(str, picture)))

 

728x90
반응형

'python' 카테고리의 다른 글

BOJ 3190. 뱀 (시뮬레이션)  (1) 2022.10.03
BOJ 1251. 단어나누기(구현, Greedy)  (0) 2022.10.03
BOJ 1531. 투명 (구현)  (0) 2022.10.02
BOJ 1931. 회의실 배정(Greedy)  (1) 2022.10.01
BOJ 1715. 카드 정렬하기 (Priority Queue)  (0) 2022.09.30
Comments