[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์••์ถ• / ํŒŒ์ด์ฌ / (๋”•์…”๋„ˆ๋ฆฌ)
Problem Solving ๐Ÿ”ฅ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์••์ถ• / ํŒŒ์ด์ฌ / (๋”•์…”๋„ˆ๋ฆฌ)

๋ฌธ์ œ ์„ค๋ช…

[3์ฐจ] ์••์ถ•

์••์ถ•

์‹ ์ž…์‚ฌ์› ์–ดํ”ผ์น˜๋Š” ์นด์นด์˜คํ†ก์œผ๋กœ ์ „์†ก๋˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์••์ถ•ํ•˜์—ฌ ์ „์†ก ํšจ์œจ์„ ๋†’์ด๋Š” ์—…๋ฌด๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ์••์ถ•ํ•˜๋”๋ผ๋„ ์ „๋‹ฌ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ๋Š” ์•ˆ ๋˜๋ฏ€๋กœ, ์••์ถ• ์ „์˜ ์ •๋ณด๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณต์› ๊ฐ€๋Šฅํ•œ ๋ฌด์†์‹ค ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

์–ดํ”ผ์น˜๋Š” ์—ฌ๋Ÿฌ ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ ์„ฑ๋Šฅ์ด ์ข‹๊ณ  ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•œLZW(Lempelโ€“Zivโ€“Welch) ์••์ถ•์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. LZW ์••์ถ•์€ 1983๋…„ ๋ฐœํ‘œ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์ด๋ฏธ์ง€ ํŒŒ์ผ ํฌ๋งท์ธ GIF ๋“ฑ ๋‹ค์–‘ํ•œ ์‘์šฉ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

LZW ์••์ถ•์€ ๋‹ค์Œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ๊ธธ์ด๊ฐ€ 1์ธ ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ํฌํ•จํ•˜๋„๋ก ์‚ฌ์ „์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  2. ์‚ฌ์ „์—์„œ ํ˜„์žฌ ์ž…๋ ฅ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ดw๋ฅผ ์ฐพ๋Š”๋‹ค.
  3. w์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์ „์˜ ์ƒ‰์ธ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์ž…๋ ฅ์—์„œw๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  4. ์ž…๋ ฅ์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋‹ค์Œ ๊ธ€์ž๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๋ฉด(c),w+c์— ํ•ด๋‹นํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์ „์— ๋“ฑ๋กํ•œ๋‹ค.
  5. ๋‹จ๊ณ„ 2๋กœ ๋Œ์•„๊ฐ„๋‹ค.

์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์˜๋ฌธ ๋Œ€๋ฌธ์ž๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, ์‚ฌ์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์‚ฌ์ „์˜ ์ƒ‰์ธ ๋ฒˆํ˜ธ๋Š” ์ •์ˆ˜๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง€๋ฉฐ, 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•˜์ž.

์ƒ‰์ธ ๋ฒˆํ˜ธ123...242526

๋‹จ์–ดABC...XYZ

์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ์œผ๋กœKAKAO๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๊ณ  ํ•˜์ž.

  1. ํ˜„์žฌ ์‚ฌ์ „์—๋Š”KAKAO์˜ ์ฒซ ๊ธ€์žK๋Š” ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋‚˜, ๋‘ ๋ฒˆ์งธ ๊ธ€์ž๊นŒ์ง€์ธKA๋Š” ์—†์œผ๋ฏ€๋กœ, ์ฒซ ๊ธ€์žK์— ํ•ด๋‹นํ•˜๋Š” ์ƒ‰์ธ ๋ฒˆํ˜ธ 11์„ ์ถœ๋ ฅํ•˜๊ณ , ๋‹ค์Œ ๊ธ€์ž์ธA๋ฅผ ํฌํ•จํ•œKA๋ฅผ ์‚ฌ์ „์— 27 ๋ฒˆ์งธ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ๊ธ€์žA๋Š” ์‚ฌ์ „์— ์žˆ์œผ๋‚˜, ์„ธ ๋ฒˆ์งธ ๊ธ€์ž๊นŒ์ง€์ธAK๋Š” ์‚ฌ์ „์— ์—†์œผ๋ฏ€๋กœ,A์˜ ์ƒ‰์ธ ๋ฒˆํ˜ธ 1์„ ์ถœ๋ ฅํ•˜๊ณ ,AK๋ฅผ ์‚ฌ์ „์— 28 ๋ฒˆ์งธ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
  3. ์„ธ ๋ฒˆ์งธ ๊ธ€์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š”KA๊ฐ€ ์‚ฌ์ „์— ์žˆ์œผ๋ฏ€๋กœ,KA์— ํ•ด๋‹นํ•˜๋Š” ์ƒ‰์ธ ๋ฒˆํ˜ธ 27์„ ์ถœ๋ ฅํ•˜๊ณ , ๋‹ค์Œ ๊ธ€์žO๋ฅผ ํฌํ•จํ•œKAO๋ฅผ 29 ๋ฒˆ์งธ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
  4. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ธ€์žO์— ํ•ด๋‹นํ•˜๋Š” ์ƒ‰์ธ ๋ฒˆํ˜ธ 15๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ˜„์žฌ ์ž…๋ ฅ(w)๋‹ค์Œ ๊ธ€์ž(c)์ถœ๋ ฅ์‚ฌ์ „ ์ถ”๊ฐ€(w+c)

KA1127: KA
AK128: AK
KAO2729: KAO
O15

์ด ๊ณผ์ •์„ ๊ฑฐ์ณ ๋‹ค์„ฏ ๊ธ€์ž์˜ ๋ฌธ์žฅKAKAO๊ฐ€ 4๊ฐœ์˜ ์ƒ‰์ธ ๋ฒˆํ˜ธ [11, 1, 27, 15]๋กœ ์••์ถ•๋œ๋‹ค.

์ž…๋ ฅ์œผ๋กœTOBEORNOTTOBEORTOBEORNOT๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์••์ถ•์ด ์ง„ํ–‰๋œ๋‹ค.

ํ˜„์žฌ ์ž…๋ ฅ(w)๋‹ค์Œ ๊ธ€์ž(c)์ถœ๋ ฅ์‚ฌ์ „ ์ถ”๊ฐ€(w+c)

TO2027: TO
OB1528: OB
BE229: BE
EO530: EO
OR1531: OR
RN1832: RN
NO1433: NO
OT1534: OT
TT2035: TT
TOB2736: TOB
BEO2937: BEO
ORT3138: ORT
TOBE3639: TOBE
EOR3040: EOR
RNO3241: RNO
OT34

์ž…๋ ฅ ํ˜•์‹

์ž…๋ ฅ์œผ๋กœ ์˜๋ฌธ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ค„์ง„ ๋ฌธ์ž์—ด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๋ฌธ๋ณด๋‹ค ๊ฐ€๋…์„ฑ๋„ ์ข‹๊ณ , ์ฝ”๋“œ๋„ ์งง์•„์„œ ๊ฐ€์ ธ์™€๋ณด์•˜๋‹ค.