알고리즘 공부/백준

[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");
    }
}
  • 가독성으로 봤을 때 스트림을 안쓰는것이 가독성이 더 높다.
  • 스트림은 기준점을 두고 반으로 잘라서 앞뒤가 같으면 팰린드룸 문자열로 판단한다.