티스토리 뷰

답은 항상 위에 와야죠~ 사실 전치는 안하고 바로 세로 읽기로 가도 됩니다. (이때는 세로 출력을 어려워해서 항상 전치 했음)



# 5줄에 걸쳐 최대 15글자의 문자열을 받는 리스트를 리스트컨프리헨션을 통해 선언
arr = [list(input()) for _ in range(5)]
len_lst = []                    #가장 긴 문자열을 탐색하기 위해 빈 리스트 선언
for i in range(5):              # 5개의 행을 탐색
    len_lst.append(len(arr[i])) # 행의 길이를 빈 리스트에 넣어준뒤
max_len = max(len_lst)          # max함수를 통해 최대 길이를 확인

# 가장 길이가 긴 행에 모자라는 빈 데이터를 채워주기 위해 비어있는 공백 문자열을 삽입한다
for i in range(5):
    if len(arr[i]) < max_len:   # 행을 돌면서 가장 긴 문자열의 길이보다 짧다면 append로 추가
        for j in range(max_len-len(arr[i])):
            arr[i].append('')

# 전치를 진행해서 세로읽기를 진행한다
new_arr = list(map(list, zip(*arr)))

# 한줄에 이어서 출력할 것이기 때문에 *언패킹과 사이에 공백제거, 출력후 공백제거를 넣어준다
for i in range(max_len):
    print(*new_arr[i], sep='', end='')
 

2차원 배열을 배우게되면서 자신감이 생긴 마음으로 백준을 켰다. 문제 이름을 봤을 때 ' 세로읽기 ' ? Easy하지 하면서 코드를 써내려가고 있었고, 1번 테스트 케이스는 무난하게 통과했다. 하지만 2번을 보았더니.. N x N 행렬이 아니라 행에 주어진 단어 길이가 다르더라.. 바로 indexerror한테 뚜들겨 맞고 처음으로 돌아왔다.

 

문제의 예시로 아래와 같다.

주어진 배열에서 세로로 출력하면 간단하게 끝...이긴 한데

 

가장 먼저 테스트 해본 것은 열의 개수가 다르더라도 전치가 진행 되는지 확인했다. 당연한것도 생각으로 끝나지 않고 직접 코드를 돌려보니 out of range Hi~ 그만보고싶다. 다시 되돌아와서

다음 아이디어는 어차피 문자열 최대 15개에 5줄이면 공백이 15 x 15 인 빈 문자열을 선언한 다음, 전치를 진행하고 15 x 15 배열 그대로 출력하면 되지 않을까 했다. 사실 공백으로 15개 문자열 선언해도 빈 리스트로 뜨는지 안뜨는지도 모르고 일단 진행해서 만들어보니, 전치까지는 가능했다.


arr = [list(map(str, input())) for _ in range(5)]

for i in range(5):
    for j in range(15):
       if i > j:
          arr[i][j], arr[j][i] = arr[j][i], arr[i][j]
 

 

물론 나중에 15개를 굳이 만들 필요 없이 최고 문자열의 개수를 찾아서 그만큼만 빈칸을 추가해줬다. 

그래서 나왔던 초기 설정은


arr = [list(input()) for _ in range(5)]
len_lst = []                    #가장 긴 문자열을 탐색하기 위해 빈 리스트 선언
for i in range(5):              # 5개의 행을 탐색
    len_lst.append(len(arr[i])) # 행의 길이를 빈 리스트에 넣어준뒤
max_len = max(len_lst)          # max함수를 통해 최대 길이를 확인
 

 

이다. 

여기서 max_len 길이에 모자란 만큼만 빈칸을 추가해주면 되기 때문에


for i in range(5):
    if len(arr[i]) < max_len:   # 행을 돌면서 가장 긴 문자열의 길이보다 짧다면 append로 추가
        for j in range(max_len-len(arr[i])):
            arr[i].append('')
 

를 통해 공백을 추가해줬다. (백준 2번 input 값 참고)

[['A', 'A', 'B', 'C', 'D', 'D'], ['a', 'f', 'z', 'z', '', ''], ['0', '9', '1', '2', '1', ''], ['a', '8', 'E', 'W', 'g', '6'], ['P', '5', 'h', '3', 'k', 'x']로 출력됨을 알 수 있었다.

다음 문제는 전치를 하는 거였는데, 원래는 2중 for문을 통해서 2차원배열 데이터에 접근한 다음에 조건문 if 를 통해 i와 j의 비교 연산을 확인해서 우하향 대각선 기준으로 뒤집는 것인데, 강의에서 좋은 전치방식을 외워와서 바로 사용해봤다.


# 전치를 진행해서 세로읽기를 진행한다 # 예시arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_arr = list(map(list, zip(*arr)))            # 예시new_arr = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
 

 

전치까지 완료 됐으면 출력만 해주면 깔끔하다.


# 한줄에 이어서 출력할 것이기 때문에 *언패킹과 사이에 공백제거, 출력후 공백제거를 넣어준다
for i in range(max_len):
    print(*new_arr[i], sep='', end='')
 

 

은근히 헤맸던 구간인데, 문자열 ' '을 포함해서 나오거나, 여러줄을 통해 출력이 되어버리거나 했기 때문에, 

[['A', 'a', '0', 'a', 'P', 'D'], ['A', 'f', '9', '8', '5', ''], ['B', 'z', '1', 'E', 'h', ''], ['C', 'z', '2', 'W', '3', '6'], ['D', '', '1', 'g', 'k', 'x'] 이라든가

A
a
0
a
P
A
f
9
8
5
B
z
1
E
h
C
z
2
W
3
D

1
g
k 라든가...

아직 정확히 개념이 안잡혀서 그런 것 같긴한데, 언패킹의 사용, 반복문 for문을 통한 print + sep, end를 사용하면 적절하게 출력할 수 있을 것이다.

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함