[Python] 백준 5525 IOIOI_문자열
2023. 3. 28. 16:05ㆍ알고리즘
https://www.acmicpc.net/problem/5525
서브태스크가 있는 문제이다. 입력의 크기에 따라 소요되는 시간이 증가하지 않도록 시간 복잡도를 고려해서 구현해야한다.
50점
: 입력받은 n
의 갯수만큼 IOI
문자열을 만든 뒤, 문자열 S
의 인덱스에 하나하나 접근하며 P_n
을 포함하는지 확인했더니 50점
👇 50점 소스
import sys
n = int(sys.stdin.readline().rstrip())
m = int(sys.stdin.readline().rstrip())
s = sys.stdin.readline().rstrip()
p = ['OI'] * n
p_str = 'I' + ''.join(p)
count = 0
for i in range(m - len(p_str) + 1):
if s[i] == 'I' and s[i:i + len(p_str)] == p_str:
count += 1
print(count)
100점
- 문자열
S
의cur
의 위치부터 3개의 문자가'IOI'
인지 확인한다. - 문자열
S
에서'OI'
가 연속으로n
번 나타나면P_n
의 갯수를 증가시키도록 했고,n
번이 나타나기 전에'OI'
의 연속성이 깨지면P_1
의 갯수를 갖는 변수count
를 초기화 했다. P_n
은 2의 간격으로'IOI'
가 n번 반복된다. 따라서 인덱스cur
은 2씩 증가시키면서'IOI'
여부를 확인하면 된다.n = 2
일 때'IOIOIOI'
에서P_n
은 몇개?
👀P_2 = 'IOIOI'
cur = 0
에서IOI
체크 → IOIOIOIcount = 1
cur = 2
에서IOI
체크 → IOIOIOIcount = 2
👉P_2
포함(count == n)
cur = 4
에서IOI
체크 → IOIOIOIcount = 2
👉P_2
을 또 포함하므로(count == n)
답 👉'IOIOIOI'
에서P_n
은 2개 존재한다.
👇 100점 소스
import sys
n = int(sys.stdin.readline().rstrip())
m = int(sys.stdin.readline().rstrip())
s = sys.stdin.readline().rstrip()
cur = 0
count = 0
result = 0
while cur < (m - 1):
if s[cur:cur + 3] == 'IOI': # P_1 으로 체크
count += 1
cur += 2
if count == n: # P_1이 n개가 되면
result += 1 # P_n 갯수 증가
count -= 1
else:
# cur부터 3개의 문자가 IOI 가 아니면 P_1 갯수 초기화
count = 0
cur += 1
print(result)
'알고리즘' 카테고리의 다른 글
[후기] 2023 우리코딩페스티벌 후기 (2) | 2023.06.10 |
---|---|
[Python] 최대공약수와 최소공배수 - 유클리드 호제법 (0) | 2023.04.24 |
[Python] 백준 5430 AC_문자열과 deque (0) | 2023.03.28 |
[Python] 백준 6064_카잉달력 (최소공배수 활용) (0) | 2023.03.26 |
[Python] 백준 9095_1, 2, 3 더하기 (DP 문제) (0) | 2023.03.19 |