묠니르묘묘
꾸준히 성장하는 개발자스토리
묠니르묘묘
전체 방문자
오늘
어제
  • 분류 전체보기 (188)
    • 프로그래밍 (48)
      • 디자인패턴 (4)
      • 예외,에러 (4)
      • Java (29)
      • Kotlin (3)
      • React.js (4)
      • JavaScript (2)
      • Apache Kafka (2)
    • Spring (49)
      • Spring (21)
      • Spring Cloud (3)
      • JPA (25)
    • 코딩테스트 (31)
      • 알고리즘 (5)
      • Java - 백준 (26)
      • Java - 프로그래머스 (0)
    • AWS (7)
    • 데이터베이스 (6)
    • 개발 etc (23)
    • 도서 (5)
    • 회고록 (4)
    • 데브코스-데이터엔지니어링 (15)

인기 글

최근 글

hELLO · Designed By 정상우.
묠니르묘묘

꾸준히 성장하는 개발자스토리

[백준] 2439번 - Java(자바)
코딩테스트/Java - 백준

[백준] 2439번 - Java(자바)

2022. 1. 4. 18:00

백준 자바 2439번이다.

 

https://www.acmicpc.net/problem/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
    '코딩테스트/Java - 백준' 카테고리의 다른 글
    • [백준] 2562번 - Java(자바)
    • [백준] 10818번 - Java(자바)
    • [백준] 1110번 - Java(자바)
    • [백준] 10952번 - Java(자바)
    묠니르묘묘
    묠니르묘묘

    티스토리툴바