문제링크
문제
아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.
이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.
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
<그림 1>
한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.
심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.
그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:
Aa0aPAf985Bz1EhCz2W3D1gkD6x
칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.
입력
총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.
출력
영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.
예제입력
ABCDE
abcde
01234
FGHIJ
fghij
예제출력
Aa0FfBb1GgCc2HhDd3IiEe4Jj
예제입력2
AABCDD
afzz
09121
a8EWg6
P5h3kx
예제출력2
Aa0aPAf985Bz1EhCz2W3D1gkD6x
풀이
문제이해
이전에 풀었던 행렬 덧셈 문제와 마찬가지로, 이 문제 역시 행렬을 이용하여 풀 수 있습니다.
입력 예시를 살펴보면, 첫 번째 줄에 'ABCDE'와 같은 대문자 문자열이, 그 다음 줄에 'abcde'와 같은 소문자 문자열이 총 5번 입력되는 것을 확인할 수 있습니다
이 부분을 구현해 보면, 문자열을 5번 입력 받아 각각 N 리스트에 추가할 수 있습니다. 이를 위해 for문을 활용하여 반복 작업을 간편하게 구현할 수 있습니다.
이때, max 변수를 하나 만들어서 5번의 입력을 받은 문자열 중 가장 긴 문자열의 길이를 기록해둡니다.
for문을 사용하여 입력받은 N[i]의 문자열 길이를 len() 함수를 사용하여 구하고, 기존의 max값보다 클 경우 그 길이를 max 변수에 저장해줍니다.
max 변수를 사용하여 입력받은 값 중 가장 긴 문자열의 길이를 구하는 이유는, 출력할 때 모든 행에 대해 최대 길이만큼 반복해야하기 때문입니다. 입력된 문자열의 길이의 최대 값을 구하기 위해 max 변수를 사용합니다.
실제로 N에 저장될 때는 ['ABCDE','abcde','01234','FGHIJ','fghij']와 같이 형태로 저장됩니다.
세로읽기로 값 출력하기
출력하는 부분은 이중 for문을 사용하여, 행(j)을 5번, 열(i)의 개수만큼 반복하여 출력합니다.
이때 print문의 괄호 두 개는 N 리스트의 j번째 요소가 가리키는 문자열에서 i번째 인덱스에 해당하는 문자를 의미합니다. 예를 들어, "111", "222", "333", "444", "555"이라는 문자열이 입력되었다면, 가장 첫 번째로 j번째 요소 "111" 중 i번째 인덱스에 해당하는 문자 "1"을 가져오는 것입니다.
하지만 주의해야 할 점이 있습니다. 입력받은 문자열의 길이가 다를 경우, 예를 들어 입력받은 문자열중 가장 길이가 큰 문자열이 5라서 max값이 5로 설정되어있지만 입력받았던 문자열 중 길이가 4인 문자열이 있다면, 해당 문자열의 열(i)이 존재하지 않아 반복문을 돌며 출력할 때 인덱스 요소에 접근하지 못하여 IndexError가 발생할 수 있습니다.
IndexError 오류 시도해본것
위에처럼 count()함수로 값이 요소가 없는부분을 그냥 공백으로 표시하려고해도 해당 index에 접근하지못하니 오류가 발생합니다.
이걸 글로만 설명하면 이해가 어려울 수 있으니 자세히 설명해보겠습니다.
해당 이미지 처럼, 모든 입력된 값들이 최대 자리수 max만큼으로 동일한 길이를 가지게 된다면, 입력받은 리스트 N의 각 요소는 모두 max 길이를 가지게 됩니다. 이러한 경우에는 세로로 출력이 가능하며, 위에서 언급한 인덱스 오류도 발생하지 않습니다.
하지만 위와 같이 길이가 서로 다른 값을 입력받은 경우에는 IndexError가 발생합니다.
N[2][4]번째는 문자열을 입력받은것이 없기 때문에 오류가 발생하는데, 이부분을 건너뛰면 N[3][4]번째는 '3'이라는 문자인 3이 출력됩니다. 이렇게 빈 index요소를 건너 뛰기위해서는 예외처리를 사용하면 됩니다.
예외처리하기
IndexError가 발생하는 부분은 예외처리로 건너뛰고 다음 N리스트의 j번째요소의 i번째 인덱스에 해당하는 문자열을 불러오면됩니다.
빈 요소에 접근하지 못하여 IndexError가 발생하는 부분은 예외처리로 건너뛴 뒤, 나머지 문자열이 세로로 출력됩니다.
최종 코드
N=[]
max=0
for i in range(5):
N.append(input())
if max <= len(N[i]):
max = len(N[i])
for i in range(max):
for j in range(5):
try:
print(f'{N[j][i]}', end='')
except IndexError:
continue
문제의 출력 예시에서는 세로로 읽은 문자열들을 한 줄로 표시해주었습니다. 따라서, 출력할 때 end=""를 사용하여 줄바꿈 없이 출력하면 조건에 맞게 변경됩니다.
출력 결과
예제입력 동일한 길이의 문자열
이제 예시처럼 한줄로 값이 출력됩니다.
예제입력2 길이가 다른 문자열
예제 입력2처럼 길이가 다른 문자열을 입력받아도 한줄로 잘 출력됩니다.