문제: https://programmers.co.kr/learn/courses/30/lessons/12909
입력받은 s를 순회한다.
1. 여는 괄호('(')면 변수(cnt
)에 +1 닫는 괄호(')')면 변수(cnt
)에 -1
2. 순회중 cnt가 음수이면 false
3. 순회 마치고 cnt가 0이 아니면 false
4. 모두 통과하면 true
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 이 없는 경우는 없기 때문에 모든 경우가 해결 됩니다.
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;
}
괄호문제는 비슷한 문제를 너무 많이 풀어서 바로 해결했다.
다음 큰 수도 최근 코드스쿼드에서 이진수다루는 알고리즘하고 미션을 해서 그런지 쉽게 해결한 느낌이다.