코딩테스트
[프로그래머스] 올바른 괄호
Muhly
2023. 11. 30. 14:20
✏️문제
✏️문제접근
1️⃣ 문제 풀이
문자열이 올바르게 열리고 닫힌 괄호(’(’ , ’)’)로만 구성되어 있는지 확인하는 코드가 필요하다.
2️⃣ 메소드 정의
public static void main(String[] args) {
Solution T = new Solution();
Scanner sc = new Scanner(System.in);
String s = sc.next();
System.out.println(T.solution(s));
}
boolean solution(String s){
...
}
solution 메소드는 문자열 ‘s’를 입력으로 받고, 괄호가 올바르게 열리고 닫혔는지를 나타내는
boolean answer를 반환한다. 만약 올바르다면 true, 올바르지않다면 false가 반환될 것이다.
3️⃣ 스택 사용하기
Stack<Character> stack = new Stack<>();
Stack를 사용하여 괄호의 순서를 추적한다.
스택
스택은 “쌓다”라는 의미로 데이터를 차곡차곡 쌓아 올린 형태의 자료구조다. Last-In FirstOut 이란 의미로 LIFO라 불리며 후입선출이라고한다. 웹 브라우저의 “뒤로가기”를 생각하면된다.
스택타입
stack() | 비어 있는 새로운 스택을 만든다. |
---|---|
is Empty() | 스택이 비어있으면 true, 아니면 false를 반환 |
push(i) | input을 스택의 맨 위에 추가한다. |
pop() | 스택의 맨 위에 있는 항목을 꺼내어 반환한다. |
peek() | 스택의 맨 위에 있는 항목을 삭제하지 않고 반환한다. |
size() | 스택내의 모든 항목들의 개수를 반환한다. |
clear() | 스택을 공백상태로 만든다. |
4️⃣ 문자열 순회 및 처리
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//여는 괄호일때
if(c=='('){
stack.push(c);
}
//닫는 괄호일떼
else if(c ==')'){
if(stack.isEmpty()){
return false;
}
stack.pop();
}
stack.pop();
}
s를 받아온 후 배열을 돌리며 charAt(i)를 검사한다. (s의 i번째 문자를 반환하는 함수로 char c 에 담아준다.)
그 후 “여는 괄호일때”
//c가 ‘(’ 라면 스택에 c 를 push 해준다
stack.push(c);
“닫는 괄호일때” 는
//c가 ‘)’ 라면 스택에 c 를 pop 해준다
stack.pop();
5️⃣ 최종 검사
if(!stack.isEmpty()){
answer = false;
}
return answer;
}
stackstack 의 유효성을 최종적으로 판단하는 것이다.
✏️코드
import java.util.Scanner;
import java.util.Stack;
public class Solution {
boolean solution(String s){
boolean answer = true;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//여는 괄호일때
if(c=='('){
stack.push(c);
}
//닫는 괄호일떼
else if(c ==')'){
if(stack.isEmpty()){
return false;
}
stack.pop();
}
stack.pop();
}
if(!stack.isEmpty()){
answer = false;
}
return answer;
}
public static void main(String[] args) {
Solution T = new Solution();
Scanner sc = new Scanner(System.in);
String s = sc.next();
System.out.println(T.solution(s));
}
}
import java.util.Scanner;
import java.util.Stack;
public class Solution {
boolean solution(String s){
boolean answer = true;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//여는 괄호일때
if(c=='('){
stack.push(c);
}
//닫는 괄호일떼
else if(c ==')'){
if(stack.isEmpty()){
return false;
}
stack.pop();
}
stack.pop();
}
if(!stack.isEmpty()){
answer = false;
}
return answer;
}
public static void main(String[] args) {
Solution T = new Solution();
Scanner sc = new Scanner(System.in);
String s = sc.next();
System.out.println(T.solution(s));
}
}