Q 14453 Hoof, Paper, Scissors (Silver)
๐ก ๋ฌธ์ ์์ฝ ๋ฐ ๋ถ์
John๊ณผ Bessie๊ฐ N๋ฒ๋์ ๊ฐ์ ๋ฐ์ ๋ณด๋ฅผ ํ๋ค. Bessie ๋ John ์ด ๋ผ ์๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์์ง๋ง N๋ฒ ๋์ ๋จ ํ ๋ฒ๋ง ์์ ์ ์๋ฅผ ๋ฐ๊ฟ ์ ์๋ค. ์๋ฅผ ๋ค์ด x๋ฒ ๋์ ๊ฐ์๋ฅผ ๋๋ค๋ฉด, ๋จ์ N-x๋ฒ ๋์ ๋ณด๋ฅผ ๋ผ ์ ์๋ ๊ฒ์ด๋ค. Bessie ๊ฐ ์ต๋๋ก ์ด๊ธธ ์ ์๋ ํ์๊ฐ ๋ช ๋ฒ์ธ์ง ๊ณ์ฐํ์.
๐ก ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
๐ฅ ํํธ๋ฅผ ๋ณด๊ณ ํ์๋ค. ๋์ ํฉ ๋ฐฐ์ด์ ํ์ฉํด์ ํ์ด์ผ ํ๋ค.
์ ๋ ฅ
- ํ์ค์ ๋ ฅ ๋ฐ๋ John ์ ๊ฐ์๋ฐ์๋ณด ์์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ธ ๊ฐ์ ๋์ ํฉ ๋ฐฐ์ด์ ๋ง๋ ๋ค. (H, P, S ๋ฅผ ๋์ ๋์ ๋์ ํฉ)
์ฐ์ฐ
- 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) ํฉ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ถ๋ ฅ
- 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);