티스토리 뷰
문제
스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.
1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.
입력
첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.
출력
입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.
문제가 이해가 안돼서 gpt한테 물어봤다. 이해 완료!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Stack;
public class BJ1874 {
public static void main(String[] args) throws NumberFormatException, IOException {
// 1. 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] sequence = new int[n];
for (int i = 0; i < n; i++) {
sequence[i] = Integer.parseInt(br.readLine());
}
// 2. 스택 이용해 수열 만들기
int[] sortedArr = Arrays.copyOf(sequence, n);
Arrays.sort(sortedArr); // 오름차순 정렬
Stack<Integer> stack = new Stack<>();
stack.add(sortedArr[0]);
int i = 1;
int j = 0;
StringBuilder result = new StringBuilder();
result.append("+\n");
while (!stack.isEmpty()) {
if(stack.peek() == sequence[j]) {
stack.pop();
j++;
result.append("-\n");
} else if(i < n) {
stack.push(sortedArr[i]);
i++;
result.append("+\n");
} else {
break;
}
}
if(j < n) {
result = new StringBuilder("NO");
}
System.out.println(result);
}
}
주어진 테스트 케이스는 잘돌아가는데 틀렸다고 나온다. 역시 한번에 맞을리가 없지... 도저히 어떻게 고쳐야할지 몰라서 질문 게시판을 보는데 반례 정리해둔걸 찾았다. 감동...
https://www.acmicpc.net/board/view/107419
입력 2에 제시된 테스트 케이스가 돌아가지 않는다.
문제를 찾았다!!! 스택이 비면 반복문을 탈출하게 해놨는데 1 2 3 처럼 오름차순으로 들어와 그냥 push, pop, push, pop을 번갈아가면서 해줘야할 경우 작업을 마치지 않았음에도 스택이 비게 된다. 그래서 반복문을 그냥 탈출하고 NO를 출력한다. 아래와 같이 수정했고 드뎌 정답ㅎㅎㅎㅎ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Stack;
public class BJ1874 {
public static void main(String[] args) throws NumberFormatException, IOException {
// 1. 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] sequence = new int[n];
for (int i = 0; i < n; i++) {
sequence[i] = Integer.parseInt(br.readLine());
}
// 2. 스택 이용해 수열 만들기
int[] sortedArr = Arrays.copyOf(sequence, n);
Arrays.sort(sortedArr); // 오름차순 정렬
Stack<Integer> stack = new Stack<>();
stack.add(sortedArr[0]);
int i = 1;
int j = 0;
StringBuilder result = new StringBuilder();
result.append("+\n");
while (true) {
// 스택이 비지않았고 스택 윗부분을 확인해보니 찾아야 하는 수와 일치
if(!stack.isEmpty() && stack.peek() == sequence[j]) {
stack.pop();
j++;
result.append("-\n");
// 위의 경우가 아니지만 아직 스택에 쌓을 수 있는 숫자가 남아있음
} else if(i < n) {
stack.push(sortedArr[i]);
i++;
result.append("+\n");
// 둘다 아님
} else {
break;
}
}
if(j < n) {
result = new StringBuilder("NO");
}
System.out.println(result);
}
}
'Algorithm' 카테고리의 다른 글
[백준 11723번/자바] 집합 (0) | 2023.08.07 |
---|---|
[백준 1654번/자바] 랜선 자르기 (0) | 2023.07.26 |
[백준 2108번/자바] 통계학 (0) | 2023.07.24 |
[백준 1966번/자바] 프린터 큐 (0) | 2023.07.20 |
[백준 1929번/자바] 소수 구하기 (0) | 2023.07.15 |
- Total
- Today
- Yesterday
- 백준9375번
- 생활코딩
- 백준 1004
- 스파크
- 알고리즘
- 개발
- 컴과
- bcrypaswordencoder
- 안드로이드
- 코딩
- 컴공
- 프로그래밍
- 자바 9375
- 리트코드 1768
- BFS
- 백준
- 컴퓨터학과
- 동덕여대
- 리트코드 1768 해석
- 스프링부트
- 그리디 알고리즘
- 스프링 강의
- 자바 1004번
- RDD
- 웹
- 아이엘츠
- 동덕여대 컴퓨터학과
- 코틀린
- 자바
- 백준 2108
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |