๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Developer/๐ŸŸ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/python] ํŒŒ์ผ๋ช… ์ •๋ ฌ

ํŒŒ์ผ๋ช… ์ •๋ ฌ

https://programmers.co.kr/learn/courses/30/lessons/17686

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - [3์ฐจ] ํŒŒ์ผ๋ช… ์ •๋ ฌ

ํŒŒ์ผ๋ช… ์ •๋ ฌ ์„ธ ์ฐจ๋ก€์˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์™€ ๋‘ ์ฐจ๋ก€์˜ ๋ฉด์ ‘์ด๋ผ๋Š” ๊ธฐ๋‚˜๊ธด ๋ธ”๋ผ์ธ๋“œ ๊ณต์ฑ„๋ฅผ ๋ฌด์‚ฌํžˆ ํ†ต๊ณผํ•ด ์นด์นด์˜ค์— ์ž…์‚ฌํ•œ ๋ฌด์ง€๋Š” ํŒŒ์ผ ์ €์žฅ์†Œ ์„œ๋ฒ„ ๊ด€๋ฆฌ๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค. ์ €์žฅ์†Œ ์„œ๋ฒ„์—๋Š” ํ”„๋กœ๊ทธ๋žจ๏ฟฝ๏ฟฝ

programmers.co.kr


๋ฌธ์ œ ์„ค๋ช…

์„ธ ์ฐจ๋ก€์˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์™€ ๋‘ ์ฐจ๋ก€์˜ ๋ฉด์ ‘์ด๋ผ๋Š” ๊ธฐ๋‚˜๊ธด ๋ธ”๋ผ์ธ๋“œ ๊ณต์ฑ„๋ฅผ ๋ฌด์‚ฌํžˆ ํ†ต๊ณผํ•ด ์นด์นด์˜ค์— ์ž…์‚ฌํ•œ ๋ฌด์ง€๋Š” ํŒŒ์ผ ์ €

