๐ŸŒžAlgorithm/๐Ÿ”ฅprogrammers

[programmers] [3์ฐจ] ํŒŒ์ผ๋ช… ์ •๋ ฌ - 2018 KAKAO BLIND RECRUITMENT

๋ฟŒ์•ผ._. 2021. 9. 4. 20:40

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต - 2018 KAKAO BLIND RECRUITMENT


<[3์ฐจ] ํŒŒ์ผ๋ช… ์ •๋ ฌ>

๋ฌธ์ œ ์„ค๋ช…

 

์„ธ ์ฐจ๋ก€์˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์™€ ๋‘ ์ฐจ๋ก€์˜ ๋ฉด์ ‘์ด๋ผ๋Š” ๊ธฐ๋‚˜๊ธด ๋ธ”๋ผ์ธ๋“œ ๊ณต์ฑ„๋ฅผ ๋ฌด์‚ฌํžˆ ํ†ต๊ณผํ•ด
์นด์นด์˜ค์— ์ž…์‚ฌํ•œ ๋ฌด์ง€๋Š” ํŒŒ์ผ ์ €์žฅ์†Œ ์„œ๋ฒ„ ๊ด€๋ฆฌ๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค.
์ €์žฅ์†Œ ์„œ๋ฒ„์—๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณผ๊ฑฐ ๋ฒ„์ „์„ ๋ชจ๋‘ ๋‹ด๊ณ  ์žˆ์–ด,
์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ํŒŒ์ผ ๋ชฉ๋ก์€ ๋ณด๊ธฐ๊ฐ€ ๋ถˆํŽธํ–ˆ๋‹ค.
ํŒŒ์ผ์„ ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉด ๋‚˜์ค‘์— ๋งŒ๋“ค์–ด์ง„ 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๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด, ์ •๋ ฌ ํ›„์—๋„ ์ž…๋ ฅ ์‹œ ์ฃผ์–ด์ง„ ๋‘ ํŒŒ์ผ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

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

 

์ž…๋ ฅ ํ˜•์‹

 

์ž…๋ ฅ์œผ๋กœ ๋ฐฐ์—ด files๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
- files๋Š” 1000 ๊ฐœ ์ดํ•˜์˜ ํŒŒ์ผ๋ช…์„ ํฌํ•จํ•˜๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ด๋‹ค.
- ๊ฐ ํŒŒ์ผ๋ช…์€ 100 ๊ธ€์ž ์ดํ•˜ ๊ธธ์ด๋กœ, ์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž, ์ˆซ์ž, ๊ณต๋ฐฑ(" "), ๋งˆ์นจํ‘œ("."), ๋นผ๊ธฐ ๋ถ€ํ˜ธ("-")๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์˜๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
- ์ค‘๋ณต๋œ ํŒŒ์ผ๋ช…์€ ์—†์œผ๋‚˜, ๋Œ€์†Œ๋ฌธ์ž๋‚˜ ์ˆซ์ž ์•ž๋ถ€๋ถ„์˜ 0 ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ํ•จ๊ป˜ ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. (muzi1.txt, MUZI1.txt, muzi001.txt, muzi1.TXT๋Š” ํ•จ๊ป˜ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.)

 

์ถœ๋ ฅ ํ˜•์‹

 

์œ„ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

   - my solution

def solution(files):
    answer = []
    
    temp=[]
    for i in files:
        head,num,tail='','',''
        check=False
        numcheck=False
        for j in i:
            if not j.isdigit():
                if check==True: #Tail
                    tail+=j
                    numcheck=True
                else: #HEAD
                    head+=j
            elif j.isdigit():
                if numcheck==True: #Tail
                    tail+=j
                else: # NUMBER
                    num+=j
                    check=True
                    if len(num)>=5: # NUMBER ํ•œ๊ธ€์ž ~ ์ตœ๋Œ€ ๋‹ค์„ฏ ๊ธ€์ž
                        numcheck=True
        temp.append([head,num,tail])
    
    temp.sort(key=lambda x: (x[0].upper(),int(x[1]))) # ์ •๋ ฌ) 1. HEAD ๊ธฐ์ค€ 2. NUMBER ๊ธฐ์ค€ 3. ์ž…๋ ฅ ์ˆœ์„œ
    

    for i in temp:
        answer.append(''.join(i))
        
    return answer

#abc123defg123 ์˜ ๊ฒฝ์šฐ NUMBER๊ณผ TAIL ๊ตฌ๋ถ„ ํ™•์‹คํžˆ ํ•ด์ฃผ์–ด์•ผ ํ†ต๊ณผ

 

TAIL์„ ๊ตฌํ• ๋•Œ ์™œ if๋ฌธ์„ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•˜์—ฌ ํŒ๋ณ„ํ–ˆ๋Š”๊ฐ€?

-> index๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•œ๋ฒˆ์— TAIL์„ ๊ตฌํ•ด์ฃผ๊ณ  ์‹ถ์—ˆ์ง€๋งŒ slice๋ฅผ ํ• ๋•Œ index error๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ 

์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด ํ•˜๋‚˜ํ•˜๋‚˜ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋‹ค์Œ์— ์ด์œ ๋ฅผ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

 

1) ๊ณต๋ฐฑ, ๋งˆ์นจํ‘œ, ๋นผ๊ธฐ๋ถ€ํ˜ธ๋“ค์ด ์กด์žฌํ•˜๋ฏ€๋กœ isdigit๊ณผ not isdigit์„ ํ™œ์šฉํ•˜์—ฌ ํŒ๋‹จ

2) HEAD์™€ TAIL์„ ๊ตฌ๋ถ„ํ•˜๊ณ  NUMBER์™€ TAIL์„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ check๊ณผ numcheck๋ฅผ ์„ ์–ธ

3) ์ •๋ ฌ ๊ธฐ์ค€์€ HEAD(์†Œ๋ฌธ์ž, ๋Œ€๋ฌธ์ž ์ƒ๊ด€์—†์ด), NUMBER, ์ž…๋ ฅ ์ˆœ์„œ์ด๋ฏ€๋กœ sort์™€ lambda๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ

4) list์ด๋ฏ€๋กœ join์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ํ›„ ๋ฐ˜ํ™˜


์ƒ๊ฐ๐Ÿค”

 

์œ„์—์„œ๋„ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์™œ slice์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๊นŒ? 

ํ•˜๋‚˜์”ฉ sliceํ•˜์—ฌ ์ถœ๋ ฅํ–ˆ์„๋•Œ๋Š” ์ถœ๋ ฅ์ด ์ž˜ ๋˜์—ˆ๋Š”๋ฐ ๋ณ€์ˆ˜์— ๋„ฃ๊ณ  ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆฌ๋‹ค๋ณด๋‹ˆ

์–ด๋””์„ ๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ์ด ๋ฌธ์ œ์˜ ํฌ์ธํŠธ๋Š”

1) HEAD, NUMBER, TAIL์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์ฝ”๋“œ ๊ตฌํ˜„

์ธ ๊ฒƒ ๊ฐ™๋‹ค. 


์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต, https://programmers.co.kr/learn/challenges