Java Day 15

YDC·2025년 6월 28일

우테코8기

목록 보기
15/23

Day 14 복습

e.printStackTrace();란?

Exception 객체인 e가 가진 정보를 터미널(콘솔)에 출력해주는 메서드
주로 try-catch 블록 안에서 예외가 발생했을 때 디버깅용으로 사용됨

Cs 동기화

항목synchronizedReentrantLock + Condition
락 획득/해제자동 (synchronized 블록 진입/종료 시)수동 (lock() / unlock() 직접 호출)
대기 메서드wait()await()
신호 메서드notify() / notifyAll()signal() / signalAll()
조건 변수 개수1개 (공통 대기방)여러 개 가능 (newCondition()으로 분리)
락 상태 확인불가isLocked(), isHeldByCurrentThread() 등 제공
타임아웃 락불가tryLock(timeout) 가능
공정성 설정 (FIFO)없음생성 시 new ReentrantLock(true)로 가능
예외 처리 구조try-catch 없어도 안전try-finallyunlock() 보장해야 안전
조건 변수 분리 사용불가 (wait 모두 공유)가능 (예: notFull, notEmpty 각각 따로 만들 수 있음)

제네릭(Generic): 데이터 타입을 클래스나 메서드를 선언할 때 결정하지 않고, 사용할 때 지정하는 방법.

타입을 일반화(generalize)하여, 재사용성과 안정성을 높임.

타입을 정해두지 않아서 어떤 타입이든 받은대로 나감

Optional 이란?

Null 방지용 안전 래퍼 클래스
Optional 의 메소드에 따라 true/false 출력함
NullPointerException 예방
메서드 리턴값으로 값이 없을 수도 있다"는 걸 명확하게 전달
if문이나 try-catch 없이도 null 체크가 가능

메서드설명예시 코드
of()null이 아닌 값을 감쌈 (null이면 예외 발생)Optional.of("값")
ofNullable()null일 수도 있는 값을 감쌈Optional.ofNullable(name)
isPresent()값이 존재하는지 확인 (true/false 반환)if (opt.isPresent()) { ... }
ifPresent()값이 있을 때만 실행opt.ifPresent(val -> System.out.println(val))
orElse()값이 없을 때 기본값 반환opt.orElse("기본")
orElseThrow()값이 없으면 예외 던짐opt.orElseThrow(() -> new IllegalArgumentException())

Set과Map이란?

새로운 집합을 생성하는 자료구조

set이란?

중복을 허락하지 않는 집합

Map이란?

key와 value를 가지고 있는 집합
Keys는 중복 안되나 value 중복은 가능함

자료구조집합?특징중복 허용순서 보장
int[], String[] (배열)고정 크기, 빠른 인덱스 접근
List<String> (예: ArrayList)크기 유동적, 인덱스 기반
Set<String>중복 자동 제거❌ (HashSet), ✅ (LinkedHashSet)
Map<String, Integer>✅ (Key-Value 구조)Key로 값에 접근, 빠른 조회Key ❌ / Value ⭕❌ (HashMap), ✅ (LinkedHashMap)

학습목표

1.백준 5문제

  • 10951 A+B-4
  • 10807 개수세기
  • 10871 x보다 작은 수
  • 10818 최소,최대
  • 2562 최댓값

2.java

  • Stream 체이닝 (filter → map → collect) 응용 정리

1.백준 5문제

1.10951 A+B-4

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1

1 1
2 3
3 4
9 8
5 2

예제 출력 1

2
5
7
17
7

풀이

package loop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_10951_APlusB5 {
    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line= br.readLine()) != null){
            StringTokenizer st = new StringTokenizer(line);
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            System.out.println(a+b);
        }

    }
}

입력이 없으면 시스템 종료(EOF) Scanner가 아닌 BufferedReader 사용으로 입력 값이 많아 졌을때 처리 속도 증가

2.10807 개수 세기

문제

총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.

예제 입력 1

11
1 4 1 2 4 2 4 2 3 4 4
2

예제 출력 1

3

예제 입력 2

11
1 4 1 2 4 2 4 2 3 4 4
5

예제 출력 2

0

풀이

package array;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Count {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int [] arr = new int [n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i =0;i<n;i++){
            arr[i] = Integer.parseInt(st.nextToken());
    }
        int v = Integer.parseInt(br.readLine());
        int count = 0;
        for (int i =0;i<n;i++){
            if (arr[i]==v){
                count++;
            }
        }
        System.out.println(count);
    }
}

배열에 입력된 정수 특정 값 몇갠인지 세기 배열의 사이즈를 입력값으로 맞추는게 중요

3.10871 X보다 작은 수

문제

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

출력

X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

예제 입력 1

10 5
1 10 4 9 2 3 8 5 7 6

예제 출력 1

1 4 2 3

풀이

package array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class BOJ_10871_LessThanX {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int [] arr = new int[n];
        for(int i = 0;i<n;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        for(int i = 0;i<n;i++){
            if(arr[i]<x){
            System.out.print(arr[i]+" ");
            }
        }

    }
}

조건 분기 + 반복 출력 훈련 배열에서 조건(값 < X)에 맞는 값만 필터링해서 출력

4.10818 최소 최대

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력 1

5
20 10 35 30 7

예제 출력 1

7 35

풀이1

package array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;
import java.util.StringTokenizer;

public class BOJ_10818_MinMax{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int [] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int min = arr[0];
        int max = arr[0];
        for(int i = 0; i < n; i++) {
            if(arr[i]>min){
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        System.out.println(min + " " +max);
    }
}

풀이2 스트림 사용

package array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;
import java.util.StringTokenizer;

public class BOJ_10818_MinMax{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int [] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int min = Arrays.stream(arr).min().getAsInt();
        int max = Arrays.stream(arr).max().getAsInt();
        System.out.println(min + " " +max);
    }
}

Stream이란?

데이터를 함수형 스타일로 처리할 수 있게 해주는 도구
마치 데이터의 흐름을 따라가며 필터링, 매핑, 집계 등 작업을 함

메서드역할예시 코드
filter(Predicate)조건에 맞는 값만 통과filter(x -> x > 5)
map(Function)값을 변형map(x -> x * 2)
forEach(Consumer)하나씩 처리 (출력 등)forEach(System.out::println)
sum()합계 계산 (IntStream 등에서 사용)Arrays.stream(arr).sum()
min().getAsInt()최솟값 구하기Arrays.stream(arr).min().getAsInt()
max().getAsInt()최댓값 구하기Arrays.stream(arr).max().getAsInt()
count()개수 세기 (long 반환)filter(x -> x > 5).count()

배열에서 최솟값과 최댓값을 찾기 배열 순회 중 조건에 따라 값 갱신하는 패턴 연습

5.2562 최댓값

문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

예제 입력 1

3
29
38
12
57
74
40
85
61

예제 출력 1

85
8

풀이

package array;
import java.util.Scanner;

public class BOJ_2562_MaxValueAndIndex {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int max = 0;
        int index =0;
        for(int i =0;i<9;i++){
            int num = sc.nextInt();
            if(num>max){
                max = num;
                index = i+1;
            }
            }
        System.out.println(max);
        System.out.println(index);
        }
    }

index를 만들어서 위치까지 저장하게 만드는게 키 포인트

2.Java

1.Stream 체이닝 (filter -> map -> collect) 응용 정리

Stream체이닝이란?

여러개의 Stream 메소드를 줄줄히 연결하여 데이터를 흐름처럼 정리하는 방식

왜 체이닝인가?

list.stream()
.filter(x -> 조건)
.map(x -> 변형)
.collect(Collectors.toList());
JAVA의 Stream API는 다음같이 .으로 이어지느 방식으로 여러 작업을 연속해서 적용할수 있음
마치 체인처럼 연결되어 있어서 메서드 체이닝이라고 부름 Stream API는 이방식으로 처리하는걸 Stream체이닝이라고 부름

체이닝 개념의 흐름

Stream 생성: list.stream()
중간 연산들 연결: .filter(), .map(), .sorted() …
최종 연산으로 마무리: .collect(), .forEach(), .count()

예시 코드

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> result = numbers.stream()
    .filter(n -> n % 2 == 0)     // 짝수만 통과
    .map(n -> n * n)             // 제곱으로 변형
    .collect(Collectors.toList()); // 리스트로 수집

System.out.println(result); // [4, 16, 36]

코드가 간결, 가독성 좋음, 반복문 없이 처리 가능

리뷰

사람이 똑같은 실수를 반복한다고 … 어제 결국 새벽 4시에 자버려서 오전 다 날려버리고
오후에 애기보고 네… 뭐 핑계를 대니 결국 목표로 한건 다 못했습니다
지금 큰일 났습니다 이번주에 목표로 해논게 참많은데… 정신 차리고 해야할거같습니다
그래서 오늘 백준 5문제를 풀어봣는데 좀 재미있는거 같아요 알고리즘이라는게
잠깐 읽었던것도 좀 떠오르고 그러네요
스트림 체이닝이라는걸 공부해봤는데 확실히 좀 코드가 간결해서 내일 한번 사용해보겠습니다
내일은 진짜 더 열심히 해보겠습니다 화이팅!

profile
초심자

0개의 댓글