괄호 문제 해결법
- 괄호 문제는 항상 괄호가 '(' 이면 -> push를 생각한다 : 분기점 잡기
- 그 외에는 ')'는 -> pop으로 생각
if (str.eqauls('(')) {
stack.push('(');
}
else {
if (stack.isEmpty()) {
return "NO"
}
else {
stack.pop();
}
}
문제 1
1. 이슈 및 해결 방법
- 괄호문제는 스택을 보통 이용 (테스트 케이스에서 실수하는 경우가 많으므로 주의 사항지킬것) - 닫는 괄호가 먼저 나오면 안되는 경우 등
- 첫번째 값을 먼저 넣고 다음 인덱스부터 비교
- 스택에 홀로 ) 남으면 -> 바로 NO임 : 이 경우를 괄호 문제에서 항상 생각해야 함.
그렇지 않으면
- 스택의 값 (peek)과 새로 들어온 값이 다르면 - pop()
- 스택에서 뺄때는 항상 스택이 존재하는지 확인한다! (if문으로 확인)
같으면 그냥 - push()
public String solution(String str) {
String answer="NO";
String []strArr=str.split("");
Stack<String>stack=new Stack();
stack.push(strArr[0]);
for (int i=1;i< strArr.length;i++) {
if (stack.size()==1 && stack.peek().equals(")")) {
break;
}
else {
if (!stack.isEmpty() && !stack.peek().equals(strArr[i])) {
stack.pop();
}
else {
stack.push(strArr[i]);
}
}
}
if (stack.isEmpty()) {
answer="YES";
}
return answer;
}
해결 방법 2
- 괄호 문제는 항상 괄호가 '(' 이면 -> push를 생각한다 : 분기점 잡기
- 그 외에는 ')'는 -> pop으로 생각
public String solution2(String str) {
String answer="NO";
String []strArr=str.split("");
Stack<String>stack=new Stack();
for (String ss:strArr) {
if (ss.equals("(")) {
stack.push(ss);
}
else {
if (stack.isEmpty()) {
return "NO";
}
else {
stack.pop();
}
}
}
if (stack.isEmpty()) {
answer="YES";
}
return answer;
}
문제 2.
해결방법
- Stack 문제는 항상 괄호가 '(' 이면 -> push를 생각한다 : 분기점 잡기
- 그 외에는 ')'는 -> pop으로 생각
코드
public String solution(String str) {
char[] charArr =str.toCharArray();
Stack<Character>stack=new Stack<>();
for (Character ss:charArr) {
if (ss=='(' || Character.isAlphabetic(ss)) {
stack.push(ss);
}
else {
while (!stack.isEmpty()) {
if (stack.peek().equals('(')) {
stack.pop();
break;
}
stack.pop();
}
}
}
String answer="";
for (char s:stack) {
answer+=s;
}
return answer;
}
문제 3 (카카오 인형뽑기 문제)
주요 이슈
- 배열 만드는 것이 헷갈렸음...
해결 방법
코드
package inflearn.section5_stackQueue;
import java.util.*;
public class Main3 {
public int solution(int n,int[][]arr,int m,int[]mArr) {
int answer=0;
Stack<Integer>stack=new Stack<>();
for (int i:mArr) {
int k=i-1;
int su=0;
for (int j=0;j<n;j++) {
if (arr[j][k]!=0) {
su=arr[j][k];
arr[j][k]=0;
break;
}
}
if (su!=0) {
if (stack.isEmpty()) {
stack.push(su);
}
else {
if (stack.peek().equals(su)) {
answer+=2;
stack.pop();
}else{
stack.push(su);
}
}
}
}
return answer;
}
public static void main(String[] args) {
Main3 main=new Main3();
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int arr[][]=new int[n][n];
for (int i=0;i<n;i++) {
for (int j=0;j<n;j++) {
arr[i][j]=scan.nextInt();
}
}
int m=scan.nextInt();
int mArr[]=new int[m];
for (int i=0;i<m;i++) {
mArr[i]=scan.nextInt();
}
System.out.println(main.solution(n,arr,m,mArr));
}
}