알고리즘 문제들 으악/백준

[python]5525번 IOIOI, IF지옥

빈나 2023. 1. 28. 14:39
반응형

문자열 문제로 효율적으로 문자열 탐색을 진행했어야 했다.

그러나 뾰족한 수가 떠올르지 않았던 나는

무한 IF로 분기점을 만들어 어찌하여 구현을 하였다.

std = int(input())
ttl = int(input())
call = input()
rst = 0
cyc = False
stg = 0
tmp =0
for i in range(ttl):
    if call[i]=='I' and not cyc: #맨처음 I를 발견했을 시
        cyc = True #탐색 시작
        stg = 1 #전문자 I로 갱신
    elif call[i]=='O' and cyc and stg: #O발견, 탐색중이고 전 문자가 I일때
        stg = 0 #전문자 O로 갱신
    elif call[i]=='I' and cyc and not stg: #I발견, 탐색중이고 전 문자가 O일때
        tmp+=1 #IOI 한덩이를 발견해서 임시 덩어리 개수 갱신
        stg = 1 #전문자 I로 갱신
    elif call[i]=="I" and cyc and stg: #I를 발견했지만, 전 문자가 I일때
        if tmp>=std: #여태까지의 덩어리 개수들이 찾는 덩어리보다 같거나 클때
            rst+=tmp-std+1 #결과값 갱신(예를 들어 4덩어리 찾고 3덩어리가 기준일때 찾은 덩어리-필요한 덩어리+1하면 갯수를 구할 수 있다.)
        tmp = 0 #덩어리 개수 초기화
    elif call[i]=="O" and cyc and not stg: #O를 발견했지만, 전 문자가 O일때
        cyc = False #탐색중 아님
        stg = 0 #전문자 O
        if tmp>=std:
            rst+=tmp-std+1
        tmp = 0
if tmp>=std: #탐색 끝나고도 아직 갱신 못한 값들이 있을 때
    rst+=tmp-std+1
print(rst)

정말 너무 어렵게 풀었다.

다른 사람(edhz8888)의 아주 간단한 풀이를 찾아보았다.

https://www.acmicpc.net/source/54768987

 

로그인

 

www.acmicpc.net

 

더보기
N,M,S,n,answer,i=int(input()),int(input()),input(),0,0,0
while i<=M-3: #IOI 3자리 끝을 맞추기 위해
    if S[i:i+3]=='IOI': #IOI찾았을 때
        n+=1 #임시 덩어리 값 증가
        i+=1 #인덱스 값 증가
        if n==N:answer+=1;n-=1 #결과값 증가 및 임시 덩어리 1빼서 연속된 수 나오면 바로 갱신 가능하게 만듦
    else:n=0 #연속되지 않기에 초기화
    i+=1 #인덱스 값 증가(이 때문에 IOI연속된 값은 바로 O를 건너뛰어서 연속된 값 찾기 가능)
print(answer)
반응형