https://school.programmers.co.kr/learn/courses/30/lessons/76502
괄호가 담긴 배열을 회전하면서, 회전한 배열이 올바른 괄호 문자열인지 판단 후 그 총개수를 구하는 문제.
우리는 배열의 시작과 끝을 연결하는 효과를 주기 위해 아래와 같은 방법을 택한다.
for(let j = i; j < len + i; j++) {
sum += elements[j % len];
totalSet.add(sum);
}
위 코드와 같이 모듈러 연산을 활용해 다시 앞으로 돌아갈 수 있게 한다.
난 개인적으로 이 방법을 선호하는 편이다.
하지만 모듈러 연산을 사용하지 않는 방법도 있다.
let rotated = s + s; // 문자열을 두 번 연결하여 회전 효과 생성
이렇게 똑같은 걸 뒤에 하나 더 붙여서 회전을 구현할 수도 있다.
배열 ``A, B, C, D``가 있다고 가정하자.
이 뒤에 똑같은 배열을 붙이면 ``A, B, C, D, A, B, C, D``가 된다.
만약 C부터 3개의 연속된 원소를 출력해야 하면 어떻게 해야 할까?
두 개의 배열이 연결돼 있기 때문에, 돌아가는 것 없이 그냥 배열을 순회하듯이 출력할 수 있다.
순회하려는 기본 배열의 크기를 잘 인식한다면 간편하게 회전을 만들 수 있다.하지만, 회전 순회가 정말 많이 필요하다면 모듈러 연산을 통한 순회가 가장 좋겠다.
다시 돌아와서, 난 문제를 이렇게 풀었다.
function isValid(s) {
const stack = [];
const map = {
'(': ')',
'{': '}',
'[': ']'
};
for (let char of s) {
if (char in map) {
stack.push(char);
} else {
if (stack.length === 0 || map[stack.pop()] !== char) {
return false;
}
}
}
return stack.length === 0;
}
function solution(s) {
let answer = 0;
let rotated = s + s; // 문자열을 두 번 연결하여 회전 효과 생성
for (let i = 0; i < s.length; i++) {
if (isValid(rotated.slice(i, i + s.length))) {
answer++;
}
}
return answer;
}
괄호 검증은 이전에 해둔 게 있었기 때문에 유용했다.``s``를 하나 더 붙여서 회전 처리용 임시 문자열을 만들고,``slice()``를 통해 사용하고 있다.꽤 심플하니 괜찮은 것 같다.
사실 두 개를 붙인다는 발상은 해 본 적이 없다.알파벳 처리도 항상 모듈러 연산을 통해 하는 것이 일반적이지 않던가.하지만, 꽤 직관적인 방법이기도 하므로 나중에 잘 써먹을 수 있을 것 같다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #9] 로그인 / 비로그인 구분 (0) | 2024.09.10 |
---|---|
[TIL #8] H-Index 구하기 (0) | 2024.09.09 |
[TIL #6] 햄버거 만들기 (0) | 2024.08.23 |
[TIL #5] 소수 만들기 (0) | 2024.08.22 |
[TIL #4] 비동기 (0) | 2024.08.13 |