백준 10798번: 세로읽기

레곤토르닉·2025년 8월 18일
0

BaekJoon

목록 보기
40/64
post-thumbnail

백준 10798번: 세로읽기

여러 줄의 단어를 칠판에 적고, 이를 세로로 순서대로 읽어 새로운 단어를 만드는 문제입니다. 각 단어의 길이가 다를 수 있기 때문에, 존재하지 않는 글자는 건너뛰고 읽는 로직을 구현하는 것이 핵심입니다.


✅ 문제 개요

항목내용
문제 번호10798번 - 세로읽기
난이도브론즈 1
핵심 알고리즘구현, 문자열, 2차원 배열

✅ 문제 설명 요약

  • 입력: 총 5줄에 걸쳐, 한 줄에 하나씩 단어가 주어집니다. 단어는 알파벳 대소문자와 숫자로 이루어져 있습니다.
  • 출력: 주어진 5개의 단어를 세로로 읽은 순서대로 출력합니다.
  • 규칙:
    • 각 단어의 길이는 1 이상 15 이하입니다.
    • 세로로 읽을 때 해당 칸에 글자가 없으면, 그 글자는 건너뛰고 다음 글자를 읽습니다.

✅ 풀이 전략

이 문제는 입력받은 여러 단어를 하나의 2차원 그리드(격자)로 생각하고 접근하면 이해하기 쉽습니다. 세로로 읽는다는 것은 그리드의 열(column)을 기준으로 문자를 순서대로 가져오는 것과 같습니다.

1️⃣ 핵심 아이디어: 2차원 배열처럼 접근하기

  • 5개의 단어를 String 배열에 저장합니다. 이 배열을 5행 N열의 2차원 배열처럼 다룰 것입니다.
  • 문제의 핵심은 각 행(단어)의 길이가 다르다는 점입니다. 따라서 열의 최대 길이를 알아야 합니다.

2️⃣ 알고리즘 설계

  1. 입력 저장 및 최대 길이 찾기:
    • 5개의 단어를 String 배열(크기 5)에 저장합니다.
    • 단어를 입력받으면서, 동시에 가장 긴 단어의 길이를 찾아 변수 maxLength에 저장합니다.
  2. 세로로 읽기 (열 우선 순회):
    • 결과를 저장할 StringBuilder를 생성합니다.
    • 이중 for 반복문을 사용합니다. 바깥쪽 반복문은 열(column)0부터 maxLength - 1까지 순회합니다.
    • 안쪽 반복문은 행(row)0부터 4까지(5개의 단어) 순회합니다.
  3. 범위 체크 및 문자 추가:
    • 안쪽 반복문에서, 현재 열의 인덱스가 현재 행에 해당하는 단어의 길이보다 작은지 확인합니다. (현재 열 < 현재 단어의 길이)
    • 이 조건이 참이라면, 해당 위치에 문자가 존재한다는 의미이므로, 그 문자를 StringBuilder에 추가합니다.
    • 조건이 거짓이라면, 해당 위치에는 문자가 없는 것이므로 아무것도 하지 않고 넘어갑니다.
  4. 최종 출력: 모든 반복이 끝나면, StringBuilder에 저장된 최종 문자열을 출력합니다.

예시:

ABC   (길이 3)
DE    (길이 2)
F     (길이 1)
GHIJ  (길이 4)
KLM   (길이 3)
  1. 최대 길이: maxLength = 4
  2. 열 0 순회: A, D, F, G, K 추가 -> ADFGK
  3. 열 1 순회: B, E, H, L 추가 -> ADFGKBEHL
  4. 열 2 순회: C, I, M 추가 -> ADFGKBHLCIМ
  5. 열 3 순회: J 추가 -> ADFGKBHLCIМJ

✅ Java 코드 예제

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에 추가하여 최종 결과를 만듭니다.

profile
기록은 나의 무기, 원칙은 나의 방패

0개의 댓글