Java Day 16

YDC·2025년 6월 29일

우테코8기

목록 보기
16/23

Day 15 복습

Stream이란?

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

Stream체이닝이란?

여러개의 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()

체이닝 개념의 흐름

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

학습목표

1.백준 5문제

  • 10810 공 넣기
  • 10813 공 바꾸기
  • 5597 과제 안 내신분..?
  • 3052 나머지

2.cs공부

  • 누구나 자료구조와 알고리즘 1강

백준 5문제

1.10810 공넣기

문제

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.
도현이는 앞으로 M번 공을 넣으려고 한다. 도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 공을 넣을 바구니는 연속되어 있어야 한다.
공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다는 뜻이다. 예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는 뜻이다. (1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ N)
도현이는 입력으로 주어진 순서대로 공을 넣는다.

출력

1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.

예제 입력 1

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

예제 출력 1

1 2 1 1 0

풀이

package array;
import java.util.Scanner;
public class BOJ_10810_PutBall {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int [] arr = new int[n];
        for(int t=0;t<m;t++){
            int i = sc.nextInt();
            int j = sc.nextInt();
            int k = sc.nextInt();
            for(int a=i-1;a<j;a++){
                arr[a] = k;
        }
            }
        for(int val:arr){
            System.out.print(val+" ");
        }
    }
}

특정 구간 동일 한 값으로 배열을 덮어 쓰우는 문제 forEach문 사용으로 배열을 출력

2.10813 공바꾸기

문제

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.
도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.
공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 공을 교환한다.

출력

1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.

예제 입력 1

5 4
1 2
3 4
1 4
2 2

예제 출력 1

3 1 4 2 5

풀이

package array;
import java.util.Scanner;

public class BOJ_10813_SwapBall {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int [] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = i+1;
        }
        for(int t=0;t<m;t++){
            int i = sc.nextInt();
            int j = sc.nextInt();
            int temp = arr [i-1];
            arr [i-1] = arr [j-1];
            arr [j-1] = temp;
        }
        for(int val:arr){
            System.out.print(val+" ");
        }
    }
}

인덱스의 교환 로직(Swap 개념)문제

swap(스왑) 이란?

두 변수의 값을 서로 바꾸는 것
예: a = 3, b = 7 → swap 후: a = 7, b = 3

스왑하는 방법

a = 3, b = 7
int temp = 3;
a = b; //a = 7
b= a //b = 3

3.5597 과제 안내신 분..?

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

출력
출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.

예제 입력 1

3
1
4
5
7
9
6
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

예제 출력 1

2
8

예제 입력 2

9
30
6
12
10
20
21
11
7
5
28
4
18
29
17
19
27
13
16
26
14
23
22
15
3
1
24
25

예제 출력 2

2
8

풀이

package array;
import java.util.Scanner;

public class BOJ_5597_MissingHomework {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        boolean [] submitted = new boolean[31];
        for(int i=0;i<28;i++){
            int n = sc.nextInt();
            submitted[n] = true;
            }
        for(int j=1;j<=30;j++){
            if(!submitted[j]){
                System.out.println(j);
            }
        }
    }
}

정수 배열이 아닌 불리안 배열을 만들어서 값이 존재 하지 않은걸 찾는 문제

4.3052 나머지

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

예제 입력 1

1
2
3
4
5
6
7
8
9
10

예제 출력 1

10

예제 입력 2

42
84
252
420
840
126
42
84
420
126

예제 출력 2

1

풀이

package array;
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;

public class BOJ_3052_RemainderSet {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Set<Integer> set = new HashSet<>();
        for(int i=0;i<10;i++){
            int n = sc.nextInt();
            set.add(n%42);
        }
        System.out.println(set.size());
    }
}

set을 사용해서 중복을 지우는 문제 set은 중복을 허락하지 않는 자료구조

2.CS공부

1.누구나 자료구조와 알고리즘

1강 자료 구조가 중요한 까닭

대부분의 자료구조는 네 가지의 기본방법을 사용하며, 이를 연산이라고 부른다.

  • 읽기 : 자료 구조 내 특정 위치를 찾아보는 것
  • 검색 : 자료 구조 내에서 특정 값을 찾는 것
  • 삽입 : 자료 구조에 새로운 값을 추가하는 것
  • 삭제 : 자료 구조에서 값을 제거하는 것

