091

[JAVA] 도키도키 간식드리미 본문

Coding Test/BAEJOON(백준)

[JAVA] 도키도키 간식드리미

공구일 2025. 4. 7. 12:35
728x90

🔍자바 : 12789번 . 도키도키 간식드리미

 

01. 코드 기획 단계 

- 순서의 값과 count 값을 비교하는 것과 peek()값을 비교하는 것에 중점을 뒀습니다. 처음에는 if를 두개로 조건을 나눴었는데 1 4 3 2 5 처럼 순서열보다 더 작은 값이 스택에 있는 경우에 if문을 사용하면 3을 확인하고 count = 4를 5와 비교하고 다르니 스택에 넣으려다가 오류가 발생하는 것을 발견하고 stack값과 비교할 때는 있는 값을 전부 비교할 수 있도록 while로 변경하였습니다.

 

02. 코드 실행 및 오류 잡기

import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Integer> stack = new Stack<>();
        
        int num = Integer.parseInt(br.readLine());
        int[] order = Arrays.stream(br.readLine().split(" "))
                .mapToInt(Integer::parseInt)
                .toArray();
        int count = 1;
        boolean sad = false;
        for(int i = 0; i < order.length; i++){
            while(!stack.isEmpty() && stack.peek() == count){
                stack.pop();
                count++;
            }
            if(order[i] != count){
                if(!stack.isEmpty() && stack.peek() < order[i]){
                    sad = true;
                    break;
                }
                stack.push(order[i]);
            } else if(order[i] == count) count++;
        }
        
        if(!sad) System.out.println("Nice");
        else System.out.println("Sad");
        
    }
}

 

03. 정리

- br.readLine()을 통해 받은 문자열을 정수 배열에 바로 넣는 방법 : "1 2 3 4 5" -> { 1, 2, 3, 4, 5 }

-> 우선적으로, split(" ")을 통해 공백을 기준으로 값을 나눠줍니다.

-> 그 다음으로는 배열을 스트림으로 변환해줍니다. 스트림이란 데이터의 연속적인 흐름을 나타내며, 이러한 흐름을 통해 컬렉션의 요소들을 하나씩 처리할 수 있게 만들어 줍니다. 

String[] arr = {"5", "6", "7"};
Stream<String> stream = Arrays.stream(arr);
stream.map(s -> Integer.parseInt(s) * 2)   // 각 요소를 숫자로 바꾸고 2배로 만듬
      .forEach(System.out::println);        // 결과를 출력

위의 코드는 문자열 배열을 스트림으로 변경해준 뒤 순차적으로 map(), filter(), sorted()와 같은 중간 연산과 forEach(), collect(), reduce()와 같은 최종 연산을 진행해주었습니다. 다양한 연산을 더 간결하게 선언적으로 데이터를 처리할 수 있는 등의 다양한 이점을 위해 사용됩니다.

-> mapToInt()는 Stream의 요소들을 int형으로 바꾸는 중간 연산으로 IntStream으로 바뀌기 때문에 숫자 전용 연산이 가능해집니다. 괄호 안에는 익명 함수(anonymous function)를 쓰기 위해 람다 표현식(Lanbda Expression)을 사용해줍니다. 람다 표현식은 (매개변수) -> { 실행문 }의 기본 구조를 가집니다. 예시로 값을 int로 바꾸려면 s -> Integer.parseInt(s)를 써줘야합니다. 그런데 위를 보면 Integer::parseInt로 나타내주고 있습니다. 이는 람다 표현식이 이미 존재하는 메서드를 그대로 호출할 때 더 간단하게 표현하기 위해 사용되는 메서드 참조(Method Reference)입니다.

-> toArray()는 Stream 파이프라인의 마지막에서 결과를 배열로 수집해서 반환하는 최종 연산(Terminal Operation)입니다. 중간 연산들은 전부 스트림을 어떤 식으로 사용할지 설계도를 쌓는 것으로 lazy(지연)하게 실행되므로, 실제로 계산하거나 데이터를 건드리지 않습니다.

728x90

'Coding Test > BAEJOON(백준)' 카테고리의 다른 글

[JAVA] 큐 2  (0) 2025.04.07
[JAVA] 균형잡힌 세상  (0) 2025.04.07
[JAVA] 괄호  (0) 2025.04.07
[JAVA] 제로  (0) 2025.04.07
[JAVA] 스택2  (0) 2025.04.06