programmers/Kakao

n + 1 카드게임 [자바]

Meluu_ 2025. 9. 17. 12:12

 

🧫 문제 분석

✔️ 출처

n+1 카드게임 level 3

📖 문제

 

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. 생각을 잘못한게 코인 -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