Q 14453 Hoof, Paper, Scissors (Silver)

๐Ÿ’ก ๋ฌธ์ œ ์š”์•ฝ ๋ฐ ๋ถ„์„

John๊ณผ Bessie๊ฐ€ N๋ฒˆ๋™์•ˆ ๊ฐ€์œ„ ๋ฐ”์œ„ ๋ณด๋ฅผ ํ•œ๋‹ค. Bessie ๋Š” John ์ด ๋‚ผ ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์ง€๋งŒ N๋ฒˆ ๋™์•ˆ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ž์‹ ์˜ ์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด x๋ฒˆ ๋™์•ˆ ๊ฐ€์œ„๋ฅผ ๋ƒˆ๋‹ค๋ฉด, ๋‚จ์€ N-x๋ฒˆ ๋™์•ˆ ๋ณด๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. Bessie ๊ฐ€ ์ตœ๋Œ€๋กœ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜๊ฐ€ ๋ช‡ ๋ฒˆ์ธ์ง€ ๊ณ„์‚ฐํ•˜์ž.

๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

๐Ÿ”ฅ ํžŒํŠธ๋ฅผ ๋ณด๊ณ  ํ’€์—ˆ๋‹ค. ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด์„œ ํ’€์–ด์•ผ ํ•œ๋‹ค.

  1. ์ž…๋ ฅ

    • ํ‘œ์ค€์ž…๋ ฅ ๋ฐ›๋Š” John ์˜ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ์ˆœ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ธ ๊ฐœ์˜ ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค. (H, P, S ๋ฅผ ๋ƒˆ์„ ๋•Œ์˜ ๋ˆ„์ ํ•ฉ)
  2. ์—ฐ์‚ฐ

    • Bessie ๊ฐ€ ํ”Œ๋ ˆ์ดํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 6๊ฐœ๋‹ค. (H,P)(H,S)(P,H)(P,S)(S,H)(S,P)
    • ๊ฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ N๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋ˆ„์ ํ•ฉ์˜ max ๋ฅผ ์ฐพ๋Š”๋‹ค. (H,P) ๋ฅผ ์˜ˆ๋กœ ๋“ค์ž๋ฉด H(0,i) + P(i+1,N) ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  3. ์ถœ๋ ฅ

    • max ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ’ก ์ฝ”๋“œ

import java.io.*;

public class Main {
    static int max;
    static int N;
    static void process(int[] A, int[] B) {
        for (int i = 1; i < N + 1; i++) {
            int temp = A[i-0] + B[N] - B[i-1];
            max = max < temp ? temp : max;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        int[] P = new int[N + 1];
        int[] H = new int[N + 1];
        int[] S = new int[N + 1];

        for (int i = 1; i < N + 1; i++) {
            char input = br.readLine().charAt(0);
            if (input == 'P') {
                P[i] = P[i-1] + 0;
                H[i] = H[i-1] + 0;
                S[i] = S[i-1] + 1;
            }
            if (input == 'H') {
                P[i] = P[i-1] + 1;
                H[i] = H[i-1] + 0;
                S[i] = S[i-1] + 0;
            }
            if (input == 'S') {
                P[i] = P[i-1] + 0;
                H[i] = H[i-1] + 1;
                S[i] = S[i-1] + 0;
            }
        }

        process(H,P);
        process(H,S);
        process(P,S);
        process(P,H);
        process(S,H);
        process(S,P);

        System.out.println(max);
    }
}

๐Ÿ’ก ์‹œ๊ฐ„ ๋ณต์žก๋„, ๊ณต๊ฐ„ ๋ณต์žก๋„

์‹œ๊ฐ„ ๋ณต์žก๋„๊ณต๊ฐ„ ๋ณต์žก๋„
O(n)O(n)

๐Ÿ’ก ๋‹ค๋ฅธ ํ’€์ด

์–ด๋–ป๊ฒŒ๋“  ํ’€๊ธด ํ–ˆ์ง€๋งŒ process() ํ•จ์ˆ˜๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉ ํ•ด๋ฒ„๋ฆฐ๊ฒŒ ๋งˆ์Œ์— ๊ฑธ๋ ค์„œ ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐพ์•„๋ดค๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“  P, H, S 3๊ฐœ์˜ ๋ฐฐ์—ด์„ ์•„์˜ˆ ์ด์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์„œ for๋ฌธ์œผ๋กœ ๊ฐ ์Œ ์กฐํ•ฉ์„ ํ™•์ธํ•˜๋ฉด ๋”์šฑ ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

// P, H, S ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•  ์ด์ฐจ์› ๋ฐฐ์—ด ์ƒ์„ฑ
int[][] prefix = new int[3][N + 1];

// ํ‘œ์ค€์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ˆ„์ ํ•ฉ ๊ณ„์‚ฐ
for (int i = 1; i < N + 1; i++) {
    char input = br.readLine().charAt(0);
    for (int j = 0; j < 3; j++) {
        prefix[j][i] = prefix[j][i-1];  // ๋ˆ„์ ํ•ฉํ•˜๊ธฐ์œ„ํ•ด ์ด์ „ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋„ฃ์–ด๋‘”๋‹ค.
    }
    if (input == 'P') prefix[0][i]++;
    else if (input == 'H') prefix[1][i]++;
    else if (input == 'S') prefix[2][i]++;
}

// ๊ฐ ์Œ ์กฐํ•ฉ์— ๋Œ€ํ•ด A(0,i), B(i+1,N) ์ „๋žต์œผ๋กœ ์ง„ํ–‰
int max = 0;
for (int a = 0; a < 3; a++) {
    for (int b = 0; b < 3; b++) {
        if (a == b) continue;
        for (int i = 0; i < N + 1; i++) {
            int wins = prefix[a][i] + prefix[b][N] - prefix[b][i];
            max = Math.max(max, wins);
        }
    }
}

System.out.println(max);