[๋ฐฑ์ค] 12904 - A์ B (#ํ์ด์ฌ #ํฌ ํฌ์ธํฐ ํ์ด)
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ์ดํ ํ์ ๊ตฌ๊ธ๋ง ํด๋ณด๋ฉฐ ํจ๊ณผ์ ์ธ ํ์ด์๋์ง ํญ์ ํ์ธํ๋ค.
"12904 ํ์ด์ฌ" ํค์๋๋ก ๊ตฌ๊ธ๋ง ํ๋ฉด ๋๋ถ๋ถ reverse(), array slice๋ฅผ ์ฌ์ฉํ ํ์ด ๋ฐ์ ์์ด์ ํ์ด์ ๋ค์์ฑ์ ์ถ๊ฐํ๊ณ ์ ํฌ ํฌ์ธํฐ ํ์ด์ ๋ํด ์์ฑํ๋ค.
Intuition
1. S๋ฅผ T๋ก ๋ณํ ๊ฐ๋ฅ? โก๏ธ T๋ฅผ S๋ก ๋ณํ ๊ฐ๋ฅ?
๋ฌธ์ ์์๋ S๋ฅผ T๋ก ๋ง๋ค๊ธฐ ์ํด '๋ฌธ์์ด์ ๋ค์ A๋ฅผ ์ถ๊ฐ'ํ๊ฑฐ๋ '๋ฌธ์์ด์ ๋ค์ง๊ณ ๋ค์ B๋ฅผ ์ถ๊ฐ'ํ ์ ์๋ค๊ณ ํ๋ค. ์ด ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํด S๋ฅผ T๋ก ๋ง๋ค ์ ์๋์ง ํ์ธํ๋ฉด ๋๋ค.
๋ฌธ์์ด์ ๋ค์ A ํน์ B๊ฐ ์์ ๋, A๊ฐ ์๋ค๋ฉด ๋ฌธ์์ด์ ๊ณง๋ฐ๋ก ์ถ๊ฐ๋ ๊ฒ์ด๊ณ B๊ฐ ์๋ค๋ฉด ๋ค์งํ์ ์ถ๊ฐ๋์๋ค๊ณ ์๊ฐํ ์ ์๋ค. ์ฆ, ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ด์ ์ํ๋ฅผ ์๊ฐํ ์ ์์ผ๋ฏ๋ก T๋ฅผ S๋ก ๋ง๋ค ์ ์๋์ง๋ก ๋ฌธ์ ๋ฅผ ๋ฐ๊ฟ ์๊ฐํ ์ ์๋ค.
2. ๋ฌธ์์ด์์ ๋ฌธ์๊ฐ ๋น ์ง ์ ์น๊ธฐ, ๋ฌธ์์ด์ด ๋ค์งํ ์ ์น๊ธฐ
T๋ฅผ S๋ก ๋ณํํ ๋ ๋ฌธ์์ด์ ์ง์ ์กฐ์ํ ๊ฒฝ์ฐ ๋นํจ์จ์ ์ผ ๋๊ฐ ๋ง๋ค. ๊ทธ๋์ ๋ฌธ์์ด์ ์ฒ์๊ณผ ๋์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ง ์กฐ์ํ์ฌ ๋ง์น ๋ฌธ์์ด์ด ์กฐ์๋ ๊ฒ์ฒ๋ผ ๊ฐ์ ํ๋๋ก ํ๋ค. ๋ฌธ์์ด์์ 'A'๋ฅผ ๋นผ๋ ๊ฒ ์๋ ๋น ์ง ์ ์น ์ ์๋๋ก ํฌ์ธํฐ๋ฅผ ์กฐ์ํ๊ณ , 'B'๋ฅผ ๋นผ๋ ๊ฒ ์๋ ๋น ์ง ์ ์น ์ ์๋๋ก ํฌ์ธํฐ๋ฅผ ์กฐ์ํ๊ณ ๋ค์ง์ด์ ์ฝ์ด์ผ ํจ์ ๋ํ๋ด๋ ์ํ ๋ณ์๋ฅผ ์กฐ์ํ๋ค.
Approach
- front ํฌ์ธํฐ์ back ํฌ์ธํฐ๋ฅผ ์ค์ ํ๊ณ , ์ด ๋ ํฌ์ธํฐ ๊ฐ ๊ฑฐ๋ฆฌ๊ฐ S์ ๊ธธ์ด์ ๊ฐ์์ง ๋ ์กฐ์์ ๋ฉ์ถ๋ค.
- ๋ค์ง์ด์ง ์
์ณ์ผํ๋ค๋ฉด, front ํฌ์ธํฐ์ ๋ฌธ์๊ฐ ๋ฌด์์ธ์ง ํ์ธํ๊ณ , ์ ๋๋ก ๋์ฌ ์๋ค๋ฉด, back ํฌ์ธํฐ์ ๋ฌธ์๊ฐ ๋ฌด์์ธ์ง ํ์ธํด์ผ ํ๋ค.
- ๋ฌธ์๊ฐ 'A'์ด๋ฉด ์๋ ํฌ์ธํฐ์ ๋ ๊ฐ๊น๊ฒ ์กฐ์ํ๋ค.
- ๋ฌธ์๊ฐ 'B'์ด๋ฉด ์๋ ํฌ์ธํฐ์ ๋ ๊ฐ๊น๊ฒ ์กฐ์ํจ๊ณผ ํจ๊ป isFlipped ์ํ๋ฅผ ๋ฐ์ ํ๋ค.
- ์กฐ์์ ๋ฉ์ท์ ๋, ๋ฌธ์์ด์ด '๋ค์ง์ด์ ธ ์๋ค ๊ฐ์ 'ํด์ผ ํ๋์ง, '์ ๋๋ก ๋์ฌ ์๋ค๊ณ ๊ฐ์ 'ํด์ผ ํ๋์ง ์ ์ ์๋ isFlipped ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
Complexity
Time Complexity
- O(|T|) : ์ต์ ์ ๊ฒฝ์ฐ T์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ํํจ
Space Complexity
- O(|T|): ์ ๋ ฅ ๋ฌธ์์ด S์ T๊ฐ ์์ผ๋ ํญ์ S<T ์
Code
1. front ํฌ์ธํฐ์ back ํฌ์ธํฐ๋ฅผ ํ์ธํ๋ฉฐ ๋ค์งํ์ผ ํ๋์ง ํ์ธํจ๊ณผ ๋์์ ์๋ ํฌ์ธํฐ์ ๊ฐ๊น์์ง๋ค.
S = input()
T = input()
len_s = len(S)
len_t = len(T)
back_ptr = len_t - 1
front_ptr = 0
isFlipped = False
while len_s != (back_ptr-front_ptr + 1):
if not isFlipped:
if T[back_ptr] != 'A':
isFlipped = not isFlipped
back_ptr -= 1
else:
if T[front_ptr] != 'A':
isFlipped = not isFlipped
front_ptr += 1
2. ์กฐ์์ ๋ฉ์ท์ ๋(=ํฌ์ธํฐ ๊ฐ ๊ฑฐ๋ฆฌ์ S ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ฐ์ ๋) ํฌ์ธํฐ์์๋ถํฐ ๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉฐ S์ ๊ฐ์์ง ํ์ธํ๋ค.
isFind = False
if isFlipped:
for k in range(len_s):
if S[k] != T[back_ptr - k]:
print(0)
isFind = True
break
if not isFind:
print(1)
else:
for k in range(len_s):
if S[k] != T[front_ptr + k]:
print(0)
isFind = True
break
if not isFind:
print(1)
๊ฒฐ๊ณผ
- ํ ๋ฒ ์ค๋ต์ด ๋ฐ์ํ๋ ์ด์ ๋ isFlipped ์ํ๋ฅผ ๋ณ๊ฒฝ์์ผ์ค ๋ `not isFlipped` ๊ฐ ์๋ `True`๋ก ๊ณ ์ ์์ผ ๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ธฐ๊ฐ์ด `False`์ด๋ค ๋ณด๋ `True`๋ก ๋ฐ๊พธ๋ฉด ์ํ๊ฐ ๊ด๋ฆฌ๋๋ค๊ณ ์ฐฉ๊ฐํ๋ค.