알고리즘/프로그래머스

[프로그래머스] 숫자 게임 by 파이썬 (Python)

코딩하는이씨 2023. 8. 10. 14:27
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12987?language=python3 

 

프로그래머스

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

programmers.co.kr

 

 

난이도

LV3

 

 

문제 설명

각 팀원이 숫자를 가지고 있고 상대 팀 팀원과 만나 숫자를 비교했을 때 더 큰 숫자를 내면 승점을 얻는다.

만약 숫자가 같으면 둘다 승점을 얻지 못한다.

A팀의 팀원의 숫자와 출선 순서가 공개 되었을 때 B팀이 얻을 수 있는 최대 승점을 return 해야한다.

 

 

접근법

A팀 팀원이 낸 숫자보다 B팀에서 낼 수 있는 숫자가 작은 경우 B팀의 큰 수를 낭비 하지 않고 작은 수를 내고 져야한다.

만약 B팀이 이길 수 있는 숫자라면 A팀 숫자보다 최대한 조금 큰 숫자를 택해야한다. => 내림차순으로 해결 할 수 있다.

  1. A팀과 B팀의 숫자 크기를 내림차순 정렬한다. => 승점만을 return 하면 되기 때문
  2. 파이썬의 popleft를 사용하기 위해 deque로 바꿔준다.
  3. 만약 A팀의 가장 큰 수보다 B팀의 가장 큰 수가 작거나 같으면 어처피 승점을 얻을 수 없기에 작은 수(가장 뒤의 수)를 사용한다.
  4. 만약 B팀의 가장 큰 수가 A팀의 가장 큰 수보다 크면 B팀이 승점을 얻을 수 있는 경우이기 때문에 가장 큰 수 를 사용하고 승점을 증가 시킨다.(이때 내림차순 정렬 상태이므로 A팀의 그 다음 숫자는 현재 숫자보다 작기 때문에 B팀에서 가장 큰 수를 사용하여 승점을 획득하여도 뒤의 경우에 영향을 미치지 않는다.)
  5. 승점(answer)을 return 한다.

 

 

코드

from collections import deque
def solution(A, B):
    answer = 0
    A.sort(reverse =True)
    B.sort(reverse =True)
    a = deque(A)
    b = deque(B)
    for i in range(len(A)):
        if a[0] >= b[0]:
            a.popleft()
            b.pop()
        elif b[0] > a[0]:
            a.popleft()
            b.popleft()
            answer += 1
    return answer

 

728x90
반응형