여러 줄의 단어를 칠판에 적고, 이를 세로로 순서대로 읽어 새로운 단어를 만드는 문제입니다. 각 단어의 길이가 다를 수 있기 때문에, 존재하지 않는 글자는 건너뛰고 읽는 로직을 구현하는 것이 핵심입니다.
항목 | 내용 |
---|---|
문제 번호 | 10798번 - 세로읽기 |
난이도 | 브론즈 1 |
핵심 알고리즘 | 구현, 문자열, 2차원 배열 |
이 문제는 입력받은 여러 단어를 하나의 2차원 그리드(격자)로 생각하고 접근하면 이해하기 쉽습니다. 세로로 읽는다는 것은 그리드의 열(column)을 기준으로 문자를 순서대로 가져오는 것과 같습니다.
String
배열에 저장합니다. 이 배열을 5행 N열의 2차원 배열처럼 다룰 것입니다.String
배열(크기 5)에 저장합니다.maxLength
에 저장합니다.StringBuilder
를 생성합니다.for
반복문을 사용합니다. 바깥쪽 반복문은 열(column)을 0
부터 maxLength - 1
까지 순회합니다.0
부터 4
까지(5개의 단어) 순회합니다.현재 열 < 현재 단어의 길이
)StringBuilder
에 추가합니다.StringBuilder
에 저장된 최종 문자열을 출력합니다.예시:
ABC (길이 3)
DE (길이 2)
F (길이 1)
GHIJ (길이 4)
KLM (길이 3)
maxLength
= 4A
, D
, F
, G
, K
추가 -> ADFGK
B
, E
, H
, L
추가 -> ADFGKBEHL
C
, I
, M
추가 -> ADFGKBHLCIМ
J
추가 -> ADFGKBHLCIМJ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 1. 5개의 단어를 String 배열에 저장하고, 동시에 최대 길이를 찾는다.
String[] words = new String[5];
int maxLength = 0;
for (int i = 0; i < 5; i++) {
words[i] = br.readLine();
maxLength = Math.max(maxLength, words[i].length());
}
StringBuilder sb = new StringBuilder();
// 2. 세로로 읽기 (열 우선 순회)
for (int j = 0; j < maxLength; j++) { // 열 (column)
for (int i = 0; i < 5; i++) { // 행 (row)
// 3. 범위 체크: 현재 열이 현재 단어의 길이보다 작을 때만 문자를 추가
if (j < words[i].length()) {
sb.append(words[i].charAt(j));
}
}
}
// 4. 최종 출력
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
항목 | 설명 |
---|---|
최대 길이 찾기 | 반복문을 시작하기 전에 입력받은 문자열 중 가장 긴 길이를 먼저 찾아야 합니다. Math.max() 를 사용하면 편리합니다. |
인덱스 범위 예외 | 세로로 읽을 때, 현재 열의 인덱스가 특정 행의 문자열 길이를 벗어나지 않는지(j < strings[i].length() ) 반드시 확인해야 StringIndexOutOfBoundsException 오류를 피할 수 있습니다. |
출력 성능 | 여러 문자를 순서대로 이어 붙여 하나의 긴 문자열로 만들 때는, 반복적인 + 연산보다 StringBuilder 를 사용하는 것이 성능상 훨씬 유리합니다. |
2차원 배열 직접 생성? | char[][] 배열을 최대 크기로 생성하고 공백 등으로 채워서 푸는 방법도 있지만, 각 문자열의 길이를 직접 체크하는 방식이 메모리 측면에서 더 효율적입니다. |
✔️ 여러 줄의 문자열을 2차원 그리드로 간주하고 접근하는 것이 기본 아이디어입니다.
✔️ 가장 긴 문자열의 길이를 기준으로, 열(column)을 우선 순회하는 이중 반복문을 설계합니다.
✔️ 각 셀에 접근할 때마다, 해당 행의 문자열 길이가 현재 열 인덱스보다 큰지 범위 검사를 하는 것이 이 문제의 핵심입니다.
✔️ 조건을 만족하는 문자만 순서대로 StringBuilder
에 추가하여 최종 결과를 만듭니다.