백준 자바 2439번이다.
알고리즘
1 ~ 100 사이의 N이 주어지면 N번째 줄까지 하나씩 별을 오른쪽 정렬해서 출력한다.
1. 별의 개수 N을 받는다.
2. N번만큼 반복문을 돌린다.
3. (N - i번째 줄) 만큼 공백을 만들고 i번만큼 별을 만든다.
이번 문제는 기본적인 입출력을 사용한 풀이가 많으므로 비교하는 표를 먼저 표시한다.
이름 | 사용 반복문 | 메모리 | 시간 |
풀이 1 | for문 | 18856 KB | 372 ms |
풀이 2 | for문 + if문 | 18356 KB | 368 ms |
풀이 3 | while문 | 22060 KB | 372 ms |
풀이 4 | while문 + if문 | 18284 KB | 376 ms |
풀이 5 | while문 + for문 | 18328 KB | 404 ms |
풀이 6 | while문 + for문 + if문 | 18460 KB | 372 ms |
풀이1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N - (i + 1); j++) {
System.out.print(" ");
}
for (int j = 0; j < i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
기본적인 입출력을 사용해서 for문으로만 써서 해결
풀이2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (j < N - i - 1) {
System.out.print(" ");
} else {
System.out.print("*");
}
}
System.out.println();
}
}
}
for문과 if문을 써서 해결
풀이3
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int i, a, b;
i = a = b = 0;
while (i++ < N) {
a = b = 0;
while (a++ < N - i) System.out.print(" ");
while (b++ < i) System.out.print("*");
System.out.print("\\n");
}
}
}
while문만 사용하여 해결
풀이4
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int i = 0;
int j;
while (i++ < N) {
j = 0;
while (j++ < N) {
if (N - i + 1 > j)
System.out.print(" ");
else
System.out.print("*");
}
System.out.print("\\n");
}
}
}
while문 + if문으로 해결
풀이5
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int i = 0;
while (i++ < N) {
for (int j = 0; j < N - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.print("\\n");
}
}
}
while문 + for문으로 해결
풀이6
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int i = 0;
while (i++ < N) {
for (int j = 0; j < N; j++) {
if (j < N - i)
System.out.print(" ");
else
System.out.print("*");
}
System.out.print("\\n");
}
}
}
while문 + for문 + if문으로 해결
지금까지 기본적인 입출력인 Scanner와 print을 사용하면서 과정만 바꾸면서 해결하였는데 그것을 표로 만들어 메모리와 시간을 비교하겠습니다.
이름 | 사용 반복문 | 메모리 | 시간 |
풀이 1 | for문 | 18856 KB | 372 ms |
풀이 2 | for문 + if문 | 18356 KB | 368 ms |
풀이 3 | while문 | 22060 KB | 372 ms |
풀이 4 | while문 + if문 | 18284 KB | 376 ms |
풀이 5 | while문 + for문 | 18328 KB | 404 ms |
풀이 6 | while문 + for문 + if문 | 18460 KB | 372 ms |
위 표를 봤을 때 코드 길이가 길거나 메모리를 많이 먹는다고해서 시간이 짧아지거나 길어지는 것은 아니었다는 것을 알 수 있다. 여기서 시간이 짧은 풀이2, 시간이 긴 풀이5, 메모리를 많이 사용하는 풀이3 의 입출력을 개선하여 해결해보겠습니다.
풀이2 + 입출력 개선
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
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));
int N = Integer.parseInt(br.readLine());
br.close();
int i = 0;
while (i++ < N) {
for (int j = 0; j < N; j++) {
if (j < N - i)
bw.write(" ");
else
bw.write("*");
}
bw.newLine();
}
bw.flush();
bw.close();
}
}
BufferedReader 와 BufferedWriter 를 사용하였음.
BufferedWriter → StringBuilder 로 바꿔도 메모리와 시간이 거의 똑같기때문에 성능이 비슷함.
풀이3 + 입출력 개선
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int i, a, b;
i = a = b = 0;
while (i++ < N) {
a = b = 0;
while (a++ < N - i) sb.append(" ");
while (b++ < i) sb.append("*");
sb.append('\\n');
}
System.out.print(sb);
}
}
기본적인 입출력에서 메모리를 제일 많이 사용했지만 입출력을 개선하니 효율적인 성능을 보여준다.
풀이5 + 입출력 개선
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int i = 0;
while (i++ < N) {
for (int j = 0; j < N - i; j++) {
sb.append(" ");
}
for (int j = 0; j < i; j++) {
sb.append("*");
}
sb.append('\\n');
}
System.out.print(sb);
}
}
기본적인 입출력으로 시간이 길었는데 입출력을 개선하니 성능이 효율적으로 나온다.
결론
지금까지 기본적인 입출력에서 다양한 과정으로 해결해보았고, 거기서 몇 가지를 입출력만 개선하여 다시 해결해보았는데 결과가 예상과는 달라서 앞으로는 입출력을 먼저 개선해놓고 알고리즘을 변경하는 것으로 학습해야겠다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 2577번 - Java(자바) (0) | 2022.01.23 |
---|---|
[백준] 2562번 - Java(자바) (0) | 2022.01.18 |
[백준] 10818번 - Java(자바) (0) | 2022.01.14 |
[백준] 1110번 - Java(자바) (0) | 2022.01.11 |
[백준] 10952번 - Java(자바) (0) | 2022.01.09 |