ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 32.5 심사문제: 파일 이름을 한꺼번에 바꾸기
    코딩도장 심사문제모음 2020. 11. 6. 17:52
    728x90

     

    표준 입력으로 숫자.확장자 형식으로 된 파일 이름 여러 개가 입력됩니다. 다음 소스 코드를 완성하여 파일 이름이 숫자 3개이면서 앞에 0이 들어가는 형식으로 출력되게 만드세요. 예를 들어 1.png 001.png, 99.docx 099.docx, 100.xlsx 100.xlsx처럼 출력되어야 합니다. 그리고 람다 표현식을 사용해야 하며 출력 결과는 리스트 형태라야 합니다. 람다 표현식에서 파일명을 처리할 때는 문자열 포매팅과 문자열 메서드를 활용하세요.

    사용한 코드

    1. list

    2. map

    3. {}.format

    4. int

    첫 접근 방법

    이번 문제는 생각을 굉장히 많이해야하는 문제였다.

    또한, 메서드를 알아도 어떻게 적용하는지를 몰라 구글링 힌트를 보지 않고서는 풀지 못했다.

    (결론, 힌트 참고함)

    1. .zfill(길이) 메서드를 이용해 길이를 지정하고 공백을 모두 0으로 채우는 방법 생각 (풀이가능)

    2. {인덱스 : 0 정렬방향 길이}.format 메서드## '{인덱스 : < 길이}'.format(값)  이용한 접근  방법 생각

    3. '{인덱스:0개수d}'.format(숫자)  이용한 접근  방법 생각

    4. 숫자.확장자 를 이용한 .(점)을 기준으로 나눈 split('.')

    해답은 의외로 python 에서 문자열을 더하는 방법을 생각하여 접근해야 했다.

    풀이.1

    먼저 , input 으로 입력된 값들은 split을사용한다.

    split() == 특정 기준으로 문자열을 분리하여 리스트를 만듬

    입력값 : 1.jpg 10.png 11.png 2.jpg 3.png

    files = input().split() # ['1.jpg', '10.png' ,'11.png', '2.jpg' ,'3.png']
    
    print(해답을 구해라)

    입력값 : 97.xlsx 98.docx 99.docx 100.xlsx 101.docx 102.docx

    files = input().split() # ['97.xlsx', '98.docx', '99.docx', '100.xlsx', '101.docx', '102.docx']
    
    print(해답을 구해라)

    코드 작성 및 접근 과정으로 설명해보자

    첫 번째 : 출력 결과는 list 여야 한다 (map 객체는 눈으로 확인하기 어려움)

    두 번째 : 여러 입력값의 데이터를 한번에 다루고, 변환하기 위해 map 사용

    세 번째 : 10.png 는 .(점)을 기준으로 숫자와 확장자로 나뉘는점을 이용한다는 점 확인

    네 번째 : 출력결과 3자리 수로 출력하며 남는 공간을 0으로 채워야한다는 점 확인

    다섯 번째 : {0:03d}.format(값) // ## '{인덱스:0개수d}'.format(숫자) 0구조를 이용한다.

    여기서 format 안의 값은 정수여야 하므로 int로 변환시켜준다.

    여기서 해당 문제의 핵심이라 할 수 있는 split을 어떻게 사용할 수 있는가를 주의깊게 보자.

    format메서드의 값 부분에 files 안의 요소 x를 split('.') 점을 기준으로 숫자와 확장자로 나눠준다.

    x = '10.png'
    
    a = x.split('.')
    
    print(a)
    ::
    ['10', 'png']      # x[0] = 숫자 // x[1] = 확장자
    list(map(lambda x : '{0:03d}'.format(int(x.split('.')[0]))+ '.' + x.split('.')[1], files))
    

    여섯 번째 : format 메서드와 x.split의 값의 결과 [0]번째 인덱스를 앞부분

    x.split 결과 [1]번째 인덱스를 뒷부분이라 생각하며 "+" 더하기 연산자를 이용해 문자열을 더해(붙혀)준다

    여기서 파이썬에서는 문자간 문자를 연결할때 더하기를 사용해도 된다는 점을 다시 한번 기억하자

    (초반 단계에서 배우는 기초이나 잊어먹고 있었던 것을 상기시켜준 좋은 문제라고 생각한다)

    files = input().split() # ['97.xlsx', '98.docx', '99.docx', '100.xlsx', '101.docx', '102.docx']
    
    a = list(map(lambda x : '{0:03d}'.format(int(x.split('.')[0]))+ '.' + x.split('.')[1], files))
    
    print(a)
    ::
    ['097.xlsx', '098.docx', '099.docx', '100.xlsx', '101.docx', '102.docx']

    추가

    처음에는 zfill 을 이용해 문제를 풀기가 어려웠지만

    split이 어떻게 적용될 수 있는가를 알게 되어 zfill 메서드를 이용해서도 풀수 있었다.

    files = input().split() # ['97.xlsx', '98.docx', '99.docx', '100.xlsx', '101.docx', '102.docx']
    
    a = list(map(lambda x : x.split('.')[0].zfill(3)+ '.' + x.split('.')[1], files))
    
    print(a)
    ::
    ['097.xlsx', '098.docx', '099.docx', '100.xlsx', '101.docx', '102.docx']

    ※ 실제 코딩 도장의 해법과 다를  수 있으며, 답은 여러가지가 존재합니다.

    코드 지적 정말 감사히 받겠습니다.

    728x90
Designed by Tistory.