[프로그래머스][JS]올바른 괄호, 다음 큰 숫자

Kyle·2021년 1월 8일
0

problem solving

목록 보기
29/36

올바른 괄호

문제: https://programmers.co.kr/learn/courses/30/lessons/12909

해결방법

입력받은 s를 순회한다.
1. 여는 괄호('(')면 변수(cnt)에 +1 닫는 괄호(')')면 변수(cnt)에 -1
2. 순회중 cnt가 음수이면 false
3. 순회 마치고 cnt가 0이 아니면 false
4. 모두 통과하면 true

code

function solution(s) {
  let cnt = 0;
  for (let x of s.split('')) {
    if (cnt < 0) return false;
    if (x === '(') cnt++;
    else cnt--;
  }
  if (cnt !== 0) return false;
  return true;
}

다음 큰 숫자

문제: https://programmers.co.kr/learn/courses/30/lessons/12911

입력받은 숫자의 이진수에서 1의 개수는 갖지만 큰 값들 중 가장 작은 값을 구하는 문제

해결방법

예시로 설명하겠습니다.

문제에 있는 1001110 을 기준으로 본다. 앞으로 bin이라고 하겠습니다.. bin=1001110

  • bin을 배열로 만들고 뒤집어준다. 편의상 따옴표는 생략하고 쓰겠습니다.

  • [0,1,1,1,0,0,1] 이렇게 되면 왼쪽으로 순서대로 1 그 다음으로 0이 나오는 곳을 기준으로 자르면 [0,1,1,1,0] / [0,1] 이 됩니다.

  • 그럼 이제 [0,1,1,1,0]만 재조정 해주면 됩니다. [1,1,0,0,1] 모양으로 만들어 줘야 되기 때문에
    1. 큰수로 정렬 ([1,1,1,0,0])
    2. 맨 앞 1을 shift()해서 맨 뒤에 push(1) ([1,1,0,0,1])

  • 재조정한 [1,1,0,0,1]과 [0,1]을 합칩니다. ([1,1,0,0,1,0,1])

  • 다시 뒤집어 줍니다. ([1,0,1,0,0,1,1]) 원하는 값이 나왔습니다.

다만 예외가 있죠.
[1,1,1] 또는 [1,1,0] 처럼 뒤집었을 때 1뒤에 0이 나오지 않는 경우가 있습니다.
이를 위해서 초기에 bin을 배열로 만들고 뒤집어 줄 때 0을 맨 뒤에 넣어줍니다. (push(0))
=> 앞에 1 앞에 0 이 없는 경우는 없기 때문에 모든 경우가 해결 됩니다.

code

function solution(n) {
  //배열->뒤집기->0추가
  let binN = n.toString(2).split('').reverse();
  binN.push('0');
  for (let i = 0; i < binN.length; i++) {
    //1이고 다음으로 0이 나오는 경우
    if (binN[i] === '1' && binN[i + 1] === '0') {
      const binA = binN.slice(i + 2);
      let binB = binN.slice(0, i + 2);
      //재조정
      binB.sort((a, b) => b * 1 - a * 1);
      binB.shift();
      binB.push('1');
      //붙이기
      binN = binB.concat(binA);
      break;
    }
  }
  //다시 원상태로 뒤집기
  binN = binN.reverse();
  //0일 경우 예외 처리
  const answer =
    parseInt(binN.join(''), 2) !== 0 ? parseInt(binN.join(''), 2) : 0;
  return answer;
}

마무리

괄호문제는 비슷한 문제를 너무 많이 풀어서 바로 해결했다.
다음 큰 수도 최근 코드스쿼드에서 이진수다루는 알고리즘하고 미션을 해서 그런지 쉽게 해결한 느낌이다.

profile
Kyle 발전기

0개의 댓글