λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #15831 μ€€ν‘œμ˜ μ‘°μ•½λŒ

by dar0m! 2020. 8. 19.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
 1 초  512 MB 39.924 %
 

15831번: μ€€ν‘œμ˜ μ‘°μ•½λŒ

첫 쀄에 μ‘°μ•½λŒμ˜ 총 개수 N, μ€€ν‘œκ°€ μ›ν•˜λŠ” 검은 μ‘°μ•½λŒμ˜ μ΅œλŒ€κ°œμˆ˜ B와 ν•˜μ–€ μ‘°μ•½λŒμ˜ μ΅œμ†Œκ°œμˆ˜ Wκ°€ 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” N개의 μ‘°μ•½λŒμ˜ 정보가 ν•œ μ€„λ‘œ 주어진닀. i번째 λ¬Έμžκ°€ B라면 i번 μ‘°οΏ½

www.acmicpc.net

 

문제

μ€€ν‘œλŠ” μ˜€λžœλ§Œμ— 미미와 ν•¨κ»˜ 산책을 λ‚˜μ™”λ‹€. μ‚°μ±…λ‘œμ—λŠ” 일렬둜 검은색과 흰색 μ‘°μ•½λŒμ΄ 놓여 μžˆλ‹€. 총 N개의 μ‘°μ•½λŒμ€ 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€ μ°¨λ‘€λ‘œ λ²ˆν˜Έκ°€ λΆ™μ—¬μ Έ μžˆλ‹€. μ€€ν‘œλŠ” 이 μ‘°μ•½λŒμ„ μ£Όμ›Œ 집에 μž₯μ‹ν•˜λ €κ³  ν•œλ‹€.

μ€€ν‘œλŠ” μž„μ˜μ˜ μ§€μ μ—μ„œ 산책을 μ‹œμž‘ν•˜κ³ , μ›ν•˜λŠ” μ§€μ μ—μ„œ μ‚°μ±…λ‘œλ₯Ό λΉ μ Έλ‚˜μ™€ μ§‘μœΌλ‘œ λŒμ•„κ°„λ‹€. μ΄λ•Œ μ€€ν‘œλŠ” μ‚°μ±…ν•œ ꡬ간에 μžˆλŠ” λͺ¨λ“  μ‘°μ•½λŒμ„ μ€λŠ”λ‹€. 미미의 건강을 μœ„ν•΄ μ€€ν‘œλŠ” μ‘°κΈˆμ΄λΌλ„ 더 κΈ΄ ꡬ간을 μ‚°μ±…ν•˜κ³  μ‹Άλ‹€. ν•˜μ§€λ§Œ μ€€ν‘œμ—κ²ŒλŠ” ν™•κ³ ν•œ μ·¨ν–₯이 μžˆμ–΄, μ•„λž˜ 쑰건을 λ§Œμ‘±ν•˜λŠ” κ΅¬κ°„λ§Œμ„ μ‚°μ±…ν•  수 μžˆλ‹€.

  1. μ€€ν‘œλŠ” κΉŒλ§Œμƒ‰μ„ μ‹«μ–΄ν•œλ‹€. κ·Έλž˜μ„œ κΉŒλ§Œμƒ‰ μ‘°μ•½λŒμ€ B개 μ΄ν•˜λ‘œ 쀍고 μ‹Άλ‹€.
  2. μ€€ν‘œλŠ” 미미와 같은 흰색을 μ’‹μ•„ν•œλ‹€. κ·Έλž˜μ„œ 흰색 μ‘°μ•½λŒμ€ W개 이상 쀍고 μ‹Άλ‹€.

λ§Œμ•½ μœ„ 쑰건을 λ§Œμ‘±ν•˜λŠ” ꡬ간이 μ—†λ‹€λ©΄ μ€€ν‘œλŠ” λ°”λ‘œ μ§‘μœΌλ‘œ λŒμ•„κ°„λ‹€. μ΄λ•Œ μ€€ν‘œμ™€ λ―Έλ―Έκ°€ μ‚°μ±…ν•  수 μžˆλŠ” ꡬ간 쀑 κ°€μž₯ κΈ΄ κ΅¬κ°„μ˜ 길이λ₯Ό κ΅¬ν•΄λ³΄μž.

ν•΄κ²°

key point, νˆ¬ν¬μΈν„°.
  1. μ‹œμž‘μ μ„ κ°€λ¦¬ν‚€λŠ” 포인터 l, 끝점을 κ°€λ¦¬ν‚€λŠ” 포인터 r을 λ‘”λ‹€.
  2. r을 ν•œ μΉΈμ”© λŠ˜λ €κ°€λ©΄μ„œ μ‘°μ•½λŒμ„ μ€λŠ”λ‹€.
  3. 주운 κΉŒλ§Œμƒ‰ μ‘°μ•½λŒμ΄ B개 이상이 되면 l μœ„μΉ˜μ— μžˆλŠ” μ‘°μ•½λŒμ„ 버린닀.
  4. μ€€ν‘œκ°€ μ›ν•˜λŠ” 쑰건(κΉŒλ§Œμƒ‰ μ‘°μ•½λŒ B개 μ΄ν•˜, 흰색 μ‘°μ•½λŒ W개 이상)을 λ§Œμ‘±ν•˜λ©΄ κ·Έ λ•Œμ˜ lλΆ€ν„° rκΉŒμ§€μ˜ 길이λ₯Ό ans와 λΉ„κ΅ν•˜μ—¬ 더 큰 κ°’μœΌλ‘œ κ°±μ‹ ν•œλ‹€.
  5. 포인터 r이 n μ΄μ „κΉŒμ§€λ§Œ 보고 λ‚˜λ©΄ λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•œλ‹€. r이 n에 λ„λ‹¬ν•œ μ΄ν›„λ‘œλΆ€ν„°λŠ” l이 μ¦κ°€λ˜μ–΄ κ²°κ΅­ 더 μž‘μ€ 길이에 ν•΄λ‹Ήν•˜λŠ” 값듀을 보게 λ˜λ―€λ‘œ 더 이상 보지 μ•Šμ•„λ„ λœλ‹€. 
  6. κ°€μž₯ κΈ΄ κ΅¬κ°„μ˜ 길이λ₯Ό 좜λ ₯ν•˜λ©΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•œλ‹€.

 

μ½”λ“œ

λ©”λͺ¨λ¦¬ μ‹œκ°„
2276 KB 20 ms
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
#include <iostream>
int n, black, white, ans;
char arr[300005];
int main() {
    scanf("%d %d %d"&n, &black, &white);
    for (int i = 1; i <= n; i++) {
        scanf(" %c"&arr[i]);
    }
    int l = 1, r = 0, b = 0, w = 0, len = 0;
    // μ‘°κ±΄ ν™•μΈ
    while (r < n) {
        if (b > black) {
            if (arr[l] == 'W')    w--;
            else b--;
            l++; len--;
        }
        else {
            r++; len++;
            if (arr[r] == 'W')    w++;
            else b++;
        }
 
        if (w >= white && b <= black) {
            ans = len > ans ? len : ans;
        }
    }
    printf("%d", ans);
    return 0;
}
cs

λŒ“κΈ€