https://school.programmers.co.kr/learn/courses/30/lessons/258707?language=python3
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 대회 준비를 위해서는 백준의 문제를 많이 풀어야 할 것이다. 둘 다 다른 타입의 문제 종류이기 때문에, 모두 열심히 공부해야 할 것이다.
'Computer Science > Algorithm' 카테고리의 다른 글
[Python 3] BOJ 15989 1,2,3 더하기 4 (1) | 2024.03.27 |
---|---|
[Python 3] BOJ 2818 숙제하기 싫을 때 (1) | 2024.03.17 |
[Python 3] BOJ 1256 사전 (1) | 2024.03.08 |
[Python 3] LEETCODE 141. Linked List Cycle (0) | 2024.03.06 |
[Python 3] BOJ 23288 주사위 굴리기 2 (0) | 2024.03.05 |