πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #1522 λ¬Έμžμ—΄ κ΅ν™˜

dar0m! 2021. 3. 5. 22:18
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
 2 초  128 MB 43.590%
 

1522번: λ¬Έμžμ—΄ κ΅ν™˜

a와 b둜만 이루어진 λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ§ˆ λ•Œ,  aλ₯Ό λͺ¨λ‘ μ—°μ†μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ κ΅ν™˜μ˜ 회수λ₯Ό μ΅œμ†Œλ‘œ ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 이 λ¬Έμžμ—΄μ€ μ›ν˜•μ΄κΈ° λ•Œλ¬Έμ—, 처음과 끝은 μ„œλ‘œ 인접해

www.acmicpc.net

 

문제

a와 b둜만 이루어진 λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ§ˆ λ•Œ,  aλ₯Ό λͺ¨λ‘ μ—°μ†μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ κ΅ν™˜μ˜ 회수λ₯Ό μ΅œμ†Œλ‘œ ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

이 λ¬Έμžμ—΄μ€ μ›ν˜•μ΄κΈ° λ•Œλ¬Έμ—, 처음과 끝은 μ„œλ‘œ 인접해 μžˆλŠ” 것이닀.

예λ₯Ό λ“€μ–΄,  aabbaaabaaba이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 2번의 κ΅ν™˜μ΄λ©΄ aλ₯Ό λͺ¨λ‘ μ—°μ†μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.

첫째 쀄에 λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ§„λ‹€. λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” μ΅œλŒ€ 1,000이닀.
첫째 쀄에 ν•„μš”ν•œ κ΅ν™˜μ˜ 회수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

 

ν•΄κ²°

key point, μŠ¬λΌμ΄λ”© μœˆλ„μš°
  • μ—°μ†λœ bλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œ μž…λ ₯으둜 μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ—μ„œ b개의 개수λ₯Ό μ„Έμ–΄ μ €μž₯ν•œλ‹€. → size
  • 이 λ¬Έμ œμ—μ„œ λ¬Έμžμ—΄μ€ μ›ν˜•μ΄λ‹€. λ”°λΌμ„œ λ¬Έμžμ—΄μ„ ν•œλ²ˆ 더 이어 λΆ™μ—¬μ€€λ‹€ → str += str;
    • μ΄λ ‡κ²Œ 되면, 0λΆ€ν„° str.length()κΉŒμ§€ λ³΄λ©΄μ„œ, μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ μœˆλ„μš° 크기(L)만큼 λ³Ό λ•Œ μ›ν˜•μ˜ λͺ¨μ–‘μœΌλ‘œ μ „λΆ€ 확인할 수 μžˆλ‹€.
  • μ—¬κΈ°μ„œ μœˆλ„μš° ν¬κΈ°λŠ” λ°”λ‘œ sizeκ°€ λœλ‹€.
  • 이제, 0 λΆ€ν„° str.length()κΉŒμ§€ λͺ¨λ“  i에 λŒ€ν•΄μ„œ str[i]κ°€ 'b'라면 queue에 인덱슀 iλ₯Ό λ„£μ–΄μ€€λ‹€.
    • bκ°€ μ‘΄μž¬ν•œ μœ„μΉ˜μ™€ λ™μ‹œμ— ν˜„μž¬ λ³΄κ³ μžˆλŠ” ꡬ간에 μžˆλŠ” b의 개수λ₯Ό λ°”λ‘œ μ•Œ 수 μžˆλ‹€. → q.size()
    • i - q.front() κ°€ size 보닀 κ°™κ±°λ‚˜ 크닀면, κ΅¬κ°„μ˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„  κ²ƒμ΄λ―€λ‘œ queueμ—μ„œ μ œκ±°ν•œλ‹€. → q.pop()
  • κ΅ν™˜ 횟수의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” minν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ, size - q.size()의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•œλ‹€.
    • μš°λ¦¬κ°€ κ΅¬ν•˜κ³ μž ν•˜λŠ” sizeλŠ” μ—°μ†λœ(λ˜μ–΄μ•Όν•˜λŠ”) b의 개수이며, q.size()λŠ” ν˜„μž¬ 보고 μžˆλŠ” κ΅¬κ°„μ˜ b의 κ°œμˆ˜μ΄λ‹€.
    • size - q.size() 의 값이 λ°”λ‘œ ꡬ간에 μžˆλŠ” a의 κ°œμˆ˜κ°€λ˜κ³  즉, κ΅ν™˜ νšŸμˆ˜κ°€ λœλ‹€.
    • λ”°λΌμ„œ λͺ¨λ“  ꡬ간에 λŒ€ν•΄μ„œ size - q.size()의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•œλ‹€λ©΄ 정닡을 찾을 수 μžˆλ‹€.

 

μ½”λ“œ

λ©”λͺ¨λ¦¬ μ‹œκ°„
 2020 KB 0 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;
string str;
int main() {
    cin >> str;
    int size = 0;
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == 'b'size++;
    }
    str += str;    
    int ans = size;
    queue<int> q;
    for (int i = 0; i < str.length(); i++) {
        if (!q.empty() && i - q.front() >= size) q.pop();
        if (str[i] == 'b') q.push(i);
        ans = min(ans, size - (int)q.size());
    }
    printf("%d", ans);
    return 0;
}
cs