251126 코테연습 기록

Ooleem·2025년 11월 26일

프로그래머스

목록 보기
2/3

베스트앨범 (프로그래머스)

  • 문제 유형 : 해시
  • 제한 시간 : 30분
  • 아이디어 구상, 구현 완료
  • 엣지케이스 걸러내지 못함 (제출 후 채점하기에서 걸림)

엣지케이스 걸러내지 못한 이유

  • 3번 조건 확인 안함
  • 조건 확인하고 테스트케이스 추가해서 확인해보니까 pop()을 사용했기 때문에 내림차순으로 정렬해야 함

내 풀이 (최종 수정)

def solution(genres, plays):
    #songdata = list(zip(plays, list(range(len(plays)))))
    total_play_count = {}
    songs_by_genre = {}
    
    data = list(zip(genres, plays, list(range(len(plays)))))
    for genre, play, idx in data:
        if not total_play_count.get(genre):
            total_play_count[genre] = play
            songs_by_genre[genre] = [(play, idx)]
        else:
            total_play_count[genre] += play
            songs_by_genre[genre].append((play, idx))
            
    #print(total_play_count)
    #print(songs_by_genre)
    answer = []
    total_play_count = list(total_play_count.items())
    total_play_count.sort(key=lambda x:-x[1])
    for total in total_play_count:
        song_list = songs_by_genre[total[0]]
        song_list.sort(key=lambda x:(x[0],-x[1]))
        for _ in range(2):
            if not song_list:
                break
            play, idx = song_list.pop()
            answer.append(idx)
    
    return answer
  • 풀면서 든 생각 : 아 아이디어는 쉬운데 구현이 너무 복잡하네

다른 사람의 깔끔한 풀이

def solution(genres, plays):
    answer = []

    dic1 = {}
    dic2 = {}

    for i, (g, p) in enumerate(zip(genres, plays)):
        if g not in dic1:
            dic1[g] = [(i, p)]
        else:
            dic1[g].append((i, p))

        if g not in dic2:
            dic2[g] = p
        else:
            dic2[g] += p

    for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
        for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
            answer.append(i)

    return answer

놓친 부분 정리

  • for 문에서 튜플이나 배열 같은거 섞어서 지칭할 경우 형식을 동일하게 맞춰 줄 것!
    for i, (g, p) in enumerate(zip(genres, plays)):
  • sorted()를 쓰면 total_play_count.sort(key=lambda x:-x[1]) 이런 작업을 줄일 수 있음
    for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True): 이렇게
  • 그리고 지금 보니까 in 뒤에는 리스트로 안만들어도 되니까 (이터러블이면 되니까) dic2.items()가 그냥 그대로 들어간걸 확인할수있음
  • 곡이 하나밖에 없으면 하나만 넣는다 <- 이 로직을 나는 조건분기로 처리했는데, [:2] 이걸로 해버리면 너무 간단하게 해결 가능했음..

길 찾기 게임 (프로그래머스)


  • 문제 유형 : 트리
  • 제한 시간 : 30분
  • 아이디어 구상, 구현 실패
  • 파이썬에서 클래스 만들어서 트리 구현하는법 다시 찾아보고 재시도할 것

숫자 타자 대회 (프로그래머스)

  • 아이디어 구상 실패
  • 검색해보니 3차원 dp가 섞인 백트래킹이라고 한다..
  • 또는 가중치 정보를 일일이 노가다로 입력한 다음에 해결하는 경우도 있다..
profile
개발 / 성장 노트

0개의 댓글