[BaekJoon] ๋ฐฑ์ค 5525๋ฒ : IOIOI
Updated:
5525๋ฒ : IOIOI
๊ทธ๋ฅ ๋ฐ๋ณต๋ฌธ์ ํตํด 1๋ถํฐ 1,000,000 ๊น์ง ๋๊ธฐ๋ง ํด๋ 2.8์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
๋๋ฌธ์ O(N^2) ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ์ ๋ ํ ์ ์๊ณ O(N) ๋ index ๋ฅผ ์ ๋ถ ์ํํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
find ํจ์๋ฅผ ํตํด ํ๊ณ ์ถ์์ง๋ง ์๋ ๊ป ์์์ ์๋ ์๋๋ณด๊ณ ๊ท์น์ ์ฐพ๊ธฐ ์์ํ๋ค.
-
Solution1
๋ง์ฝ IOIOIOIOI ๊ฐ ์ฃผ์ด์ง๊ณ ์ฐพ๊ณ ์ ํ๋ ๋ฌธ์์ด์ด IOIOI ๋ผ๋ฉด 3๊ฐ๊ฐ ์กด์ฌํ๋ค.
IOI ํจํด์ ๊ณ์ ์ฐพ์ ๋ด๊ฐ ์ฐพ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ํจํด๊ณผ ์ผ์นํ๋ฉด ๊ทธ๋ ๊ฐ์ ์ฌ๋ฆฐ๋ค.
๊ทธ๋ฆฌ๊ณ ํจํด์ ์ฐพ์๋ค๋ฉด index ๋ ๋ ์นธ์ ์ฌ๋ฆฌ๋ฉด ๋๋ค.
IOIOIOIOI ์์ ์ฒซ ๋ฒ์งธ IOIOI ๋ฅผ ์ฐพ์๋ค๋ฉด ํจํด์ 1์ ๋บ๋ค.
๊ทธ๋์ผ ๋ค์ IOIOI ๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํจํด์ด ๋๊ธด๋ค๋ฉด ๋ค์ ํจํด์ ์ด๊ธฐํ ํ ๋ค index ๋ฅผ ํ ์นธ๋ง ์ฌ๋ ค ๋ค์ ๊ฒ์ฌํ๋ฉฐ ๋ฐ๋ณตํ๋ค.
-
Solution2
์ฌ์ค solution1 ํ์ด๋ณด๋ค ๋จผ์ ์๊ฐํ๋ ํ์ด๋ ์ฃผ์ด์ง ๋ฌธ์์ด์์ ์ฐ์ํ์ง ์๋ ๋ถ๋ถ์ ๋ชจ๋ ์ฐพ์๋ด ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
IIIOIOIOOOI ๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ํจํด์ธ IOIOIO ๋ฅผ ์ฐพ์๋ด ๋น๊ต๋ฅผ ํ๋ ๊ฒ ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด ํจํด์ ์ฐพ์๋ด๋๊ฒ ๋๋ฌด๋๋ฌด ์๊ฐ๋ณด๋ค ์ด๋ ค์ ๋ค..
๋ถ๋ช ํ ์ ๊ท์์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๊ธด ํ๋๋ฐ ์์ง ์ ๊ท์์ผ๋ก ๋ฌธ์์ด์ ๋ค๋ฃจ๊ธฐ๋ ๋ถ์กฑํ ์ค๋ ฅ..
๋ค์์ ๊ผญ ํ์ํ ์ ๊ท์ ์ ๋๋ ๊ณต๋ถ๋ฅผ ํด์ผ๊ฒ ๋ค.
์ด์จ๋ ์ฐ์ํ์ง ์๋ ๋ถ๋ถ์ ๊ธธ์ด์์ ์ฐพ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋บ ๊ฐ์ 2 ๋ก ๋๋๋ค 1 ์ ๋ํด์ฃผ๋ฉด ๋ต์ด ๋๋ค.
import sys
import re
def solution1(N, str_size, string):
count = pattern = idx = 0
while idx < str_size - 1:
if string[idx - 1] == 'I' and string[idx] == 'O' and string[idx + 1] == 'I':
pattern += 1
if pattern == N:
count += 1
pattern -= 1
idx += 1
else:
pattern = 0
idx += 1
return count
def solution2(part, sub_len):
count = 0
for val in part:
if len(val) >= sub_len:
count += (len(val) - sub_len) // 2 + 1
return count
N = int(sys.stdin.readline().rsplit()[0])
str_size = int(sys.stdin.readline().rsplit()[0])
_string = sys.stdin.readline().rsplit()[0]
print(solution1(N, str_size, _string))
part = re.findall('I(?:OI)+', _string)
print(solution2(part, 1 + 2 * N))
Leave a comment