2024. 4. 2. 13:50ㆍ알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/76502
문제를 해석하는 것은 비교적 쉬웠다.
문자열을 왼쪽으로 회전시키고 스택을 활용해 올바른 괄호인지 체크하면 된다.
이 문제의 핵심은 문자열을 한 번 회전시키는 것이 아니라 0부터 문자열 길이 - 1번만큼 회전시켜야 된다는 점이다.
즉, 문자열이 10글자라면 0부터 9까지 왼쪽으로 회전시킬 때마다 올바른 괄호인지 체크해야한다.
const check = (a) => {
const match = new Map([['(',')'], ['{','}'], ['[',']']]);
const stack = [];
[...a].forEach((elem)=>{
if(stack.length && elem === match.get(stack[stack.length - 1])) stack.pop();
else stack.push(elem);
});
if(stack.length) return false;
return true;
}
function solution(s) {
let ret = 0;
for(let i = 0; i<s.length; i++){
let a = [];
let j = 0;
let tmp = [];
while(j!==i){
tmp.push(s[j]);
j++;
}
for(let k = j; k<s.length; k++) a[k-j] = s[k];
a = a.concat(tmp).join("");
if(check(a)) ret++;
}
return ret;
}
function solution(s) {
let ret = 0;
for(let i = 0; i<s.length; i++){
let a = [];
let j = 0;
let tmp = [];
while(j!==i){
tmp.push(s[j]);
j++;
}
for(let k = j; k<s.length; k++) a[k-j] = s[k];
a = a.concat(tmp).join("");
if(check(a)) ret++;
}
return ret;
}
위에는 전체코드이고 아래는 문자열을 회전하는 부분이다.
문자열을 n번 회전한다는 것은 결국에 기존 문자열을 앞에서부터 n번째까지 잘라서 뒤에 붙이는 것을 의미한다.
따라서 나는 임시 배열에 자른 문자열을 넣어주고 배열을 앞으로 당긴 다음 concat 메서드를 이용해 임시 배열을 당긴 배열에 붙이는 방법을 생각했다.
for(let k = j; k<s.length; k++) a[k-j] = s[k];
이 부분이 기존 문자열을 앞으로 당기는 부분인데 n번째 회전을 한다는 것은 기존 문자열 인덱스 기준으로 n번째 요소부터 앞으로 당겨야되기 때문에 다음과 같이 구현했다.
무슨 말이냐면 3번 회전을 했다는 것은 인덱스 기준으로 3번째 인덱스 요소부터 0번째 인덱스로 당기고, 4번째 인덱스 요소는 1번째 인덱스로 당겨야된다는 말이다.
스스로 배열을 회전하는 것에 뿌듯함은 느꼈지만 복잡하게 구현한 느낌이 들었다.
조금 더 직관적이고 쉬운 방법이 없을까 고민이 되었다.
Slice로 회전 구현 하기
function rotate() {
let ret = [];
let a = '[](){}';
for (let i = 0; i < a.length; i++) {
const r = a.slice(i) + a.slice(0, i);
ret.push(r);
}
return ret;
}
console.log(rotate());
slice를 메서드를 활용하면 배열을 앞으로 당기는 과정이 필요없다.
n번째 회전한다면 앞에서부터 n번째 전까지 slice로 복사한 후, 그 값을 n번째에서 끝까지 복사한 값 뒤에 붙이면 된다.
2차원 배열 회전시키기
조금 더 나아가보자. 2차원 배열을 회전시키는 경우에는 어떻게 해야할까?
let arr = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
];
function rotateLeft() {
let n = arr.length;
let m = arr[0].length;
let ret = Array.from({ length: m }, () => Array.from({ length: n }).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
ret[i][j] = arr[j][m - i - 1];
}
}
return ret;
}
console.log(rotateLeft());
let arr = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
];
function rotateRight() {
let n = arr.length;
let m = arr[0].length;
let ret = Array.from({ length: m }, () => Array.from({ length: n }).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
ret[i][j] = arr[n - j - 1][i];
}
}
return ret;
}
console.log(rotateRight());
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2️⃣ - H-Index (0) | 2024.04.03 |
---|---|
Level 2️⃣ - n^2 배열 자르기 (0) | 2024.04.03 |
Level2️⃣ - 멀리 뛰기 (1) | 2024.04.01 |
Level2️⃣ - 점프와 순간이동 (0) | 2024.03.28 |
Level2️⃣ - 영어 끝말잇기 (0) | 2024.03.28 |