728x90
#5525번 IOIOI 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
일단 풀었다.
50점 짜리 코드
from sys import stdin
input = stdin.readline
p = "IOI" + "OI"*(int(input())-1)
l = len(p)
t = int(input())
target = input().strip()
answer = 0
for i in range(t):
if target[i:i+l] == p:
# print(target[i:i+l])
answer += 1
print(answer)
난생 처음보는 50점이 나왔다.
당황스러웠다.
아무튼 원인은 시간초과였는데 다음과 같이 바꿔야만 시간초과를 피할 수 있다.
정답 코드
from sys import stdin
input = stdin.readline
n = int(input())
m = int(input())
s = input().strip()
answer = 0
pattern = 0
i = 0
while i < m-2:
if s[i] == "I" and s[i+1] == "O" and s[i+2] == "I":
pattern += 1
if pattern == n:
answer += 1
pattern -= 1
i += 2
else:
pattern = 0
i += 1
print(answer)
두 코드의 차이는 i를 기준으로 순환을 할 때, 패턴을 찾은 순간 패턴의 길이 만큼 넘어갈 수 있는지의 여부인 듯 하다.
매 인덱스에서 패턴을 찾는 첫 번째 코드보다는
한 인덱스에서 +2까지의 패턴을 찾은 뒤 i+2를 진행해 2개의 인덱스를 넘어가기 때문에
시간초과에 걸리지 않는 듯 하다.
떠올리지 못해 아쉽지만
그래도 난 나를 응원한다.
'Algorithm > acmicpc.net' 카테고리의 다른 글
오랜만에 돌아온 알고리즘! 브루트포스 (#1062번 가르침) (0) | 2024.01.08 |
---|---|
분할 정복은 재귀인가? (#1629번 곱셈) (0) | 2022.03.24 |
DP는 아직 어렵.. (#17626 Four Squares) (0) | 2022.03.18 |
가벼운 DP - 시간 복잡도를 고려한 (#9461번 파도반 수열) (0) | 2022.03.18 |
술 마시고도 푸는 실버3 (#11047번 동전0) (0) | 2022.03.18 |