[프로그래머스 레벨투] 괄호 변환 🧟♀️🧟♂️
🔽 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/60058
✍🏼 나의 수도 코드
1) 올바른 괄호 문자열인지 아닌지 판별하는 함수를 만든다.
2) 균형잡힌 괄호 문자열인지 아닌지 판별하는 함수를 만든다.
3) 문제에서 제공한 알고리즘으로 코드를 구현한다.
// 문제에서 제공한 수도코드
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
👨🏻💻 나의 문제 풀이
function checkBalanced(p){
let openBracket = 0;
let closeBracket = 0;
p.split("").forEach(bracket => bracket === "(" ? openBracket++ : closeBracket++)
if(openBracket === closeBracket) return true;
else return false;
}
function checkRight(p) {
let openBracket = 0;
let closeBracket = 0;
let pArr = p.split("");
let result = true;
for(let bracket of pArr){
bracket === "(" ? openBracket++ : closeBracket++;
if(closeBracket > openBracket){
result = false;
break;
}
}
if(openBracket !== closeBracket){
result = false;
}
return result;
}
function solution(p) {
if(checkRight(p)) return p;
if(p === "") return "";
let u = "";
let v = "";
for(let i = 0; i < p.length / 2; i++){
u += p.substr(i * 2, 2);
if(checkBalanced(u)){
v = p.slice(u.length);
break;
}
}
if(checkRight(u)){
return u + solution(v);
} else {
let uArr = u.split("");
uArr.shift();
uArr.pop();
uArr = uArr.map(bracket => bracket === ")" ? "(" : ")");
return "(" + solution(v) + ")" + uArr.join("");
}
}
👩🏻💻 다른 사람의 코드
function reverse(str) {
return str.slice(1, str.length - 1).split("").map((c) => (c === "(" ? ")" : "(")).join("");
}
function solution(p) {
if (p.length < 1) return "";
let balance = 0;
let pivot = 0;
do { balance += p[pivot++] === "(" ? 1 : -1 } while (balance !== 0);
const u = p.slice(0, pivot);
const v = solution(p.slice(pivot, p.length));
if (u[0] === "(" && u[u.length - 1] == ")") return u + v;
else return "(" + v + ")" + reverse(u);
}
🍯 알게 된 것들
do...while
문
do...while 문은 테스트 조건이 거짓으로 평가될 때까지 지정된 구문을 실행하는 루프를 만듭니다.
단, 구문이 실행된 뒤에 테스트 조건이 평가됨으로 구문은 무조건 한 번은 실행됩니다.
let result = '';
let i = 0;
do {
i = i + 1;
result = result + i;
} while (i < 5);
console.log(result);
// expected result: "12345"
- 함수를 만들 때는 좀 더 단순한 로직이 없는지 고민해보기! 내가 만든 코드의
checkRight
함수는 사실, 스택에 처음들어오는 글자가(
이냐 아니냐를 통해서도 확인이 가능하다. - 문제 꼼꼼히 읽기! 문제에서 의미했던
reverse
는 Array.prototype.reverse()의 의미가 아니라, 괄호를 반대 방향으로 바꾸라는 의미였다.
Author And Source
이 문제에 관하여([프로그래머스 레벨투] 괄호 변환 🧟♀️🧟♂️), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@9rganizedchaos/프로그래머스-레벨투-괄호-변환저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)