코드노트

LeetCode 6. Zigzag Conversion 자바스크립트 문제 풀이 본문

Code note/자바스크립트 알고리즘 문제풀이

LeetCode 6. Zigzag Conversion 자바스크립트 문제 풀이

코드노트 2022. 9. 24. 02:32

문제 설명

문자열 "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"

끝!

 

앞으로 문제를 풀 때 이러한 코드진행도 생각하며 풀어봐야겠다.