(Java) 백준 10798번 - 세로읽기

코딩너구리·2026년 1월 29일

코딩 문제 풀이

목록 보기
190/266

https://www.acmicpc.net/problem/10798

문제

> 아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다. 

> 이 장난감에 있는 글자들은 영어 대문자 ‘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

> 한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다.
> 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다. 

> 심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다.
> 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다.
> 다음에 두 번째 글자들을 세로로 읽는다. 
> 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다.
> 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 
> 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 
> 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다. 

> 그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

> 칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.

접근

이차원 동적배열을 생성하여 단어의 최대 길이가 15이므로 바깥일차원 배열의 크기를 15로 만들어준다.
이제 5개의 단어에 대해 해당 자리수에 단어가 있으면 미리 15크기로 만든 배열에 들어간다. 없으면 동적 배열이므로 들어가지 않는다.
모두 저장하고 난 후 총 15개의 인덱스에 대해 각각 가지고 있는 값(최대 5개)를 출력한다. 그럼 세로로 읽어진다.

문제해결

> 이차원 동적 배열 ch를 Character 형으로 선언해준다.
> 길이가 최대 15글자 이므로 바깥 배열의 크기를 미리 15로 만들어준다.
> 각 단어를 str에 입력받고 문자의 길이를 인덱스로 동적 배열에 맞는 인덱스에 접근하여 해당 단어의 문자를 추가해준다.
> get으로 넣고자 하는 인덱스를 가져오고 add로 동적으로 추가해준다.
> 각 자리수에 대해 단어가 있는 배열만 반복문에 걸려 문자가 출력된다. 

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //10798번 세로 읽기
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<ArrayList<Character>> ch = new ArrayList<>();

        for(int i = 0; i < 15; i++) ch.add(new ArrayList<>());
        for(int i = 0; i < 5; i++)
        {
            String str = br.readLine();
            for(int j = 0; j < str.length(); j++) ch.get(j).add(str.charAt(j));
        }
        StringBuilder sb = new StringBuilder();
        for(ArrayList<Character> al : ch) for(char c : al) sb.append(c);

        System.out.print(sb);
    }
}

후기

c++의 vector처럼 push_back해주는 기능이 없을까 하다가 ArrayList라는 동적 배열이 있는걸 새로 알게 되었다. .add가 push_back의 역할을 해준다고 한다. 아주 편하고 좋다.

0개의 댓글