Q 10798 세로읽기

💡 문제 요약 및 분석

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

위와 같은 배열을 세로로 읽어서 출력하면 되는 문제. 중간에 빈 부분은 공백 없이 연결한다.

💡 알고리즘 설계

✅ 핵심 아이디어 : int[5][15] 로 이차원 배열을 만들고 그대로 출력하면 된다.

  1. 입력

    • int[][] 이차원 배열 생성.
    • 표준입력을 바이트단위로 받아 빠르게 입력한다. (System.in.read())
  2. 연산

    • 이차원 배열을 순회하며 세로로 읽은 문자를 StringBuilder 에 저장한다.
  3. 출력

    • StringBuilder 로 한 번에 출력한다.

💡 코드

public class Main {
    public static void main(String[] args) throws Exception {
        int[][] ary = new int[5][15];
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 15; j++) {
                int input = System.in.read();
                if (input < 47) break;
                ary[i][j] = input;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < 15; j++) {
            for (int i = 0; i < 5; i++) {
                int num = ary[i][j];
                if (num < 47) continue;
                sb.append((char) num);
            }
        }
        System.out.println(sb);
    }
}

💡 틀린 부분 분석

System.in.read() 사용 방식이 틀렸다. 한 바이트씩 읽으며 개행 문자 ‘\n’ 까지 읽기 때문에 이를 적절히 처리하지 않으면 배열에 쓰레기값이 들어가버린다. 문자열의 경우 BufferedReader 로 처리하는 것이 더 안정적이라고 해서 입력 방식을 바꿨다.

import java.io.*;

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

        for (int i = 0; i < 5; i++) {
            String line = br.readLine();
            if (max < line.length()) max = line.length();
            for (int j = 0; j < line.length(); j++) {
                ary[i][j] = line.charAt(j);
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < max; j++) {
            for (int i = 0; i < 5; i++) {
                if (ary[i][j] != '\0') {
                    sb.append(ary[i][j]);
                }
            }
        }

        System.out.println(sb);
    }
}

💡 시간 복잡도, 공간 복잡도

시간 복잡도공간 복잡도
O(1)O(1)