ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [3일차](문제 번호 : 10798, 세로읽기) 도전
    백준 문제 풀이 2023. 7. 20. 10:35

    1. 문제 요약

    2차원 배열로 되어있는 문자들을 세로로 읽어 공백 없이 한 줄로 출력하는 것이 목표이다.

    단, 가로 문자 개수는 15개를 넘지않고, 총 5열이다.

     

    예시.

    입력

    AABCDD
    afzz
    09121
    a8EWg6
    P5h3kx

    출력

    Aa0aPAf985Bz1EhCz2W3D1gkD6x

    2. 풀어보기

    먼저, 2차원 배열을 리스트에 저장하는 것은 많이 해봤기에 쉽게 할 수 있다.

    (리스트안에 리스트를 넣는 형식)

     

    이 문제의 핵심은 세로로 읽을 때, 공백이 있다면 건너뛰고 다음 글자를 읽어야한다는 것이다.

    그런데, 입력을 받을 때는 공백(띄어쓰기)가 없이 받아와지기에, 5개의 행중 최대 길이에 맞추어 지도록

    공백을 강제로 추가해야한다.

     

    따라서 다음과 같은 절차를 따랐다.

     

    1) 2차원 배열 입력 받기.

    2) 최대 길이 구하기

    3) 공백 강제 추가하기

    4) 공백을 포함한 세로로 읽은 새 문자열 만들기

    5) 문자열에서 공백 제거후 출력하기


    3. 최종 코드

     

    1) 2차원 배열 입력 받기.

    import sys
    sen = [[] for _ in range(5)]
    for i in range(5):
        sen[i] = list(sys.stdin.readline().rstrip())

    시간 단축을 위해 저번에 언급한 readline()을 사용하였다.


     

    2) 최대 길이 구하기

    M = max(list(map(len, sen)))

    3) 공백 강제 추가하기

    for k in range(5):
        if len(sen[k]) < M:
            di = M - len(sen[k])
            sen[k].append(' '*di)
        sen[k] = "".join(sen[k])

    최대 길이와의 길이 차이를 구하고 그만큼 공백을 뒤에 추가하였다.

    그리고 이 추가 과정에서 [ 'asdf', ' ', ' ' ] 이런 식의 추가가 일어나는데,

    이를 합쳐주기 위하여 join 이라는 새로운 함수를 이용하였다.

    "구분자".join(list)

    -> 리스트의 요소들을 구분자로 이어준다. 문자열로 반환한다.


     

    4) 공백을 포함한 세로로 읽은 새 문자열 만들기

    real_sen = ''
    for i in range(M):
        for j in range(5):
            real_sen = real_sen + sen[j][i]

    5) 문자열에서 공백 제거후 출력하기

    real_sen = real_sen.replace(' ','')
    print(real_sen)

    저번에 배운 .replace()를 활용하였다.


    4. 개선 방안

    max를 구하고 가는 것이 아닌, 세로 읽기를 할 때, 한 줄마다의 max를 구하여 하면

    공백을 추가하고 다시 삭제하는 불필요한 일을 하지 않아도 됐었다.

     


    5. 얻어가는 것

    "구분자".join()을 활용하는 방법을 배웠다.

     

Designed by Tistory.