알고리즘🅰/리트코드

[리트코드] 6. Zigzag Conversion

개발조각 2022. 9. 12. 13:01
728x90
반응형

안녕하세요. 개발조각입니다.😊

빠르게 해결방안에 대해 설명하겠습니다.


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 해주어 한 문자열로 만들고 리턴을 해주었습니다.

 

 

728x90
반응형