์žฅ์†Œ ์„œ๋ฒ„ ๊ด€๋ฆฌ๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ €์žฅ์†Œ ์„œ๋ฒ„์—๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณผ๊ฑฐ ๋ฒ„์ „์„ ๋ชจ๋‘ ๋‹ด๊ณ  ์žˆ์–ด, ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ํŒŒ์ผ ๋ชฉ๋ก์€ ๋ณด๊ธฐ๊ฐ€ ๋ถˆํŽธํ–ˆ๋‹ค. ํŒŒ์ผ์„ ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉด ๋‚˜์ค‘์— ๋งŒ๋“ค์–ด์ง„ ver-10.zip์ด ver-9.zip๋ณด๋‹ค ๋จผ์ € ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ฒ„์ „ ๋ฒˆํ˜ธ ์™ธ์—๋„ ์ˆซ์ž๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ ๋ชฉ๋ก์€ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋ถˆํŽธํ–ˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ ํŒŒ์ผ ๋ชฉ๋ก์ด [img12.png, img10.png, img2.png, img1.png]์ผ ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์ธ ์ •๋ ฌ์€ [img1.png, img10.png, img12.png, img2.png] ์ˆœ์ด ๋˜์ง€๋งŒ, ์ˆซ์ž ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ [img1.png, img2.png, img10.png, img12.png"] ์ˆœ์ด ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

 

๋ฌด์ง€๋Š” ๋‹จ์ˆœํ•œ ๋ฌธ์ž ์ฝ”๋“œ ์ˆœ์ด ์•„๋‹Œ, ํŒŒ์ผ๋ช…์— ํฌํ•จ๋œ ์ˆซ์ž๋ฅผ ๋ฐ˜์˜ํ•œ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ €์žฅ์†Œ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์— ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

์†Œ์Šค ํŒŒ์ผ ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ํŒŒ์ผ๋ช…์€ 100 ๊ธ€์ž ์ด๋‚ด๋กœ, ์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž, ์ˆซ์ž, ๊ณต๋ฐฑ(" ), ๋งˆ์นจํ‘œ(.), ๋นผ๊ธฐ ๋ถ€ํ˜ธ(-")๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

ํŒŒ์ผ๋ช…์€ ์˜๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

 

ํŒŒ์ผ๋ช…์€ ํฌ๊ฒŒ HEAD, NUMBER, TAIL์˜ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

  • HEAD๋Š” ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ตœ์†Œํ•œ ํ•œ ๊ธ€์ž ์ด์ƒ์ด๋‹ค.
  • NUMBER๋Š” ํ•œ ๊ธ€์ž์—์„œ ์ตœ๋Œ€ ๋‹ค์„ฏ ๊ธ€์ž ์‚ฌ์ด์˜ ์—ฐ์†๋œ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์•ž์ชฝ์— 0์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 0๋ถ€ํ„ฐ 99999 ์‚ฌ์ด์˜ ์ˆซ์ž๋กœ, 00000์ด๋‚˜ 0101 ๋“ฑ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • TAIL์€ ๊ทธ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์œผ๋กœ, ์—ฌ๊ธฐ์—๋Š” ์ˆซ์ž๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์•„๋ฌด ๊ธ€์ž๋„ ์—†์„ ์ˆ˜ ์žˆ๋‹ค.
ํŒŒ์ผ๋ช… HEAD NUMBER TAIL
foo9.txt foo 9 .txt
foo010bar020.zip foo 010 bar020.zip
F-15 F- 15 (๋นˆ ๋ฌธ์ž์—ด)

ํŒŒ์ผ๋ช…์„ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ํ›„, ๋‹ค์Œ ๊ธฐ์ค€์— ๋”ฐ๋ผ ํŒŒ์ผ๋ช…์„ ์ •๋ ฌํ•œ๋‹ค.

 

  • ํŒŒ์ผ๋ช…์€ ์šฐ์„  HEAD ๋ถ€๋ถ„์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ์ด๋•Œ, ๋ฌธ์ž์—ด ๋น„๊ต ์‹œ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. MUZI์™€ muzi, MuZi๋Š” ์ •๋ ฌ ์‹œ์— ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
  • ํŒŒ์ผ๋ช…์˜ HEAD ๋ถ€๋ถ„์ด ๋Œ€์†Œ๋ฌธ์ž ์ฐจ์ด ์™ธ์—๋Š” ๊ฐ™์„ ๊ฒฝ์šฐ, NUMBER์˜ ์ˆซ์ž ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. 9 < 10 < 0011 < 012 < 13 < 014 ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค. ์ˆซ์ž ์•ž์˜ 0์€ ๋ฌด์‹œ๋˜๋ฉฐ, 012์™€ 12๋Š” ์ •๋ ฌ ์‹œ์— ๊ฐ™์€ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ๋‘ ํŒŒ์ผ์˜ HEAD ๋ถ€๋ถ„๊ณผ, NUMBER์˜ ์ˆซ์ž๋„ ๊ฐ™์„ ๊ฒฝ์šฐ, ์›๋ž˜ ์ž…๋ ฅ์— ์ฃผ์–ด์ง„ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. MUZI01.zip๊ณผ muzi1.png๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด, ์ •๋ ฌ ํ›„์—๋„ ์ž…๋ ฅ ์‹œ ์ฃผ์–ด์ง„ ๋‘ ํŒŒ์ผ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

 

๋ฌด์ง€๋ฅผ ๋„์™€ ํŒŒ์ผ๋ช… ์ •๋ ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๋ผ.

 


ํ’€์ด

import re
def solution(li):
    pattern_x = re.compile('[^0-9]+|[0-9]+')
    pattern_y = re.compile('0+|.+')
    dic = []
    
    for i in range(len(li)):
        x = pattern_x.findall(li[i])
        
        dic.append([x[0]])

        y = pattern_y.findall(x[1])

        dic[i].append(''.join(x[2:]))
        
        if len(y) != 1 :
            x[1] = y[1]
            
        dic[i].append(x[1])

        if len(y) != 1:
            dic[i].append(y[0])

        

    dic.sort(key = lambda x : ( x[0].lower(), int(x[2])))

    for w in range(len(dic)):
        if len(dic[w]) == 4 :
            dic[w] = dic[w][0] + dic[w][3] + dic[w][2] + dic[w][1]

        else :
            dic[w] = dic[w][0] + dic[w][2] + dic[w][1]

    return dic

 


ํ’€์ด ๊ณผ์ •

๋‹ค์Œ ์ •๊ทœํ‘œํ˜„์‹์„ ๊ฐ€์ง€๋Š” ํŒจํ„ด์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

 

    pattern_x = re.compile('[^0-9]+|[0-9]+')
    pattern_y = re.compile('0+|.+')

 

 

๋ฆฌ์ŠคํŠธ dic์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

 

dic[0]์—๋Š” Head๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

dic[1]์—๋Š” Tail์ด ๋“ค์–ด ๊ฐ‘๋‹ˆ๋‹ค.

dic[2]์—๋Š” Number์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

dic[3]์—๋Š” Number์•ž์— 0์ด 1๊ฐœ ์ด์ƒ์žˆ์„ ๋•Œ 0์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

(๋งŒ์•ฝ '00012'๋ผ๋ฉด dic[3]์—๋Š” '000'์ด ๋“ค์–ด๊ฐ€๊ณ  dic[2]์—๋Š” '12'๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.)

 

    for i in range(len(li)):
        x = pattern_x.findall(li[i])
        
        dic.append([x[0]])

        y = pattern_y.findall(x[1])

        dic[i].append(''.join(x[2:]))
        
        if len(y) != 1 :
            x[1] = y[1]
            
        dic[i].append(x[1])

        if len(y) != 1:
            dic[i].append(y[0])

 

 

dic ์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. 

์ฒซ๋ฒˆ์งธ ๊ธฐ์ค€์ธ x[0].lower() ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์—†์ด ์ •๋ ฌ)

์ฒซ๋ฒˆ์งธ ์ •๋ ฌํ•œ ๋’ค ๊ฐ™์€ ์ˆœ์œ„์— ์žˆ๋Š” ๊ฒƒ์€ ๋‘๋ฒˆ์งธ ๊ธฐ์ค€์ธ int(x[2]) ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. 

 

dic.sort(key = lambda x : ( x[0].lower(), int(x[2])))

 

 

์กฐํ•ฉ์„ ํ•˜์—ฌ ์ƒˆ๋กœ์šด dic ์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

    for w in range(len(dic)):
        if len(dic[w]) == 4 :
            dic[w] = dic[w][0] + dic[w][3] + dic[w][2] + dic[w][1]

        else :
            dic[w] = dic[w][0] + dic[w][2] + dic[w][1]
            
     return dic