LeetCode 6. Zigzag Conversion 자바스크립트 문제 풀이
문제 설명
문자열 "PAYPALISHIRING"은 다음과 같이 주어진 행 수에 지그재그 패턴으로 작성됩니다.
(가독성을 위해 이 패턴을 고정 글꼴로 표시할 수 있습니다.)
P A H N
A P L S I I G
Y I R
그런 다음 "PAHNAPLSIIGYIR"을 한 줄씩 읽습니다.
문자열을 취하고 주어진 행의 수를 이 변환하는 코드를 작성하십시오:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
- 문제를 처음보고 2차원 배열로 접근을 해야하나 라는 생각이 먼저 들었다.
- 그러나 2차원 배열을 사용할 필요가 없었다.
- 문제를 간단하게 설명하면 주어지는 numRows만큼 배열에 요소를 만들고 그 요소에 s문자열을 순서대로 넣어주면 되는 문제였다.
하...문제 이해력이 너무 딸리는거 같다.. 나도 똑똑해 지고싶어..
문제 푸는 단계별 정리
1. 새로운 배열을 만든다.
2. count 변수와 false, true를 사용할 수 있는 변수 2개를 만든다.
3. s.length만큼 for문을 돌면서 새로운 배열에 count를 조절해가며 index에 접근하여 문자열을 추가한다.
풀이 코드
var convert = function (s, numRows) {
const sLen = s.length; // s.length를 변수에 담는다.
if (numRows < 2 || sLen < numRows) { // numRows가 0이거나 문자열보다 큰 수이면 원본 s를 리턴
return s;
}
const rows = new Array(numRows).fill(""); // 새로운 배열에 fill로 numRows만큼 요소를 추가
let count = 0;
let reverse = false; // count의 수를 ++ --로 바꾸기 위해서 false로 우선 할당
for (i = 0; i < sLen; i++) {
rows[count] += s[i]; // 새로운 배열에 count만큼 s문자열을 하나씩 추가
reverse ? count-- : count++; // reverse가 true면 --, false면 ++
if (count === 0 || count === numRows - 1) { // count가 0이거나 numRows-1과 같으면?
reverse = !reverse; // false면 true로! true면 false로!
}
}
return rows.join(""); // for문을 다 돌고 배열을 문자열로 반환
};
- 접근법이 처음에는 너무 어려웠다.
- 이런문제는 풀면 풀수록 다른 문제를 풀 때도 응용할 수 있을 것 같다..할 수 있을 까? ㅋ
- true, false를 통해서 count값을 조절하고 index에 접근하는 방식이 새로웠다.
확실하게 이해할 수 있도록 하나하나 따라가보도록 하겠다.
s = "PAYPALISHIRING"
i = 0
s[0] = "P"
count = 0
rows[count] += s[i]
↘ rows[0] += "P"
rows
index 0 : P
index 1 :
index 2 :
reverse = false
reverse ? count -- : count ++;
↘ false = count ++
count = 1
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 2가 아니므로 Pass
i = 1
s[1] = "A"
count = 1
rows[count] += s[i]
↘ rows[1] += "A"
rows
index 0 : P
index 1 : A
index 2 :
reverse = false
reverse ? count -- : count ++;
↘ false = count ++
count = 2
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 2이므로 조건 만족
reverse = !reverse
↘ reverse = true
i = 2
s[2] = "Y"
count = 2
rows[count] += s[i]
↘ rows[2] += "Y"
rows
index 0 : P
index 1 : A
index 2 : Y
reverse = true
reverse ? count -- : count ++;
↘ false = count --
count = 1
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 1이므로 pass
i = 3
s[3] = "P"
count = 1
rows[count] += s[i]
↘ rows[1] += "P"
rows
index 0 : P
index 1 : A P
index 2 : Y
reverse = true
reverse ? count -- : count ++;
↘ false = count --
count = 0
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 0이므로 조건 만족
reverse = !reverse
↘ reverse = false
i = 4
s[4] = "A"
count = 0
rows[count] += s[i]
↘ rows[0] += "A"
rows
index 0 : P A
index 1 : A P
index 2 : Y
reverse = false
reverse ? count -- : count ++;
↘ false = count ++
count = 1
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 1이므로 pass
i = 5
s[5] = "L"
count = 1
rows[count] += s[i]
↘ rows[1] += "L"
rows
index 0 : P A
index 1 : A P L
index 2 : Y
reverse = false
reverse ? count -- : count ++;
↘ false = count ++
count = 2
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 2이므로 조건 만족
reverse = !reverse
↘ reverse = true
i = 6
s[6] = "I"
count = 2
rows[count] += s[i]
↘ rows[2] += "I"
rows
index 0 : P A
index 1 : A P L
index 2 : Y I
reverse = true
reverse ? count -- : count ++;
↘ false = count --
count = 1
if( count가 0이거나 || count 카운트가 numRows(3)-1과 같은가? ) count가 1이므로 Pass
이런 단계로 계속 문자열을 넣게 되면
rows
index 0 : P A H N
index 1 : A P L S I I G
index 2 : Y I R
"PAHN" "APLSIIG" "YIR"
이렇게 문자열이 들어가게 된다.
마지막에 join을 하게 되면
"PAHNAPLSIIGYIR"
끝!
앞으로 문제를 풀 때 이러한 코드진행도 생각하며 풀어봐야겠다.