본문 바로가기
Problem Solving/BOJ

[BOJ][Python]5525번 풀이

by NoiB 2022. 7. 5.
반응형

https://www.acmicpc.net/problem/5525

 

5525번: IOIOI

N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN이 몇

www.acmicpc.net

def check():
    global state, start
    cnt = 0
    while start < m:
        if state == 1:
            if s[start] == 'I':
                state = 0
                start += 1
                cnt += 1
            else:
                start += 1
                return cnt
        else:
            if s[start] == 'O':
                state = 1
                start += 1
            else:
                state = 1
                return cnt
    return cnt

n = int(input())
m = int(input())
s = input()
state = 1
ans = 0
start = 0
while start < m:
    cnt = check()
    if cnt - n < 0:
        ans += 0
    else:
        ans += cnt - n
print(ans)

문제를 풀다가 마음이 급해져서 반례를 많이 생각하지 못한게 해당 문제를 푸는데 가장 큰 고난이었습니다. 처음에는 문제가 시키는대로 p를 만들고 I가 나오면 p랑 비교하는 방식으로 풀었는데 50점이 나와서 다른 방법을 생각하다가 답이 조건에 맞을 경우 I의 갯수 - n 이라는 것을 알아차려서 그렇게 해서 풀려고 했는데 IOOOO같은 경우는 생각을 했었는데 n이 커서 IOIOIO가 잘 나오더라도 p보다 짧을 수 있다는 사실을 생각을 못해서 그걸로 고민을 엄청 했네요.

 

문제의 접근은 state라는 변수를 만들어서 지금 차례가 I인지 O인지를 구분할 수 있도록 해서 순서가 맞다면 state를 변경하고 반복을, 아니라면 I의 갯수를 반환해서 연산 이후 ans를 증가시킵니다. 다만 위에서 말했던 대로 아무리 잘 나왔더라도 p에 비해서 짧은 경우가 있을수도 있기 때문에 cnt - n 이 음수인 경우에는 ans를 증가시키면 안됩니다. 글을 쓰고 있으니 불필요한 부분이 많이 보입니다만 이 문제 때문에 아직 운동을 못가서 빨리 운동부터 하고 와야겠어요.

반응형

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

[BOJ][Python]11286번 풀이  (0) 2022.07.07
[BOJ][Python]6064번 풀이  (0) 2022.07.06
[BOJ][Python]2667번 풀이  (0) 2022.07.04
[BOJ][Python]5338, 25083번 풀이  (0) 2022.07.03