✨APS (Algorithm Problem Solving)/프로그래머스

[프로그래머스] LV.3 숫자게임 / 파이썬(Python)

Nyan cat 2022. 9. 27. 10:59

 

냥냥냥

📜 문제 설명

xx 회사의 2xN명의 사원들은 N명씩 두 팀으로 나눠 숫자 게임을 하려고 합니다. 두 개의 팀을 각각 A팀과 B팀이라고 하겠습니다.

숫자 게임의 규칙은 다음과 같습니다.

  • 먼저 모든 사원이 무작위로 자연수를 하나씩 부여받습니다.
  • 각 사원은 딱 한 번씩 경기를 합니다.
  • 각 경기당 A팀에서 한 사원이, B팀에서 한 사원이 나와 서로의 수를 공개합니다. 그때 숫자가 큰 쪽이 승리하게 되고, 승리한 사원이 속한 팀은 승점을 1점 얻게 됩니다.
  • 만약 숫자가 같다면 누구도 승점을 얻지 않습니다.

전체 사원들은 우선 무작위로 자연수를 하나씩 부여받았습니다. 그다음 A팀은 빠르게 출전순서를 정했고 자신들의 출전 순서를 B팀에게 공개해버렸습니다. B팀은 그것을 보고 자신들의 최종 승점을 가장 높이는 방법으로 팀원들의 출전 순서를 정했습니다. 이때의 B팀이 얻는 승점을 구해주세요.
A 팀원들이 부여받은 수가 출전 순서대로 나열되어있는 배열 A와 i번째 원소가 B팀의 i번 팀원이 부여받은 수를 의미하는 배열 B가 주어질 때, B 팀원들이 얻을 수 있는 최대 승점을 return 하도록 solution 함수를 완성해주세요.

 

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12987

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡 문제 풀이

A팀과 B팀의 선수 인원이 동일하다는 제약 조건이 있다.

B팀이 최대한 승리를 많이 하게 하기 위해서 A팀을 이길 수 있는 번호 중에 가장 작은 번호를 사용하면 된다. 

아래와 같이 각 팀의 선수가 구성되었을 때 B팀이 최대한 많이 이기기 위해서는 A팀에서 5 숫자를 가진 선수가 출전했을 때 B팀에서는 8 숫자 선수를 출전시켜도 이길 수는 있겠지만 그렇게 되면 A팀에서 7을 가진 선수가 출전했을 때 질 수 밖에 없게 된다. 그래서 6을 가진 선수가 출전하는게 이상적이다.

[5,1,3,7] [2,2,6,8]

이 풀이를 코드로 나타내면 두 리스트를 모두 내림차순으로 정렬하고 각 리스트의 최대값 (0번 인덱스)을 계속 비교해서 B팀이 이길 수 있을 때는 A, B의 0번 인덱스를 삭제하고 그렇지 않을 때는 A의 0번 인덱스만 삭제하면 된다. 

조금 더 풀어보자면 탐욕 알고리즘 유사하게 B선수가 이길 수 있을 때만 B 선수를 사용하고 그렇지 않으면 아껴두는 방식이다. 

코드로 나타내면 아래와 같다.

def solution(A, B):
    answer = 0
    
    A.sort(reverse = True)
    B.sort(reverse = True)
    
    while A:
        if A[0] >= B[0]:
            A.pop(0)
        else:
            A.pop(0)
            B.pop(0)
            answer += 1
    
    return answer

그런데 pop을 계속해서 썼더니 효율성 결과가 처참하다.

처참한 효율성 결과

그래서 heap 자료형을 써서 한 번 다시 풀어봤다.

import heapq

def solution(A, B):
    answer = 0
    a_heap = []
    b_heap = []
    
    for a_item in A:
        heapq.heappush(a_heap, -a_item)
    for b_item in B:
        heapq.heappush(b_heap, -b_item)
    
    
    while a_heap:
        if a_heap[0] <= b_heap[0]:
            heapq.heappop(a_heap)
        else:
            heapq.heappop(a_heap)
            heapq.heappop(b_heap)
            answer += 1
            
    return answer

효율성 결과가  더 나아졌다. 역시 파이썬은 효율성 안 나올 때 heap을 쓰면 대부분 잡히는 것 같다.

결론은 힙 좋아🤟

좀 나아진 효율성

 


    

반응형