10798번 : 세로읽기

2024. 1. 6. 16:54개인활동/코테

 

 

10798번: 세로읽기

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’

www.acmicpc.net

입력받은 값을 열별로 읽어와 차례대로 한줄로 출력하는 문제이다.

 

이때 한 행에 들어가는 데이터의 수가 최소 1개, 최대 15개이다.

이 부분을 어떻게 해결할 것인가가 가장 큰 포인트

 

오늘도 머리가 안돌아가 gpt의 코드 수정 서비스를 받아봤다. 

 

matrix = []
max_length = 0  # 최대 행 길이를 저장할 변수

# 입력 받으면서 최대 행 길이를 찾음
for i in range(5):
    row = list(map(str, input().strip()))
    matrix.append(row)
    max_length = max(max_length, len(row))

# 행의 길이를 최대 길이에 맞게 조절
for i in range(5):
    matrix[i] += [''] * (max_length - len(matrix[i]))

# 열 먼저 출력
for i in range(max_length):  # 열
    for j in range(5):  # 행
        print(matrix[j][i], end='')

열을 우선적으로 읽어들이는 것은 매우 쉽다.

다만 행의 길이가 다 같지 않기에 이를 어떻게 처리할 것인가?

 

gpt 선생님은 빈공간을 넣어주어 열수를 맞춰주고 출력한다.

 

출력할 때 end='' 옵션으로 인해 어차피 공백없이 출력이 된다.

따라서 읽어서 출력할 때 빈 공간을 읽더라도 자연스레 무시하게 되는 원리임


그리고 이제 숏코드 분석

print(''.join(sum(zip(*eval('input()+" "*15,'*5)),())).replace(' ',''))

1. 빈 문자열에 join을 해주고 있음

2. 최대 입력되는 문자열이 15이기 때문에 input() 값에 빈 문자열 15개를 일단 붙여줌

3. 그리고 input값을 총 5번(5행까지 입력되기 때문) 받기 위해 *5를 붙여줌

4. asterisk가 붙는 이유는 입력받은 문자열을 unpacking하여 문자로 분리할 수 있도록 함

5. zip 함수를 통해 입력받은 문자들을 하나로 묶어주고, 공백은 replace를 이용해 없애줌

6. 그리고 문자들을 sum을 이용해 하나로 합쳐 빈 문자열인 ''에 넣어 출력한다.

 

 

이런 코드는 어떻게 생각하는걸까?

 

늘 신기하다.

'개인활동 > 코테' 카테고리의 다른 글

백준 2587번 : 대푯값  (0) 2024.01.12
백준 2750 : 오름차순 정렬  (0) 2024.01.12
2556번 : 최댓값  (1) 2024.01.04
백준 2738번 : 행렬 덧셈  (0) 2024.01.02
백준 11718번: 그대로 출력하기  (0) 2023.09.13