Computer Science/Algorithm

[Python 3] 프로그래머스 Lv. 3 n+1 카드게임

무니화니 2024. 3. 10. 16:55

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

 

프로그래머스

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

programmers.co.kr

 

def delete_card(a,b,t):
    for i in a:
        if t-i in b:
            a.remove(i)
            b.remove(t-i)
            return True
    return False
            
def solution(coin, cards):
    answer=1
    n=len(cards)
    mycard=[cards[i] for i in range(n//3)]
    index=n//3
    leftovers=[]
    while coin>=0 and index<n :
        leftovers.append(cards[index])
        leftovers.append(cards[index+1])
        if delete_card(mycard,mycard,n+1):
            pass
        elif coin>=1 and delete_card(mycard,leftovers,n+1):
            coin-=1
        elif coin>=2 and delete_card(leftovers,leftovers,n+1):
            coin-=2
        else:
            break
        
        answer+=1
        index+=2
    return answer

 

먼저, 문제에서는 현재 가지고 있는 핸드에서 두 개의 카드를 draw한다. 이 때 이미 핸드에 있던 카드와 새로 draw한 두 개의 카드를 합하여, 총 카드의 개수 +1의 수를 만들 수 있으면 다음 라운드로 진출하는 방식이다. 하지만 이 방식을 그대로 코드로 구현하기에는, 조금 애매하다. 해당 카드가 나에게 도움이 되는 카드일지 아닐지 여부를 정확하게 파악하는 것이 애매해서, 카드를 버릴지, 코인을 써서 가지고 있는게 애매하다.

 

나는 이를 다르게 해석해보았다.

 

먼저 처음 주는 카드 말고, 추가적으로 얻는 카드들은 핸드에 저장하지 않고, leftovers에 저장하였다. 

 

1.내 핸드에 있는 카드들로만 합이 가능하면, 코인을 소비하지 말고 다음 라운드로 간다.

2. 만약 내가 가지고 있는 카드와 leftovers에 있는 카드로 합이 가능하면, 코인을 1개 쓰고 다음 라운드로 간다.

3. leftovers에 있는 두가지 카드를 통해서 다음 라운드로 진출이 가능하면, 코인을 2개 쓰고 다음 라운드로 간다.

 

즉, Greedy하게 leftovers를 이용했다.


 

프로그래머스의 문제의 느낌은 백준과 상이한 느낌이다.

백준은 알고리즘 중심이다. 다양하고, 생소한 알고리즘을 가지고, 코드로 녹여내는 것이 기본적이다.

하지만 프로그래머스는 이와 다르게 '구현 위주'인 느낌을 많이 받는다. 알고리즘의 종류는 dfs,bfs와 같은 그래프, 그리디 및 dp 정도이지만, 이를 코드로 구현하는 것이 상당히 "애매하다"라는 느낌을 많이 받는다.

 

코딩 테스트에 조금 더 적합한 문제 타입은 프로그래머스이고, ICPC 대회 준비를 위해서는 백준의 문제를 많이 풀어야 할 것이다. 둘 다 다른 타입의 문제 종류이기 때문에, 모두 열심히 공부해야 할 것이다.