Study/Algorithm

프로그래머스 (Java) 258707 : n + 1 카드게임

hwooo 2025. 5. 25. 20:36

https://school.programmers.co.kr/learn/courses/30/lessons/258707

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


풀이

다음 라운드로 갈 수 있는지를 확인하는 조건을 모르겠어서 다른 풀이를 봤다.

n + 1 을 만들 수 있는 조건이라면 코인을 최소로 사용해야 더 많은 라운드로 갈 수 있으니,

코인을 최대한 적게 쓰는 방향으로 각 라운드를 지나야 하는 게 포인트였다.

현재 가지고 있는 코인으로 다음 라운드를 갈 수 있는지 확인 -> 코인 1개로 갈 수 있는지 -> 2개로 갈 수 있는지를

순서대로 탐색했다.

 

현재 라운드에서 몇 개의 수를 들고 가야 할지가 고민이었는데next라는 예비 큐에 저장해두고 필요할 때에 코인과 바꾸는 방법을 사용한다면각 라운드와 상관 없이 총 게임에서 사용할 만큼의 숫자만 코인과 바꿀 수 있었다.

 

참고자료

 

[프로그래머스]n+1 카드게임 with Java

https://school.programmers.co.kr/learn/courses/30/lessons/258707처음에 가진 동전수를 나타내는 정수 coin카드를 뽑는 순서대로 카드에 적힌 수를 담은 1차원 정수 배열 cards게임에서 도달 가능한 최대 라운

velog.io


Java 코드

import java.util.*;
class Solution {
    public int solution(int coin, int[] cards) {
        Set<Integer> now, next;
        now = new HashSet<>();
        next = new HashSet<>();
        
        int round = 0;
        int n = cards.length;
        
        for (int i = 0; i < n / 3; i++) {
            now.add(cards[i]);
        }
        
        boolean goNext;
        int idx = n / 3;
        while (true) {
            round++;
            if (n <= idx) {
                break;
            }
            
            // 각 라운드가 지날 때마다 2개를 예비로 가짐
            next.add(cards[idx++]);
            next.add(cards[idx++]);
            
            // 현재 있는 카드들로 다음 라운드를 갈 수 있는지 확인
            goNext = false;
            for (int num : now) {
                if (now.contains(n - num + 1)) {
                    now.remove(num);
                    now.remove(n - num + 1);
                    goNext = true;
                    break;
                }
            }
                
            // 카드 하나만 가지고 갈 수 있는 지
            if (!goNext) {
                if (coin > 0) {
                    for (int num : now) {
                        if (next.contains(n - num + 1)) {
                            now.remove(num);
                            next.remove(n - num + 1);
                            coin--;
                            goNext = true;
                            break;
                        }
                    }
                }
            }
            
            // 두 개를 가지고 갈 수 있는지
            if (!goNext) {
                if (coin > 1) {
                    for (int num : next) {
                        if (next.contains(n - num + 1)) {
                            next.remove(num);
                            next.remove(n - num + 1);
                            coin -= 2;
                            goNext = true;
                            break;
                        }
                    }
                }
            }
            
            // 어떤 경우에도 다음 라운드를 갈 수 없다면
            if (!goNext) {
                break;
            }
        }
        return round;
    }
}