View

반응형

 

알고리즘: 다이내믹 프로그래밍

문제 링크: https://www.acmicpc.net/problem/28422

 

28422번: XOR 카드 게임

XOR 카드 게임이란 $N$장의 카드 더미가 있을 때, 맨 위에서부터 카드를 두 장 혹은 세 장씩 가져가 점수를 획득하는 게임이다. 이 게임에서 점수는 아래 단계를 거쳐 누적해서 획득할 수 있다. 한

www.acmicpc.net

 

【 문제 】

 

  • 주어진 카드 n장 중 2장 혹은 3장을 카드가 0장이 될 때까지 뽑는다.
  • 뽑은 카드에 적힌 숫자들을 XOR 연산한 뒤, 2진수 값으로 변환시켜 1의 개수를 구하고 점수로 더한다.
  • 마지막에 1장의 카드가 남을 경우 최종 점수가 0점이 된다. 
  • 이때 점수의 최댓값을 구하는 문제.

 

 

 

【 풀이 】

 

  1. 1비트의 개수를 구하는 함수를 정의한다. n&=(n-1) 트릭 사용.
  2. 카드의 개수 n을 입력받고, 카드의 값을 저장할 cards 배열과 dp 배열을 생성한다.
  3. cards 배열은 dp 배열과의 가독성을 위해 거꾸로 입력받는다.
  4. 카드의 값을 입력받고, 기저 조건에 해당하는 dp[0], dp[1], dp[2], dp[3], dp[4]를 초기화한다.
  5. dp[i]는 i 번째 카드까지 뽑았을 때의 최대 점수를 저장하는 배열이므로, 2장 및 3장을 더 뽑기 전의 값과 더하면 된다.
  6. 즉 dp[i]는 dp[i-2] + (cards[i] ^ cards[i-1]의 1비트 개수)dp[i-3] + (cards[i] ^ cards[i-1] ^ cards[i-2]의 1비트 개수)큰 값을 저장한다.
  7. dp[n]을 출력한다.
  • 시간 복잡도: O(n)
  • 공간 복잡도: O(n)

 

 

【 코드 】

public class Baekjoon_28422 {
    static int[] cards;
    static Integer[] dp;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        cards = new int[n + 1];
        dp = new Integer[n + 1];

        dp[0] = 0;
        dp[1] = 0;
        for (int i = n; i >= 1; i--) {
            cards[i] = sc.nextInt();
        }
        if (n >= 2) {
            dp[2] = countOneBit(cards[1] ^ cards[2]);
            if (n >= 3) dp[3] = countOneBit(cards[1] ^ cards[2] ^ cards[3]);
            if (n >= 4) dp[4] = countOneBit(cards[3] ^ cards[4]) + dp[2];
        }
        for (int i = 5; i <= n; i++) {
            int xor1 = cards[i - 1] ^ cards[i];
            int xor2 = cards[i - 1] ^ cards[i - 2] ^ cards[i];
            dp[i] = Math.max(dp[i - 2] + countOneBit(xor1), dp[i - 3] + countOneBit(xor2));
        }
        System.out.println(dp[n]);
    }

    public static int countOneBit(int n) {
        int count = 0;
        while (n > 0) {
            n &= (n - 1);
            count++;
        }
        return count;
    }
}
728x90
반응형

'Problem Solving > Baekjoon' 카테고리의 다른 글

[백준] 1149번: RGB거리 [C++]  (0) 2023.10.02
[백준] 7576번: 토마토 [C++]  (1) 2023.10.01
[백준] 1074번: Z [C++]  (0) 2023.09.30
[백준] 2630번: 색종이 만들기 [C++]  (0) 2023.09.29
[백준] 1697번: 숨바꼭질 [C++]  (0) 2023.09.28
Share Link
reply
250x250
반응형
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31