본문 바로가기

Algorithm

[백준] Python - 1713.후보 추천하기

생각

처음에 Java의 Colletions.sort에서 람다를 사용하여 정렬 기준을 추천순,시간순으로 넣어 구현했지만 계속 틀리고 새벽까지 디버깅하다가 지쳐서 파이썬으로 20분만에 구현했습니다ㅠ0ㅠ (이번주 스터디때 Java로 구현한 친구들에게 배워야겠습니다ㅠㅠ)

 

사진틀을 담을 데이터 타입을 딕셔너리로 주고 value 를 [추천순,들어온시간] 인 list로 주었습니다. 이렇게 해야 딕셔너리 정렬 기준을 람다로 넣어줄때 간단하게 정의할수있습니다.

 

만약 여기서 value를 튜플 (추천순, 들어온시간) 이런식으로 넣어주면 튜플은 값 변경이 불가능하기 때문에 추천순을 증가시킬수가 없기때문에 리스트 타입을 써야합니다!

 

  1. 사진틀에 이미 걸려있으면 추천수를 증가시켜줍니다.
  2. 사진틀에 없을때 사진틀이 비어있다면 추천받은 학생을 추가시켜줍니다. -> 추천수는 1로 넣고 시간값을 반복문의 인덱스로 넣어줍니다. (반복문의 인덱스를 넣었기 때문에 이 값이 작을수록 먼저들어온것이라고 생각합니다)
  3. 사진틀이 꽉 차 있다면 딕셔너리의 value를 기준으로 람다 함수를 사용하여 정렬시켜줍니다.
    dictionary.items() 는 사전의 키-값 쌍 목록을 튜플로 반환합니다. 여기서 x는 튜플의 요소로 x[0]이 키이고 x[1]이 값입니다.  value 기준으로 정렬해야하므로 (x[1][0] , x[1][1])로 정렬 기준을 정의했습니다.
    - 첫번째 기준은 추천수 오름차순입니다. -> x[1][0]
    - 두번째 기준은 들어온시간 오름차순입니다. -> x[1][1]
  4. 가장 앞에 있는 요소를 삭제하고 새롭게 추천받은 학생을 삽입합니다.
  5. 반복문을 모두 다 돌고나서 딕셔너리의 key를 기준으로 정렬한뒤  key 만 추출하여 출력합니다.

 

Python code

if __name__ == "__main__":
    N = int(input()) # 사진 틀 개수
    K = int(input()) # 추천 리스트
    students = list(map(int,input().split()))
    result = {} #{학생번호:[추천수,들어온시간]} 시간이작을수록 먼저들어온것

    for i in range(K):
        key = students[i]
        if key in result.keys():
            result[key][0] += 1 #추천수증가
        else:
            if len(result) < N:
                result[key] = [1,i]
            else:
                #꽉차있을때 -> result[key][0] 오름차순 (추천수) -> result[key][1] 오름차순 (시간)
                #x[0]이 key x[1]이 value
                sortedList = sorted(result.items(), key = lambda x : (x[1][0],x[1][1]))
                deleteKey = sortedList[0][0]

                del result[deleteKey]

                result[key] = [1,i]
    
    answer = list(sorted(result.keys()))
    print(*answer)

 

'Algorithm' 카테고리의 다른 글

[백준] JAVA - 2477.참외밭  (0) 2021.03.08
[백준] JAVA - 2304.창고 다각형  (0) 2021.03.07
[백준] JAVA - 1920.수 찾기  (0) 2021.03.06
[백준] JAVA - 14889.스타트와 링크  (0) 2021.03.05
[백준] JAVA - 1339.단어 수학  (0) 2021.03.01