[프로그래머스] 괄호 변환 - javascript

김지원·2022년 2월 2일
0

coding-test

목록 보기
15/25
post-thumbnail

📖 문제링크

https://programmers.co.kr/learn/courses/30/lessons/60058

문제 설명

문제 설명은 길기 때문에 링크로 대신해야할 것 같다.


👨‍💻 문제풀이

필자가 처음 푼 문제풀이


function splitStr(str) {
  let [left, right] = [0, 0];
  let check = true;
  let u = "";
  let v = "";

  for (let i = 0; i < str.length; i++) {
    if (check) {
      str[i] === "(" ? ++left : ++right;
      u += str[i];
    } else {
      v = str.slice(i, str.length);
      break;
    }
    if (left === right) {
      check = false;
    }
  }
  return [u, v];
}

function isRight(str) {
  let original = str;
  if (!str.length) return true;
  for (let i = 1; i <= original.length / 2; i++) {
    str = str.replace(/\(\)/g, "");
    if (!str) {
      return true;
    }
  }
  return false;
}

function changeStr(u) {
  let newU = "";
  u = u.slice(1, -1);
  for (let i = 0; i < u.length; i++) {
    let changeU = "";
    u[i] === "(" ? (changeU = ")") : (changeU = "(");
    newU += changeU;
  }

  return newU;
}

function solution(p) {
  let answer = "";
  let [u, v] = splitStr(p);

  if (isRight(u)) {
    answer += u;
  } else {
    if (isRight(v)) {
      answer += `(${v})`;
      answer += changeStr(u);
      v = "";
    }
  }

  if (v.length) answer += solution(v);
  return answer;
}

이 문제가 재귀 함수로 푸는 문제라는 것은 파악했지만 핵심을 파악하지 못해 올바른 괄호인지 확인하는 함수, 괄호를 바꾸는 함수, u와 v를 나누는 함수를 따로 두었다..😱

다음 푼 문제풀이

function solution(p) {
	let answer = "";
	let left = 0 
    let right = 0; 
	let check = true;
    
	if (p.length == 0) return ""
    
	for (let i = 0; i < p.length; i++) {
		p[i] === "(" ? left++ : right++;
        
		if (right > left) check = false;
        
		if (left === right) {
			if (!check) {
				answer += "(";
				answer += solution(p.slice(i + 1, p.length));
				answer += ")";
              
				for (let j = 1; j < i; j++) {
					p[j] === "(" ? answer += ")" : answer += "(";
				}
				return answer;
			} else { 
				answer += p.slice(0, i + 1);
				answer += solution(p.slice(i + 1, p.length));
				return answer;
			}
		}
    }
}

한 함수 안에서 모두 해결했다.
여기서 핵심은 if (right > left) check = false; 이 부분이다.

괄호에서 )이 부분이 나오는 순간부터는 올바른 괄호가 될 수 없다.

그래서 그 부분부터 재귀함수를 돌려 v가 빈 문자열이 될 때까지 반복해주는 문제였다.

👨‍💻 다른 사람 문제풀이

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을 이용해 코드를 훨씬 깔끔하게 만든 것을 볼 수 있다.
그리고 괄호를 변환할 때도 reverse함수를 이용해 깔끔하게 표현하였다.

다시 코드를 해석해보면서 공부를 마쳐야겠다.

2022.02.02

profile
backend-developer

0개의 댓글