알고리즘이 많이 부족하다 생각해
과제로 풀게 된 코드를 블로깅 하면서 공부하려고 한다.
작성한 코드는 아마 내가 작성했기 보단 레퍼런스 코드나 다른 사람이 작성한 코드에서
수도 코드를 작성하면서 어떻 형식으로 진행 했는지 파악하며 조금씩 익히려고 한다.
입력된 괄호 값들이 모두 쌍이 맞게 올바른지를 판단해 모두 쌍이 맞으면 true 그렇지 않으면 false를 출력
입력된 괄호 값들이 유효한 경우들은 다음에 해당
1. 열린 괄호는 같은 타입의 닫힌 괄호로 닫혀있어야 한다.
2. 열린 괄호는 올바른 순서대로 닫혀야만 한다.
3. 모든 닫힌 괄호는 그에 상응하는 같은 타입의 열린 괄호를 갖고 있다.
입력값을 통해 들어오는 괄호는 ()[]{}
로만 이루어져 있다.
입력
인자 1 : str
string
타입으로 된 문장
출력
boolean
타입을 리턴해야 합니다.
주의 사항
입력값을 통해 들어오는 괄호는 ()[]{}
로만 이루어져 있습니다.
입력값으로 들어오는 str의 길이는 0부터 10^4승 까지 입니다.
힌트
- 스택을 사용해 보세요.
- 열린 괄호인 경우 스택에
push
합니다.- 닫힌 괄호인 경우에는 스택의
top
을 확인하고, 해당 닫힌 괄호와 짝이 맞는 열린 괄호인지를 확인합니다.
const isValid = (str) => {
// 예외 처리
if(str.length === 0) return false
// 괄호를 식별할 수 있는 객체 생성
const obj = { '(': ')', '[': ']', '{': '}' }
// str 배열로 반환하기
const arr = str.split('')
// 스택 초기화
let stack = []
// arr 순회
for (let i in arr) {
// 만약 arr[i]인 앞에 괄호인 경우
if (arr[i] === '(' || arr[i] === '[' || arr[i] === '{') {
// 스택에 추가해 둔다.
stack.push(arr[i])
// 뒤에 괄호인 경우
} else {
// 스택의 맨 위에 있는 요소를 기준으로 정해줌
const top = stack[stack.length - 1]
// 만약 arr[i]가 뒤에 괄호하고 일치 하지 않는다면 false 반환
if(obj[top] !== arr[i]){
return false
}
// 짝이 맞다면 스택에서 꺼낸다.
stack.pop()
}
}
// boolean을 반환해야하기 때문에
// stack의 값이 없을 경우 true, 아닌 경우 false
return stack.length === 0
/* 레퍼런스는 삼항 연산자를 사용 했다.
return stack.length? false : true
*/
}
top = stack[stack.length - 1]
으로 했을까const top = stack[stack.length - 1]
stack[stack.length - 1]
뜻이 스택의 맨 위(top)에 있는 요소를 참조하는 것이다.
stack[stack.length - 1]
를 사용해 스택에서 가장 위에 있는 괄호를 꺼내온다.
꺼내온 괄호는 현재 문자열에서 처리 중인 닫는 괄호와 짝이 맞는지 검사할 때 사용한다.
의사코드를 작성하면서 다시 코드를 보니 어느 정도 이해는 가지만
아직도 이해 안되는 부분은 chat GPT의 도움을 보면서 해결하고 있는거 같다.
꾸준히 하다보면 스스로 풀 수 있는 날이 오지 않을까 싶다.
자료 참고
chat GPT