Stack
개념
문제 1. 괄호 회전하기
설명
제약 조건
입출력의 예
s
result
코드
문제 2. 짝지어 제거하기
설명
제약 조건
입출력의 예
s
result
코드
참고
Last updated

Last updated
import java.util.Stack
class Solution {
fun isValid(s: String): Boolean {
val stack = Stack<Char>()
for (char in s) {
// 2.1. 현재 문자를 확인
when (char) {
'(', '{', '[' -> stack.push(char)
')', '}', ']' -> {
// 스택에서 하나를 peek 함
if (stack.isEmpty()) return false
val top = stack.peek()
// 2.2. 현재 괄호와 peek한 괄호가 올바른 괄호가 동일한지 확인
if ((char == ')' && top == '(') ||
(char == '}' && top == '{') ||
(char == ']' && top == '[')) {
// 2.2.1. 동일할 경우 pop 한 후 횟수 증가
stack.pop()
} else {
// 2.2.2. 동일하지 않을 경우 false 반환
return false
}
}
}
}
return stack.isEmpty()
}
fun solution(s: String): Int {
var count = 0
val length = s.length
for (i in 0 until length) {
// 1. 문자열을 왼쪽으로 이동시킴
val rotated = s.substring(i) + s.substring(0, i)
// 2. 문자열을 순회하여 올바른 괄호인지 확인
if (isValid(rotated)) {
count++
}
}
return count
}
}fun main() {
fun solution(s: String): Int {
// 연결된 문자를 넣을 스택 정의
// 이전 문자열을 저장할 변수 정의 후 빈문자열 저장
// 변환 문자열을 저장할 변수 정의 후 원본 문자열 저장
// 변환 문자열이 빈 문자열이 아니고 이전 문자열과 변환 문자열이 동일하지 않을 때 까지 무한 반복
// 이전 문자열에 변환 문자열 저장
// 변환 문자열 순회
// 스택의 첫 번째 문자가 존재하는지 확인
// 존재하지 않을 경우
// 스택에 현재 문자를 추가
// 다음 문자로 이동
// 존재할 경우
// 스택의 첫 번째 문자와 현재 문자가 동일한지 확인
// 동일할 경우
// 스택에서 문자 제거
// 다음 문자로 이동
// 동일하지 않을 경우
// 스택에 현재 문자 추가
// 다음 문자로 이동
// 변환 문자열에 스택에 쌓인 문자들로 문자열 만든 후 저장
// 스택 초기화
// 변환 문자열이 빈 문자열일 경우 1을 빈 문자열이 아닐 경우 0을 반환
var stack = Stack<Char>()
var before = ""
var after = s
while (after.isNotEmpty() && before.equals(after).not()) {
before = after
for (current in after) {
if (stack.isEmpty()) {
stack.push(current)
} else {
if (stack.peek() == current) {
stack.pop()
} else {
stack.push(current)
}
}
}
after = stack.joinToString("")
stack.clear()
}
return if (after.isEmpty()) 1 else 0
}
println(solution("cdcd"))
}