[리트코드] 6. Zigzag Conversion
안녕하세요. 개발조각입니다.😊
빠르게 해결방안에 대해 설명하겠습니다.
https://leetcode.com/problems/zigzag-conversion/
Zigzag Conversion - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
해결방안
var convert = function(s, numRows) {
if(numRows===1) return s;
let strArr = new Array(numRows);
strArr.fill('');
let idx = 0;
let count = 0;
for(let i=0; i<s.length; i++){
if(i===0){
strArr[idx] += s[i];
continue;
}
if(count === 0){
idx++;
strArr[idx] += s[i];
if(idx === numRows-1) count = numRows-1;
}else if(count === numRows-1){
idx--;
strArr[idx] += s[i];
if(idx === 0) count = 0;
}
}
return strArr.join('')
};
이문제의 해결방안을 설명하기전 어떻게 코드를 짰는지 설명을 하자면
Input: s = "PAYPALISHIRING", numRows = 3
이와 같은 예제가 있으면
p (1) | A (5) | H (9) | N (13) | 1번 | |||
A (2) | P (4) | L (6) | S (8) | I (10) | I (12) | G (14) | 2번 |
Y (2) | I (7) | R (11) | 3번 |
이런식으로 지그재그로 배치하게 됩니다.
어떻게 보면 numRows이 3이면
1번 → 2번 → 3번 → 2번 → 1번 → 2번 → 3번 ....
이렇게 1 → 3 → 1 반복을 하고 있습니다.
이걸 코드로 짜면 됩니다.
그래서 최종으로
- 1번 : P A H N
- 2번: A P L S I I G
- 3번: Y I R
이렇게 넣어되고,
1번+2번+3번 해주면 답이 나오게 됩니다.
if(numRows===1) return s;
numRows가 1일 경우에는 문자열 s가 그대로 반환이 되므로 먼저 처리를 해주었습니다.
이제 numRows가 2일 경우부터 시작되는 코드입니다.
let strArr = new Array(numRows);
strArr.fill('');
먼저 numRows만큼의 길이인 배열을 만들어주고 빈 문자열을 넣어주었습니다.
numRows = 3일 경우
strArr = ['', '', '']
let idx = 0;
let count = 0;
여기서
idx는 1번, 2번, 3번 중에서 어디인지를 나타내고
count는 1 →3이 되면 3 → 1로 바꿔주고 하는 전환 기준점이라고 생각하시면 좋을 것 같아요.
if(i===0){
strArr[idx] += s[i];
continue;
}
먼저 0일 경우는 따로 제어를 해주었습니다.
i가 0일 때는 무조건 첫 번째 자리에 들어가기 때문에 이렇게 써주었습니다.
if(count === 0){
idx++;
strArr[idx] += s[i];
if(idx === numRows-1) count = numRows-1;
}
count가 0이면 idx를 +해주는 조건을 만들어주어
idx 값을 ++해주었고
idx가 numRows-1이 된다면 count는 numRows-1이 되도록 변경해주었습니다.
else if(count === numRows-1){
idx--;
strArr[idx] += s[i];
if(idx === 0) count = 0;
}
count가 numRows-1이면 idx를 -해주는 조건을 만들어주어
idx 값을 --해주었고
idx가 0이 된다면 count는 0이 되도록 변경해주었습니다.
return strArr.join('');
마지막으로 strArr를 join 해주어 한 문자열로 만들고 리턴을 해주었습니다.