๋ฌธ์ ์ค๋ช
[3์ฐจ] ์์ถ
์์ถ
์ ์ ์ฌ์ ์ดํผ์น๋ ์นด์นด์คํก์ผ๋ก ์ ์ก๋๋ ๋ฉ์์ง๋ฅผ ์์ถํ์ฌ ์ ์ก ํจ์จ์ ๋์ด๋ ์ ๋ฌด๋ฅผ ๋งก๊ฒ ๋์๋ค. ๋ฉ์์ง๋ฅผ ์์ถํ๋๋ผ๋ ์ ๋ฌ๋๋ ์ ๋ณด๊ฐ ๋ฐ๋์ด์๋ ์ ๋๋ฏ๋ก, ์์ถ ์ ์ ์ ๋ณด๋ฅผ ์๋ฒฝํ๊ฒ ๋ณต์ ๊ฐ๋ฅํ ๋ฌด์์ค ์์ถ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ธฐ๋ก ํ๋ค.
์ดํผ์น๋ ์ฌ๋ฌ ์์ถ ์๊ณ ๋ฆฌ์ฆ ์ค์์ ์ฑ๋ฅ์ด ์ข๊ณ ๊ตฌํ์ด ๊ฐ๋จํLZW(LempelโZivโWelch) ์์ถ์ ๊ตฌํํ๊ธฐ๋ก ํ๋ค. LZW ์์ถ์ 1983๋ ๋ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์ด๋ฏธ์ง ํ์ผ ํฌ๋งท์ธ GIF ๋ฑ ๋ค์ํ ์์ฉ์์ ์ฌ์ฉ๋์๋ค.
LZW ์์ถ์ ๋ค์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ๊ธธ์ด๊ฐ 1์ธ ๋ชจ๋ ๋จ์ด๋ฅผ ํฌํจํ๋๋ก ์ฌ์ ์ ์ด๊ธฐํํ๋ค.
- ์ฌ์ ์์ ํ์ฌ ์ ๋ ฅ๊ณผ ์ผ์นํ๋ ๊ฐ์ฅ ๊ธด ๋ฌธ์์ดw๋ฅผ ์ฐพ๋๋ค.
- w์ ํด๋นํ๋ ์ฌ์ ์ ์์ธ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๊ณ , ์ ๋ ฅ์์w๋ฅผ ์ ๊ฑฐํ๋ค.
- ์ ๋ ฅ์์ ์ฒ๋ฆฌ๋์ง ์์ ๋ค์ ๊ธ์๊ฐ ๋จ์์๋ค๋ฉด(c),w+c์ ํด๋นํ๋ ๋จ์ด๋ฅผ ์ฌ์ ์ ๋ฑ๋กํ๋ค.
- ๋จ๊ณ 2๋ก ๋์๊ฐ๋ค.
์์ถ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ฌธ ๋๋ฌธ์๋ง ์ฒ๋ฆฌํ๋ค๊ณ ํ ๋, ์ฌ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐํ๋๋ค. ์ฌ์ ์ ์์ธ ๋ฒํธ๋ ์ ์๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ฉฐ, 1๋ถํฐ ์์ํ๋ค๊ณ ํ์.
์์ธ ๋ฒํธ123...242526
๋จ์ด | A | B | C | ... | X | Y | Z |
์๋ฅผ ๋ค์ด ์ ๋ ฅ์ผ๋กKAKAO๊ฐ ๋ค์ด์จ๋ค๊ณ ํ์.
- ํ์ฌ ์ฌ์ ์๋KAKAO์ ์ฒซ ๊ธ์K๋ ๋ฑ๋ก๋์ด ์์ผ๋, ๋ ๋ฒ์งธ ๊ธ์๊น์ง์ธKA๋ ์์ผ๋ฏ๋ก, ์ฒซ ๊ธ์K์ ํด๋นํ๋ ์์ธ ๋ฒํธ 11์ ์ถ๋ ฅํ๊ณ , ๋ค์ ๊ธ์์ธA๋ฅผ ํฌํจํKA๋ฅผ ์ฌ์ ์ 27 ๋ฒ์งธ๋ก ๋ฑ๋กํ๋ค.
- ๋ ๋ฒ์งธ ๊ธ์A๋ ์ฌ์ ์ ์์ผ๋, ์ธ ๋ฒ์งธ ๊ธ์๊น์ง์ธAK๋ ์ฌ์ ์ ์์ผ๋ฏ๋ก,A์ ์์ธ ๋ฒํธ 1์ ์ถ๋ ฅํ๊ณ ,AK๋ฅผ ์ฌ์ ์ 28 ๋ฒ์งธ๋ก ๋ฑ๋กํ๋ค.
- ์ธ ๋ฒ์งธ ๊ธ์์์ ์์ํ๋KA๊ฐ ์ฌ์ ์ ์์ผ๋ฏ๋ก,KA์ ํด๋นํ๋ ์์ธ ๋ฒํธ 27์ ์ถ๋ ฅํ๊ณ , ๋ค์ ๊ธ์O๋ฅผ ํฌํจํKAO๋ฅผ 29 ๋ฒ์งธ๋ก ๋ฑ๋กํ๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ ๊ธ์O์ ํด๋นํ๋ ์์ธ ๋ฒํธ 15๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ฌ ์ ๋ ฅ(w)๋ค์ ๊ธ์(c)์ถ๋ ฅ์ฌ์ ์ถ๊ฐ(w+c)
K | A | 11 | 27: KA |
A | K | 1 | 28: AK |
KA | O | 27 | 29: KAO |
O | 15 |
์ด ๊ณผ์ ์ ๊ฑฐ์ณ ๋ค์ฏ ๊ธ์์ ๋ฌธ์ฅKAKAO๊ฐ 4๊ฐ์ ์์ธ ๋ฒํธ [11, 1, 27, 15]๋ก ์์ถ๋๋ค.
์ ๋ ฅ์ผ๋กTOBEORNOTTOBEORTOBEORNOT๊ฐ ๋ค์ด์ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ถ์ด ์งํ๋๋ค.
ํ์ฌ ์ ๋ ฅ(w)๋ค์ ๊ธ์(c)์ถ๋ ฅ์ฌ์ ์ถ๊ฐ(w+c)
T | O | 20 | 27: TO |
O | B | 15 | 28: OB |
B | E | 2 | 29: BE |
E | O | 5 | 30: EO |
O | R | 15 | 31: OR |
R | N | 18 | 32: RN |
N | O | 14 | 33: NO |
O | T | 15 | 34: OT |
T | T | 20 | 35: TT |
TO | B | 27 | 36: TOB |
BE | O | 29 | 37: BEO |
OR | T | 31 | 38: ORT |
TOB | E | 36 | 39: TOBE |
EO | R | 30 | 40: EOR |
RN | O | 32 | 41: RNO |
OT | 34 |
์ ๋ ฅ ํ์
์ ๋ ฅ์ผ๋ก ์๋ฌธ ๋๋ฌธ์๋ก๋ง ์ด๋ค์ง ๋ฌธ์์ดmsg๊ฐ ์ฃผ์ด์ง๋ค.msg์ ๊ธธ์ด๋ 1 ๊ธ์ ์ด์, 1000 ๊ธ์ ์ดํ์ด๋ค.
์ถ๋ ฅ ํ์
์ฃผ์ด์ง ๋ฌธ์์ด์ ์์ถํ ํ์ ์ฌ์ ์์ธ ๋ฒํธ๋ฅผ ๋ฐฐ์ด๋ก ์ถ๋ ฅํ๋ผ.
์ ์ถ๋ ฅ ์์
msganswer
KAKAO | [11, 1, 27, 15] |
TOBEORNOTTOBEORTOBEORNOT | [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34] |
ABABABABABABABAB | [1, 2, 27, 29, 28, 31, 30] |
ํ์ด
์ฐ์ ๋ฌธ์ ์์ ์ ์ํ dictionary๋ฅผ ๋จผ์ ์ด๊ธฐํํด์ค๋ค.
๊ทธ ํ ์ผ์ข ์ Two Pointer ๊ฐ๋ ์ผ๋ก ํ์๋๋ฐ, Msg์ ์์์ ์์๋ถํฐ Dictionary์ ์ผ์นํ๋ ๋ฌธ์์ด์ด ์๋์ง ํ์ธํ๋ค.
๋์ ๋๋ฆฌ ์ผ์นํ๋ ๋ฌธ์์ด์ด ์์ผ๋ฉด, ๋์ ๋๋ฆฌ์ ์กด์ฌํ์ง ์๋ ๋ฌธ์์ด์ด ๋์ฌ๋๊น์ง ๊ธธ์ด๋ฅผ ํ๋์ฉ ๋ ๋๋ฆฐ๋ค.
๋ฌธ์์ด์ด ๋์ ๋๋ฆฌ์ ์กด์ฌํ์ง ์๋ ์๊ฐ, ์ผ์นํ๋ ๋ฌธ์์ด๊น์ง๋ฅผ ๋์ ๋๋ฆฌ์ ์๋ก ์ถ๊ฐํด์ฃผ๊ณ , Msg์ ์์์ ์ ์ฎ๊ฒจ์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ข ๋ฃ์กฐ๊ฑด์ ํ๋ ์ถ๊ฐํด์ฃผ์๋ค. (์ฌ์ค ์ด ๋ถ๋ถ์ด ๊ต์ฅํ ๋ง์์ ๋ค์ง ์๋๋ฐ, ์ด๋ป๊ฒํ๋ฉด ๋ ๊น๋ํ๊ฒ ์งค ์ ์๋์ง ๊ณ ๋ฏผ์ค์ด๋ค.)
def solution(msg):
dict = {chr(ord('a') + i - 1) : i for i in range(1, 27) }
cnt = 27
answer = []
msg = msg.lower()
i = 0
while i < len(msg):
for j in range(i+1, len(msg) + 1):
if msg[i:j] not in dict:
dict[msg[i:j]] = cnt
cnt += 1
answer.append(dict[msg[i:j-1]])
i = j - 1
break
else:
if j == len(msg):
answer.append(dict[msg[i:j]])
i = len(msg)
return answer
๋ค๋ฅธ ํ์ด๋ก๋?
while True:
if msg in d:
answer.append(d[msg])
break
for i in range(1, len(msg)+1):
if msg[0:i] not in d:
answer.append(d[msg[0:i-1]])
d[msg[0:i]] = len(d)+1
msg = msg[i-1:]
break
msg ํฌ๊ธฐ ์์ฒด๋ฅผ ์ค์ด๋ฉด์ ํธ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ์ฝ๋๋ ์ฑ๋ฅ์ด ์ต์ ํ๋๋๊ฑด ์๋์ง๋ง, ๋ด๊ฐ ์์ฑํ while๋ฌธ๋ณด๋ค ๊ฐ๋
์ฑ๋ ์ข๊ณ , ์ฝ๋๋ ์งง์์ ๊ฐ์ ธ์๋ณด์๋ค.
'Problem Solving ๐ฅ > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ํ์ ํฐ๋จ๋ฆฌ๊ธฐ / ํ์ด์ฌ / (์ต์, ์ต๋, ํ) (2) | 2021.01.18 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ํ์ผ๋ช ์ ๋ ฌ / ํ์ด์ฌ (0) | 2021.01.17 |
[ํ๋ก๊ทธ๋๋จธ์ค] n์ง์ ๊ฒ์ / ํ์ด์ฌ (0) | 2021.01.17 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ณดํค / ํ์ด์ฌ / (์งํฉ, ๋นํธ๋ง์คํฌ) (0) | 2021.01.15 |
[ํ๋ก๊ทธ๋๋จธ์ค ] ๋ฐฉ๊ธ ๊ทธ ๊ณก / ํ์ด์ฌ (0) | 2021.01.15 |