2023. 5. 29. 23:46ㆍ백준문제풀이
문제
우선 문제 분석을 하자면, 저번에풀었던 백준 9012 번 괄호문제와 조금 다르다, 다른점은
9012번= 여러개의스택을 사용후, 스택의 상태변경이 없고 괄호가 순서에맞게 되어있는지 확인하는 용도로 사용
10773번= 1개의 스택을 사용, 1개의 스택에 반복해서 들어간 숫자를 조사해서 POP() 연산, 그후 다시 남은 숫자를 더함,PUSH() 연산, 즉, 스택의 상태가 계속 해서 변한다. 그렇기때문에
9012 번에서는 stack<자료형> 변수 = new stack<>(); 스택객체 변수 생성을 스택 메소드안에, (함수부를때마다생성)
10773번에서는 하나의 스택만 필요하기때문에 반복해서 생성할 필요없음, 즉, main 함수안에 하나만 생성한후 ,
스택 함수안에서 "두개의인자" 를받는다. 스택자료구조를 이해하면서 이두문제를 풀어보는데 이 인자 차이때문에 두시간걸렸다. 어쨌든 이론적으로는 ,
백준 9012 괄호 문제는 올바른 괄호 문자열(VPS)인지 판단하는 문제이다, 스택을 사용하여 문제를 풀 수 있는 방법은 일반적으로 많이 사용되는 방법 중 하나, 하지만 스택을 사용하지 않고도 문제를 해결할 수 있는 방법이 있다.
백준 9012 문제에서는 여는 괄호 '('와 닫는 괄호 ')'의 개수와 순서가 일치하는지 확인하는 것이 중요. 스택을 사용하는 방법은 여는 괄호를 만날 때 스택에 넣고, 닫는 괄호를 만날 때 스택에서 꺼내어 짝이 맞는지 확인하는 방식 스택에 여는 괄호를 넣고 닫는 괄호를 만났을 때 스택이 비어있지 않고 짝이 맞으면 스택에서 꺼내는 작업을 반복, 마지막에 스택이 비어있으면 올바른 괄호 문자열(VPS)이 됨
하지만 괄호의 개수와 순서만을 확인하는 문제이므로 스택을 사용하지 않고도 문제를 해결할 수 있다.괄호의 개수를 세는 변수를 사용하여 여는 괄호를 만났을 때는 개수를 증가시키고, 닫는 괄호를 만났을 때는 개수를 감소시킴. 이때 개수가 음수가 되는 순간이나 마지막에 개수가 0이 아닌 경우는 올바른 괄호 문자열(VPS)이 아니다.
따라서, 백준 9012 문제에서는 스택을 사용하지 않고도 문제를 풀 수 있는데, 이는 괄호의 개수와 순서만을 확인하기 때문 스택을 사용하는 방법과 개수를 세는 방법은 각각의 장단점과 특징을 가지고 있으므로, 문제에 맞는 방법을 선택하여 해결할 수 있다.
10773번 문제 스택메소드 : 2개의 인자 ( stack - 스택의 상태변경용)
private static void ThisStack(Stack<Long> stack , long num){
9012번 문제 스택메소드 : 1개의 인자
private static boolean isVPS(String str) {
의사코드:
메인함수-
1.스택객체생성(메인함수)
2.입력한 숫자만큼 반복해서 숫자를 입력받고-> (for i<n)
3. 스택의 모든 숫자를 꺼내서 더하는문제이기때문에 while문을 이용해서 while(!stack.isEmpty) 스택이 빌떄까지 반복해서 스택의 맨위에값을 뺸뒤(stack.pop) sum 변수에 pop 한값을 더함 ( sum= sum +stack.pop() )
스택함수 - num 에 입력받은값이 0 일경우, 그스택의 가장 위값을 뺀다 (stack.pop) , 0이 아니면 ,
더함 ( stack.push(num) )
package 백준10773;
import java.util.Scanner;
import java.util.Stack;
//pink. 의사코드: 1. 입력한값의갯수만큼 숫자를 입력받고 if( 0==) > pop() 연산 > sout 남은스택에 있는 원소의 합
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int k = sc.nextInt();
Stack<Long> stack = new Stack<>(); //green. Stack 클래스의 객체 변수 stack 생성
//green. isEmptyStack 함수를 호출할 때 인자로 전달하기 위해서 메인에 선언
for(int i = 0; i < k; i++){
long num = sc.nextLong(); //red. num에 숫자 입력받음
ThisStack(stack, num); //red. stack인자: 메소드내에서 수정될 객체
// num 메소드내에서 처리될 숫자
}
long sum = 0;
while(!stack.isEmpty()){ //red. stack 이 비어있을때까지 스택에서 모두 꺼냄
sum+= stack.pop(); //green. stack의 가장 위에 변수를 꺼내서 합을 sum 변수에 더함
}
System.out.println(sum);
}
private static void ThisStack(Stack<Long> stack , long num){
//green. 함수 내에서 스택을 선언하는 것은 가능하지만, 이 경우 매번 함수가 호출될 때마다 새로운 스택이 생성 -> 메인에 생성
//green. Stack<Long> stack 이 매개변수의 역할은 함수 내에서 스택을 참조하고 조작하는 데 사용
if(num==0){ //red. stack 이 0 이고, 스택이 비어있지않으면
if(!stack.isEmpty()) {
stack.pop(); } //red. 가장 최근 값을 pop();
}else {
stack.push(num);
}
}
}
'백준문제풀이' 카테고리의 다른 글
백준 [3003] (Java) (0) | 2023.08.04 |
---|---|
백준 [2743] 입력값 갯수 구하기 (java) (0) | 2023.07.29 |
백준 [9012] 스택 (Java) (0) | 2023.05.29 |
백준 [27866] (Java) (0) | 2023.05.28 |
백준 [10810] (java) (0) | 2023.05.25 |