연산이 얼마나 빠른가가 중요한게 아닌 얼마나 많은 단계를 필요로하는지가 중요하다

하드 웨어에 따라서 시간은 다를 수 있게에 신뢰성이 떨어지나
연산 속드를 측정할 때 얼마나 많은 단계를 필요하나를 따지면 속도의 차이가 분명히 있기때문에 신뢰성이 있다

이 강에선 배열과 집합이라는 두가지 자료구조를 분석 설명하고 있다

배열이란?

컴퓨터 과학에서 기초적인 자료구조 중 하나
배열을 선언하면 컴퓨터는 프로그램이 쓸 수 있는 연속된 빈 셀들의 집합을 할당함
각 셀에는 특정 주소가 있음 (셀로 구성된 거대한 컬렉션이 메모리)

읽기

배열에서의 읽기는 한 번의 단계로 바로 갈 수 있음
각배열에 저장된 내용은 메모리의 시작 주소임 컴퓨터는 메모리 주소에 한번에 갈 수 있음
Ex)
배열의 인덱스는 0부터 시작함 -> 인덱스 0의 메모리 주소는 1010임 -> 인덱스3은 0부터 3슬롯 뒤임 -> 인덱스 3을 찾을려면 1010+3 =1013 주소로 감

검색

배열에서 검색은 인덱스 0부터 시작해서 찾고 있는 값이 발견될때까지 계속됨
먼저 0을 확인 -> 아니면 1 -> 찾을때가지 반복
컴퓨터가 이와같이 한번에 한 셀씩 확인하는 방법을 선형 검색이라고 부름
셀의 갯수가 N개일때 선형검색에 최대 N개의 단계가 필요함

삽입

배열에서 삽입은 어디에 데이터를 삽입하는가에 따라 효율성이 다름
끝에 삽입시 딱 한단계만 필요함 컴퓨터는 배열이 시작되는 주소를 알고 얼마나 많은 원소를 가지고 있는지 알기 때문에
하지만 처음이나 중간에 삽입할 경우 문제 발생
Ex)
5개의 셀에서 3번 위치에 삽입 시 5번을 6번위치 -> 4번을 5번 위치 -> 3번을 4번 위치후 3번위치에 삽입 총 4단계 필요
N개의 원소를 포함하는 배열에서 삽입시 최악의 경우 N+1개의 단계가 걸림

삭제

배열에서 삭제는 특정 인덱스를 제거하는 과정임
Ex)
5개의 원소를 가지고 있는 상황에서 인덱스 2번을 삭제하면 2번 삭제 -> 3번을 2번 위치에 -> 4번을 3번 위치에 옮겨야함
총 3단계가 필요함
N개를 포함하는 배열에서 삭제에 필요한 최대 단계 수는 N개임

집합이란?

중복 값을 허용하지 않는 자료 구조 중복값의 삽입을 절대 허용하지 않음

읽기

배열과 동일함

검색

배열과 동일함

삽입

집합에서의 삽입은 먼저 이 값이 집합에 들어가있는지 확인해야함 - 검색이 우선
Ex)
5개의 인덱스를 가진 집합에서 새로운 인덱스를 삽입할려면 1~5까지의 인덱스를 전부 확인 후 없으면 삽입
N개를 포함하는 집합의 경우 최악의 경우 (맨앞에 삽입 시 다 확인후 다시 다 옮기고 삽입) 2N+1 단계가 필요함

그럼 집합이 더 느린거같은데 왜 쓰나?

중복 데이터가 없어야 할 경우는 집합이 답임

리뷰

오늘 드디어 cs 책을 폈습니다 기분이 좋네요 문제도 열심히 풀었는데
혼자 java공부하다 나온애들이 드디어 문제에 나오기 시작했습니다 기분이 좋으면서 또 안풀리니까 힘드네요
이번주는 돌아보면 참 많이 놀고 참 많은 일들이 있었던거 같습니다 스스로가 너무 연약한거같은 한주였달까요
그래도 포기 하지 않았답니다 포기하지 않으면 언젠간 이뤄지니까 다음주는 더 빡세게 이번주를 반면교사삼아
피드백하고 더 멋지게 살겠습니다!

profile
초심자

0개의 댓글