알고리즘 공부/백준
[JAVA 백준 18일차 / 하루 3문제] 3003번, 2444번, 10988번
maverick11471
2025. 2. 19. 09:25
1. 3003번 킹, 퀸, 룩, 비숍, 나이트, 폰
가. 스트림을 안쓸 때
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader로 입력 받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 한 줄 전체를 읽은 후, StringTokenizer로 분리
StringTokenizer st = new StringTokenizer(br.readLine());
// 체스 말의 정답 개수 배열 (순서대로 킹, 퀸, 룩, 비숍, 나이트, 폰)
int[] correct = {1, 1, 2, 2, 2, 8};
// 결과를 담을 StringBuilder (출력 최적화)
StringBuilder sb = new StringBuilder();
// 6개 숫자에 대해 정답과의 차이를 계산 후 StringBuilder에 저장
for (int i = 0; i < 6; i++) {
int count = Integer.parseInt(st.nextToken());
sb.append(correct[i] - count);
if(i < 5) {
sb.append(" ");
}
}
// 결과 출력
System.out.println(sb);
}
}
나. 스트림 사용 시
import java.io.*;
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader로 입력 받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 체스 말의 정답 개수 배열 (순서대로 킹, 퀸, 룩, 비숍, 나이트, 폰)
int[] correct = {1, 1, 2, 2, 2, 8};
// 입력받은 한 줄을 공백으로 분리
String[] inputs = br.readLine().split(" ");
// IntStream을 이용해 각 항목별로 계산 후 문자열로 변환
String result = IntStream.range(0, 6)
.mapToObj(i -> String.valueOf(correct[i] - Integer.parseInt(inputs[i])))
.collect(Collectors.joining(" "));
// 결과 출력
System.out.println(result);
}
}
- 스트림의 범위는 range메서드를 사용
- mpaToObj는 기본형 스트림에서 객체 스트림으로 변형시킨다. 이유는 Collectors.joining이 Stream<String>을 요구하기 때문이다.
2. 2444번 별찍기
가. 스트림을 안쓸 때
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 입력을 빠르게 받기 위한 BufferedReader 설정
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 출력을 위한 BufferedWriter 설정
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 상단 부분: 1부터 N까지
for (int i = 1; i <= N; i++) {
// 공백 출력: N-i 개
for (int j = 0; j < N - i; j++) {
bw.write(" ");
}
// 별 출력: 2*i - 1 개
for (int j = 0; j < 2 * i - 1; j++) {
bw.write("*");
}
bw.newLine();
}
// 하단 부분: N-1부터 1까지
for (int i = N - 1; i >= 1; i--) {
// 공백 출력: N-i 개
for (int j = 0; j < N - i; j++) {
bw.write(" ");
}
// 별 출력: 2*i - 1 개
for (int j = 0; j < 2 * i - 1; j++) {
bw.write("*");
}
bw.newLine();
}
// 출력 버퍼 비우기
bw.flush();
bw.close();
br.close();
}
}
나. 스트림 사용 시
import java.io.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 상단 부분: 1부터 N까지
IntStream.rangeClosed(1, N)
.mapToObj(i -> " ".repeat(N - i) + "*".repeat(2 * i - 1))
.forEach(System.out::println);
// 하단 부분: N-1부터 1까지
IntStream.rangeClosed(1, N - 1)
.mapToObj(i -> " ".repeat(i) + "*".repeat(2 * (N - i) - 1))
.forEach(System.out::println);
}
}
다. Java 11 이상
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 상단 부분: 1부터 N까지
for (int i = 1; i <= N; i++) {
String spaces = " ".repeat(N - i);
String stars = "*".repeat(2 * i - 1);
System.out.println(spaces + stars);
}
// 하단 부분: N-1부터 1까지
for (int i = N - 1; i >= 1; i--) {
String spaces = " ".repeat(N - i);
String stars = "*".repeat(2 * i - 1);
System.out.println(spaces + stars);
}
}
}
- 상단 부분: 반복문 for (int i = 1; i <= N; i++)를 통해 각 줄에 대해 필요한 공백과 별의 개수를 계산하고 출력.
- 하단 부분: 반복문 for (int i = N - 1; i >= 1; i--)를 사용하여 상단과 대칭인 형태로 별을 출력.
- 공백의 개수 = N - i / 별의 개수 = 2 * i - 1
- Java 11 이상에서는 String.repeat(int) 메서드를 사용 가능
- 스트림이 for문보다 직관적이지는 않다.
3. 10988번 팰린드롬인지 확인하기
가. 스트림을 안쓸 때
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 입력 받기 위한 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
// StringBuilder를 사용해 문자열 뒤집기
String reversed = new StringBuilder(s).reverse().toString();
// 원본과 뒤집은 문자열을 비교하여 팰린드롬 여부 확인
System.out.println(s.equals(reversed) ? "1" : "0");
}
}
나. 스트림 사용 시
import java.io.*;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) throws IOException {
// 입력 받기 위한 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
// 문자열의 절반만 확인하면서 좌우 대칭이 맞는지 IntStream으로 체크
boolean isPalindrome = IntStream.range(0, s.length() / 2)
.allMatch(i -> s.charAt(i) == s.charAt(s.length() - 1 - i));
// 결과 출력
System.out.println(isPalindrome ? "1" : "0");
}
}
- 가독성으로 봤을 때 스트림을 안쓰는것이 가독성이 더 높다.
- 스트림은 기준점을 두고 반으로 잘라서 앞뒤가 같으면 팰린드룸 문자열로 판단한다.