🧫 문제 분석
✔️ 출처
📖 문제

n/3 개의 카드를 뽑는다. (코인 소비 X)
종료 조건
남은 카드 X, 카드 2장을 낼 수 없는 경우
일단 2장을 뽑고 뽑은 카드중 n+1을 만족하는 게 있다면
해당 카드가 처음에 뽑은 n/3개의 기본 카드 인지 확인한다.
기본 카드가 아니라면
현재 가지는 코인 - 뽑은 카드 개수 >= 0 인지 확인후
가능하다면 카드를 2내고 다음 라운드로 진행하면 된다.
🔅 문제 풀이
import java.util.*;
class Solution {
public int solution(int coin, int[] cards) {
int n = cards.length;
int target = n + 1;
int draw = n / 3;
boolean[] drawCard = new boolean[n + 1]; // 뽑은 카드 존재 여부
boolean[] baseCard = new boolean[n + 1]; // 기존 카드
List<Integer> cardList = new ArrayList<>(); // 뽑은 카드들
for (int i = 0; i < draw; i++) {
drawCard[cards[i]] = true;
cardList.add(cards[i]);
baseCard[cards[i]] = true;
}
int turn = 1;
for (int i = n/3; i < n; i+= 2) {
cardList.add(cards[i]);
cardList.add(cards[i+1]);
drawCard[cards[i]] = drawCard[cards[i+1]] = true; // 뽑았음을 표시
if (coin < 0) return turn;
boolean flag = false;
for (int card : cardList) {
// 이미뽑혔으면 넘어감
if (!drawCard[card]) continue;
if (drawCard[target - card]) {
// 둘다 기존카드가 아닌 새로 뽑은 카드라면
if (!baseCard[card] && !baseCard[target-card]) {
if (coin - 2 >= 0) { // 2개의 코인으로 구매해야함
flag = true; // 뽑힘 표식
coin -= 2;
} else {
continue;
}
// 한쪽만 기존 카드라면
} else if (!baseCard[card] || !baseCard[target-card]) {
if (coin - 1 >= 0) {
flag = true; // 뽑힘 표식
coin--;
} else {
continue;
}
}
flag = true; // 뽑힘 표식
drawCard[card] = false;
drawCard[target-card] = false;
break;
}
}
// 2개를 못냈다면 종료
if (!flag) {
return turn;
}
turn++;
}
return turn;
}
}
🔅 리팩토링
❗ 오답노트 / 필요한 지식
- 생각을 잘못한게 코인 -1 >= 0 이 아니면 return turn을 해버렸다. 다른 카드들에게 기회를 주지 않았던게 문제였다.
'programmers > Kakao' 카테고리의 다른 글
양국대회 [자바] (0) | 2025.09.28 |
---|---|
외벽 점검 [자바] (0) | 2025.09.25 |
표현 가능한 이진트리 [자바] (0) | 2025.09.12 |
주사위 고르기 [자바] (0) | 2025.09.05 |
2019 KAKAO BLIND RECRUITMENT 실패율 (0) | 2024.06.27 |