[백준 문제 풀이] 10798번 세로 읽기

Junu Kim·2025년 7월 5일
0
post-thumbnail

[10798] 세로읽기

난이도: ★★☆☆☆ • solved on: 2025-07-05



문제 요약

  • 문제 유형: 문자열 처리, 구현
  • 요구사항: 5줄의 문자열이 주어질 때, 세로로 읽어서 한 줄의 문자열로 출력해야 한다.

사용 개념

  1. 자료구조
    • char[] 1차원 문자 배열
    • String[] 문자열 배열
  2. 알고리즘/기법
    • 중첩 for문을 활용한 세로 순회
    • 조건문을 통한 빈칸/null 처리
  3. 핵심 키워드
    • 세로 읽기, 문자열 패딩, 입력 최적화

풀이 아이디어 및 코드

방법 1 : 1차원 배열과 인덱스 변환 활용

  1. 문제 분해
  • 입력을 한 줄씩 받아 각 글자를 1차원 char 배열의 인덱스(j*5+i)에 저장
  • 마지막에 result 배열을 순차적으로 탐색하면서 '\0'이 아닌 문자만 StringBuilder에 추가
  1. 핵심 로직 흐름
for i = 0 to 4:
  각 줄의 문자 j에 대해 result[j*5+i]에 저장
result 배열을 순회하며 '\0'이 아닌 값만 출력
  1. 예외 처리
  • 입력이 5줄이 안 될 경우 null 체크
  • result 배열 크기를 75(15×5)로 선언
import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        char[] result = new char[75];
        for(int i = 0; i < 5; i++){
            String line = br.readLine();
            if(line == null){
                break;
            }
            char[] rows = line.toCharArray();
            for(int j = 0; j < rows.length; j++){
                result[j*5+i] = rows[j];
            }
        }

        for(int i = 0; i < 75; i++){
            if(result[i] != '\0'){
                sb.append(result[i]);
            }
        }
        System.out.println(sb.toString());
    }
}

방법 2 : String 배열만으로 세로읽기 (공간 미세 최적화)

  1. 문제 분해
  • 입력값을 String 배열에 저장, 각 줄의 최대 길이(maxLen)를 따로 구함
  • 세로(열 우선)로 0~maxLen-1까지 순회, 각 행에 대해 해당 인덱스의 문자가 존재하면 StringBuilder에 추가
  1. 핵심 로직 흐름
for j = 0 to maxLen-1:
  for i = 0 to 4:
    arr[i]의 길이가 j보다 크면 arr[i].charAt(j) 추가
  1. 예외 처리
  • 각 줄의 길이가 다를 수 있으므로 인덱스 초과 방지
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] arr = new String[5];
        int maxLen = 0;

        for (int i = 0; i < 5; i++) {
            arr[i] = br.readLine();
            maxLen = Math.max(maxLen, arr[i].length());
        }

        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < maxLen; j++) {
            for (int i = 0; i < 5; i++) {
                if (arr[i].length() > j) {
                    sb.append(arr[i].charAt(j));
                }
            }
        }
        System.out.println(sb);
    }
}

시간·공간 복잡도

방법 1

  • 시간 복잡도 : O(1) (입력이 작으므로 사실상 상수)
  • 공간 복잡도 : O(1) (char[75]만 사용)

방법 2

  • 시간 복잡도 : O(1)
  • 공간 복잡도 : O(1) (String[5]만 사용, 불필요한 패딩 없음)

어려웠던 점

  • 방법 1에서는 인덱스 계산을 위해 j×5+i, j×15+i 등 배수 선택이 헷갈렸고, 이로 인한 IndexOutOfBoundsException 에러를 맞닥뜨렸다.
  • 입력 줄마다 길이가 달라서 패딩/빈칸/null 처리 등 경계 조건을 신경 써야 했다.
  • 시간/공간 복잡도를 어떻게 하면 더 줄일 수 있을지 고민하느라 코드보다 로직 설계에 더 많은 시간을 소모했다.

배운 점 및 팁

  • 입력 크기가 작을 때는 성능보다는 코드의 간결성직관성이 더 중요할 수 있다. (효율성은 미세한 차이만 나기 때문)
  • 2차원 배열이나 패딩 대신, String 배열과 인덱스 체크만으로 훨씬 직관적으로 처리 가능하다
  • IndexOutOfBoundsException 오류는 인덱스 변환이 꼬일 때 자주 발생하니, 가능한 한 직관적인 구조로 코드를 작성하는 게 디버깅에 유리했다.

참고 및 링크


추가 연습 문제

  • 비슷한 유형 (GPT 추천):
    • [15988] 1, 2, 3 더하기 3 (여러 줄 입력 + 인덱싱)
    • [1152] 단어의 개수 (문자열 처리)
  • 확장 문제 (GPT 추천):
    • 여러 행의 문자열을 지그재그나 나선형 등으로 읽어서 출력하는 문제
profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글