아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.
이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.
심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.
그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:Aa0aPAf985Bz1EhCz2W3D1gkD6x
칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.
총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.
영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.
✅ 최대 15글자의 단어를 5줄씩 입력받으므로 크기가 5*15인 2차원 배열을 선언. 입력받은 데이터를 배열에 저장할 때, 각 행의 크기가 다르기 때문에 안쪽 for문을 수행할 때 입력받은 단어의 길이를 기준으로 반복문을 수행한다. 이 때, 단어 길이의 최댓값
max
를 구하는데, 이는 다음 반복문에 사용된다!
두번째 for문을 통해 세로 읽기를 수행하는데, 바깥 for문의 조건문에max
를 사용하여 가장 긴 단어의 길이만큼 반복 수행. 열 크기는 5로 고정되어있기 때문에 안쪽 for문은 5번씩 반복 수행. 이 때, 읽어야 하는 요소의 값이 초기값인 경우에는continue
문을 통해 출력문을 건너뛰고 다음 반복 수행
❌ 이 문제 역시 전체적인 로직은 맞고, Eclipse에서는 제대로 된 출력값을 도출하지만 오답 처리됨. 원인은
char[]
의 초기값을' '
로 줬기 때문이다.
import java.io.*;
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));
char[][] word = new char[5][15];
int max = 0; // 가장 긴 단어의 길이
for(int i=0;i<5;i++) {
String s = br.readLine();
if(s.length() > max) max = s.length();
for(int j=0;j<s.length();j++) {
word[i][j] = s.charAt(j);
}
}
for(int i=0;i<max;i++) {
for(int j=0;j<5;j++) {
if(word[j][i] == ' ') continue;
bw.write(word[j][i] + "");
}
}
br.close();
bw.close();
}
}
✅
char[]
의 초기값은' '
가 아니라'0'
이다! 아무 생각 없이 공백이니까' '
라고 줘버렸다,, 그놈의 아스키 코드,,
'0'
라고 입력하면 문자 0으로 인식해서 입력된 값이 0일 때 continue를 수행하므로, 그냥0
이나 이스케이프 문자를 사용하여'\0'
로 적을 것!
...
for(int i=0;i<max;i++) {
for(int j=0;j<5;j++) {
if(word[j][i] == '\0') continue;
bw.write(word[j][i] + "");
}
}
...