[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/python] ํƒ์š•๋ฒ•(Greedy) : ์กฐ์ด์Šคํ‹ฑ

2021. 3. 29. 19:53

๋ฌธ์ œ

์กฐ์ด์Šคํ‹ฑ์œผ๋กœ ์•ŒํŒŒ๋ฒณ ์ด๋ฆ„์„ ์™„์„ฑํ•˜์„ธ์š”. ๋งจ ์ฒ˜์Œ์—” A๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
ex) ์™„์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด๋ฆ„์ด ์„ธ ๊ธ€์ž๋ฉด AAA, ๋„ค ๊ธ€์ž๋ฉด AAAA

์กฐ์ด์Šคํ‹ฑ์„ ๊ฐ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • โ–ฒ - ๋‹ค์Œ ์•ŒํŒŒ๋ฒณ
  • โ–ผ - ์ด์ „ ์•ŒํŒŒ๋ฒณ (A์—์„œ ์•„๋ž˜์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉด Z๋กœ)
  • โ—€ - ์ปค์„œ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ (์ฒซ ๋ฒˆ์งธ ์œ„์น˜์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์— ์ปค์„œ)
  • โ–ถ - ์ปค์„œ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ "JAZ"๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์—์„œ ์กฐ์ด์Šคํ‹ฑ์„ ์œ„๋กœ 9๋ฒˆ ์กฐ์ž‘ํ•˜์—ฌ J๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ์ด์Šคํ‹ฑ์„ ์™ผ์ชฝ์œผ๋กœ 1๋ฒˆ ์กฐ์ž‘ํ•˜์—ฌ ์ปค์„œ๋ฅผ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž ์œ„์น˜๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ์œ„์น˜์—์„œ ์กฐ์ด์Šคํ‹ฑ์„ ์•„๋ž˜๋กœ 1๋ฒˆ ์กฐ์ž‘ํ•˜์—ฌ Z๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ 11๋ฒˆ ์ด๋™์‹œ์ผœ "JAZ"๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด๋•Œ๊ฐ€ ์ตœ์†Œ ์ด๋™์ž…๋‹ˆ๋‹ค.

๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ด๋ฆ„ name์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ด๋ฆ„์— ๋Œ€ํ•ด ์กฐ์ด์Šคํ‹ฑ ์กฐ์ž‘ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ์„ธ์š”.

 

์ œํ•œ ์‚ฌํ•ญ

  • name์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • name์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 20 ์ดํ•˜์ž…๋‹ˆ๋‹ค.

 

์ •๋‹ต

def solution(name):
    name = list(name)
    answer = 0
    i = 0
 
    while 1:
        left = 1
        right = 1
        # ์•ŒํŒŒ๋ฒณ ๋ฐ”๊พธ๊ธฐ
        if name[i] != 'A':
            answer += min(ord(name[i])-ord('A'),ord('Z')-ord(name[i])+1)
        name[i] = 'A'

        # ์œ„์น˜ ๋ฐ”๊พธ๊ธฐ
        if name == ['A']*len(name):
            break
        else:
            for k in range(1, len(name)):
                if name[i + k] == "A":
                    right += 1
                else:
                    break
                if name[i - k] == "A":
                    left += 1
                else:
                    break
                
            if right > left:
                answer += left
                i -= left
            else:
                answer += right
                i += right

    return answer

# ์•ŒํŒŒ๋ฒณ ๋ฐ”๊พธ๊ธฐ
        if name[i] != 'A':
            answer += min(ord(name[i])-ord('A'),ord('Z')-ord(name[i])+1)
        name[i] = 'A'

๊ฐ ์ž๋ฆฌ์˜ ์•ŒํŒŒ๋ฒณ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด โ–ฒ๋ฒ„ํŠผ์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ๋น ๋ฅธ์ง€ โ–ผ๋ฒ„ํŠผ์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ๋น ๋ฅธ์ง€ ํ™•์ธํ•œ ํ›„ 

๋” ์ ์€ ์ˆ˜๋ฅผ answer์— ๋”ํ•ด์ค€ ํ›„ ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์„ "A"๋กœ ๋ฐ”๊พผ๋‹ค. 

 

if name == ['A']*len(name):
            break
        else:
            for k in range(1, len(name)):
                if name[i + k] == "A":
                    right += 1
                else:
                    break
                if name[i - k] == "A":
                    left += 1
                else:
                    break

name์˜ ๋ชจ๋“  ์•ŒํŒŒ๋ฒณ์ด A๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๋œป์€ ๋ชจ๋“  ์•ŒํŒŒ๋ฒณ์„ ๋‹ค ํ™•์ธํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ break๋กœ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ˜„์žฌ์žˆ๋Š” ์œ„์น˜์—์„œ ์•ž ๋˜๋Š” ๋’ค์˜ ์•ŒํŒŒ๋ฒณ์ด A๊ฐ€ ์•„๋‹ ๋•Œ๊นŒ์ง€ ์ด๋™ํ•˜์—ฌ

์•ž์œผ๋กœ ์ด๋™ํ•œ ๊ฐ’์€ right์—, ๋’ค๋กœ ์ด๋™ํ•œ ๊ฐ’์€ left์— ์ €์žฅํ•œ๋‹ค.

 

 if right > left:
                answer += left
                i -= left
            else:
                answer += right
                i += right

right๋ž‘ left๋ž‘ ๋น„๊ตํ•˜์—ฌ ๋” ๊ฐ€๊นŒ์šด ์ชฝ์— ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

answer์—๋Š” ์•ž ๋˜๋Š” ๋’ค๋กœ ์ด๋™ํ•œ ๊ฐ’์ธ right ๋˜๋Š” left ๊ฐ’์„ ๋”ํ•ด์ฃผ๊ณ 

์•ŒํŒŒ๋ฒณ์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ i๋ฅผ ์ด๋™ํ•œ๋งŒํผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์ค€๋‹ค.

728x90

BELATED ARTICLES

more