문제 설명
총 4가지 종류의 괄호가 있습니다.
각 괄호들은 서로 짝이 있으며 그 짝은 괄호가 열리고 닫히는 것을 의미합니다.
· ( , )
· { , }
· [ , ]
· < , >
이때 주어진 문자열 S가 괄호가 서로 교차하지 않은 형태로 짝이 잘 맞게 이루어진 문자열인지 판단하여 맞으면 1, 틀리면 0으로 반환하는 프로그램을 구현하세요.
입력 형식
· S : 본문에 주어진 괄호들로만 이루어진 문자열
출력 형식
· 괄호의 짝이 맞으면 1, 맞지 않으면 0을 정수로 반환
제약 사항
· 0 < S.length <= 100
입출력 예시
· 예시1
· 입력
· S = "(()){[<>]}"
· 출력 : 1
· 설명 : 모든 괄호 짝이 맞기 때문에 1을 출력
· 예시2
· 입력
· S = "({)}[<]>"
· 출력 : 0
· 설명 : 열린 괄호가 순서대로 닫히지 않았기 때문에 0을 출력
작성 코드
(20/20) - 이해 아직 덜 됨
import java.util.Stack;
public class Solution {
public int solution(String S) {
Stack<Character> stack = new Stack<>();
int i = 0;
for(; i< S.length(); i++){
char ch = S.charAt(i);
boolean result = false;
switch (ch) {
case '(' :
case '{' :
case '[' :
case '<' :
stack.push(ch);
break;
case ')' :
if (stack.isEmpty() || stack.peek() != '(') result = true;
stack.pop();
break;
case '}' :
if (stack.isEmpty() || stack.peek() != '{') result = true;
stack.pop();
break;
case ']':
if (stack.isEmpty() || stack.peek() != '[') result = true;
stack.pop();
break;
case '>':
if (stack.isEmpty() || stack.peek() != '<') result = true;
stack.pop();
break;
}
if(result) break;
}
if(stack.isEmpty() && i == S.length()) return 1;
else return 0;
}
}
정답 코드
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
class Solution {
public int solution(String S) {
Stack<Character> stack = new Stack<>();
Map<Character, Character> map = new HashMap<>();
Set<Character> openerSet = Set.of('(', '{', '<', '[');
Set<Character> closerSet = Set.of(')', '}', '>', ']');
map.put(')', '(');
map.put('}', '{');
map.put('>', '<');
map.put(']', '[');
for (char c: S.toCharArray()) {
if (openerSet.contains(c)) {
stack.push(c);
} else if (closerSet.contains(c)) {
if (!stack.isEmpty()) {
char top = stack.pop();
if (map.get(c) != top) {
return 0;
}
} else {
return 0;
}
}
}
if (stack.isEmpty()) {
return 1;
} else {
return 0;
}
}
public static void main(String[] args) {
Solution st = new Solution();
String S = "(()){[<>]}";
System.out.println(st.solution(S));
String S1 = "({)}[<]>";
System.out.println(st.solution(S1));
}
}
이 Java 코드는 주어진 문자열이 적절히 중첩되고 균형 잡힌 괄호 쌍을 포함하는지 확인하는 문제의 코드이다.
위 코드는 스택과 맵을 사용하여 여는 괄호와 닫는 괄호를 추적한다.
입력 문자열에서 각 문자를 반복하며, 여는 괄호를 스택에 저장합니다. 각 닫는 괄호에 대해, 스택이 비어있지 않은 경우 스택에서 맨 위의 요소를 팝하고 해당하는 여는 괄호와 비교한다.
스택이 비어 있으면 문자열에 적절한 괄호 쌍이 있음을 반환하고, 그렇지 않으면 문자열에 적절한 괄호 쌍이 없음을 반환
'연습 코딩테스트' 카테고리의 다른 글
연습문제 1-3(4) 문자열 계산식 (0) | 2023.04.01 |
---|---|
연습문제 1-3(3) 중복 알파벳 소거하기 (0) | 2023.04.01 |
연습문제 1-3(1) 중복 문자 제거 (0) | 2023.04.01 |
연습문제 1-2(5) 배열 0에서 가장 가까운 값 (0) | 2023.03.30 |
연습문제 1-2(4) n번째 주문 취소된 주문 번호 구하기 (0) | 2023.03.30 |