n + 1 카드게임

Lee1231234·2024년 5월 21일

코딩테스트

목록 보기
95/95

처음에 가진 동전수를 나타내는 정수 coin과 카드를 뽑는 순서대로 카드에 적힌 수를 담은 1차원 정수 배열 cards가 매개변수로 주어질 때, 게임에서 도달 가능한 최대 라운드의 수를 return 하도록 solution 함수를 완성해 주세요.

제한사항
0 ≤ coin ≤ n
6 ≤ cards의 길이 = n < 1,000
cards[i]는 i+1번째로 뽑는 카드에 적힌 수를 나타냅니다.
1 ≤ cards[i] ≤ n
cards의 원소는 중복되지 않습니다.
n은 6의 배수입니다.

문제풀이

  1. 먼저 가능하면 기본적으로 가진카드에서 n+1의 값을 얻어낸다.
  2. 그것이 불가능하다면 add된 카드하나와 기본카드에서 n+1의 값을 얻어낸다.
  3. 그것마저도 불가능하면 add된 카드끼리 n+1의 값을 얻어낸다.
  4. 이것 마저 불가능하면 최대라운드에 도달한 상태.

구현문제였는데 투포인터 문제인줄알고 바로 정렬해서 풀었다가 낭패를 보았다. 문제를 제대로 읽고 해결하자.

코드

import java.util.*;
class Solution {
    public int solution(int coin, int[] cards) {
        HashSet<Integer> set =new HashSet<>();
        HashSet<Integer> setadd =new HashSet<>();
        int answer = 0;
        int target = cards.length+1;
        int idx= cards.length/3;
        for(int i=0;i<idx;i++){
            set.add(cards[i]);
        }
        
       
        while(true){
            boolean flag= false;
            answer++;//무조건 1라운드는 도착
            if(idx>=cards.length) break;
            setadd.add(cards[idx]);
            setadd.add(cards[idx+1]);
            idx+=2;
            for(int i : set){
                 if(set.contains(target-i)){
                     set.remove(i);
                     set.remove(target-i);
                     flag= true;
                     break;
                 }
            }
            if(flag) continue;
            if(coin>0){
                for(int i : set){                    
                    if(setadd.contains(target-i)){                    
                        set.remove(i);                    
                        setadd.remove(target-i);                    
                        flag= true;                   
                        coin--;                    
                        break;                
                    }
                }
            }
            
            if(flag) continue;
            if(coin>1){
                for(int i : setadd){
                    if(setadd.contains(target-i)){                    
                        setadd.remove(i);
                        setadd.remove(target-i);
                        flag= true;
                        coin-=2;
                        break;                 
                    }           
                }
            }
             
            if(!flag) break;
        }
    
        return answer;
    }
}
profile
not null

0개의 댓글