091
[JAVA] 도키도키 간식드리미 본문
🔍자바 : 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(지연)하게 실행되므로, 실제로 계산하거나 데이터를 건드리지 않습니다.
'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 |