본문 바로가기
백준[BOJ]

[백준/BOJ-자바/Java] 10798: 세로 읽기

by 연둔 2023. 10. 18.
728x90
반응형

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

 

10798번: 세로읽기

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’

www.acmicpc.net


문제

분석

1. char형 2차원 배열을 만들어 데이터를 입력 받는다.

2. 입력 받는 데이터의 길이가 각각 다르기 때문에 변수 max를 선언해 최대 문자열의 길이를 넣는다.

3. 각각의 데이터를 입력 받고 이중 for문을 이용해 세로로 출력한다.

3-1. 데이터의 길이가 짧아 더이상 출력할 문자가 없는 경우를 위해, if문을 통해 출력할 값이 null인지 먼저 확인한다.

 

최초 작성 코드

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        char[][] cArray = new char[5][15]; //문자를 입력 받을 배열
        int max = 0; // 최대 문자열의 길이
        String[] sArray = new String[5]; // 문자열을 따로 저장할 배열

        for (int i = 0; i < 5; i++) { 
            sArray[i] = sc.next(); //데이터를 입력 받는다.
            if (max < sArray[i].length()) { // max를 비교해준다.
                max = sArray[i].length();
            }
            for (int j = 0; j < sArray[i].length(); j++) { // sArray[i]의 값을 cArray에 넣어준다.
                cArray[i][j] = sArray[i].charAt(j);
            }

        }

        for (int i = 0; i < 5; i++) { // max보다 문자열이 작을 경우 max 문자열과 길이를 맞춰주기 위해 빈 곳에 %를 삽입한다.
            if (sArray[i].length() < max) {
                for (int j = sArray[i].length(); j < max; j++) {
                    cArray[i][j] = '%';
                }
            }
        }

        for (int i = 0; i < max; i++) { 
            for (int j = 0; j < 5; j++) {
                if (Character.compare(cArray[j][i], '%') == 0) { // 데이터가 있는 값인지 없는 값인지 판별
                    continue;
                } else {
                    System.out.print(cArray[j][i]);
                }
            }
        }
    }
}

아주 형편없는 코드이다.. Math.max를 이용해 코드를 줄일 수 있고, %라는 대체 데이터 값을 넣지 않고도 null인지 아닌지 비교가 가능하다. 그렇게 되면 sArray도 사용하지 않아도 된다.

 

고칠 점

1. Math 클래스 사용

2. char 배열의 빈 곳에는 null 값이 있다. 대체 데이터를 넣지 않아도 '\0'을 통해 비교가 가능하다.

 

수정한 코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[][] cArray = new char[5][15];
        int max = 0;

        for (int i = 0; i < 5; i++) {
            String str = sc.next();
            max = Math.max(str.length(), max);
            for (int j = 0; j < str.length(); j++) {
                cArray[i][j] = str.charAt(j);
            }

        }

        for (int i = 0; i < max; i++) {
            for (int j = 0; j < 5; j++) {
                if (Character.compare(cArray[j][i], '\0') == 0) {
                    continue;
                } else {
                    System.out.print(cArray[j][i]);
                }
            }
        }
    }
}
728x90
반응형