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] 로 이차원 배열을 만들고 그대로 출력하면 된다.
입력
- int[][] 이차원 배열 생성.
- 표준입력을 바이트단위로 받아 빠르게 입력한다. (System.in.read())
연산
- 이차원 배열을 순회하며 세로로 읽은 문자를 StringBuilder 에 저장한다.
출력
- 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) |