문제
https://school.programmers.co.kr/learn/courses/30/lessons/76502
자바스크립트
통과하지 못한 코드
처음에는 (), [], {}의 개수만 체크하는 로직으로 접근했었는데 14개 중 마지막 테스트 케이스를 통과하지 못했다.
// 통과하지 못한 잘못 접근한 코드
// 괄호가 모두 올바른지 체크하는 함수
function checkCorrect(bracketArr) {
let checkBracket = [0, 0, 0] // Check Stack ["()","[]", {}]
for (const bracket of bracketArr) {
switch (bracket) {
case "(":
if (checkBracket[0] < 0) {
// 이미 닫힌 괄호가 있었을 경우 올바른 문자열을 만들지 못하므로 false 반환
return false
} else {
checkBracket[0] += 1
}
break;
case ")":
if (checkBracket[0] <= 0) {
// 이전에 열린 괄호가 없었을 경우 false 반환
return false
} else {
checkBracket[0] -= 1
}
break;
case "[":
if (checkBracket[1] < 0) {
return false
} else {
checkBracket[1] += 1
}
break;
case "]":
if (checkBracket[1] <= 0) {
return false
} else {
checkBracket[1] -= 1
}
break;
case "{":
if (checkBracket[2] < 0) {
return false
} else {
checkBracket[2] += 1
}
break;
case "}":
if (checkBracket[2] <= 0) {
return false
} else {
checkBracket[2] -= 1
}
break;
default:
break;
}
}
// 3개의 조건을 만족할 경우 true 반환
return checkBracket[0] === 0 && checkBracket[1] === 0 && checkBracket[2] === 0
}
function solution(s) {
const n = s.length
let brackets = [].concat(...s); // 배열로 깊은복사
let answer = 0
for (let i = 0; i < n; i++) {
if (i > 0) { // s를 0번째는 회전하지 않는다.
brackets.push(brackets[0]) // 제일 처음 문자열을 뒤에 추가
brackets.shift() // 가장 앞 문자열을 제거한다
}
if (checkCorrect(brackets)) {
answer += 1
}
}
return answer;
}
통과한 코드
위 코드는 단순히 괄호의 순서 짝의 개수만 확인하기 때문에 [, {, ), ], }, ) 와 같은 순서가 다른 경우는 체크하지 못한다.
순서도 지켜야 하기 때문에 stack 방식으로 접근법을 바꿔 해결했다.
// 괄호가 모두 올바른지 체크하는 함수
function checkCorrect(bracketArr) {
let stack = []
for (const bracket of bracketArr) {
switch (bracket) {
case "(":
stack.push("(")
break;
case ")":
if (stack[stack.length - 1] === "(") {
stack.pop();
break;
} else {
return false;
}
case "[":
stack.push("[")
break;
case "]":
if (stack[stack.length - 1] === "[") {
stack.pop();
break;
} else {
return false;
}
case "{":
stack.push("{")
break;
case "}":
if (stack[stack.length - 1] === "{") {
stack.pop();
break;
} else {
return false;
}
default:
break;
}
}
// stack이 비어있다면 true를 반환
return stack.length === 0
}
function solution(s) {
const n = s.length
let brackets = [].concat(...s); // 배열로 깊은복사
let answer = 0
for (let i = 0; i < n; i++) {
if (i > 0) { // s를 0번째는 회전하지 않는다.
brackets.push(brackets[0]) // 제일 처음 문자열을 뒤에 추가
brackets.shift() // 가장 앞 문자열을 제거한다
}
if (checkCorrect(brackets)) {
answer += 1
}
}
return answer;
}
'PS (Problem Solving) > Programmers' 카테고리의 다른 글
[프로그래머스] 카드 뭉치 - 자바스크립트 (0) | 2024.10.21 |
---|---|
[프로그래머스] 크기가 작은 부분문자열 (0) | 2024.10.18 |
[프로그래머스] 덧칠하기 - 자바스크립트 (0) | 2024.10.14 |
[프로그래머스] 방문 길이 - 자바스크립트 (0) | 2024.10.13 |
[프로그래머스] 공원 산책 (1) | 2024.10.12 |