일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자바스크립트코딩테스트
- stack문제
- 리액트쿼리
- 자바스크립트 알고리즘
- 자바스크립트 문제풀이
- JavaScript
- HTML
- til
- next13
- 자바스크립트 문제 풀이
- 알고리즘문제풀이
- 타입스크립트
- 제로베이스
- 자바스크립트 알고리즘 문제
- lodash
- Next
- 리액트
- leetcode문제풀이
- 자바스크립트 연결리스트
- NPM
- JS
- 프론트엔드
- CSS
- 자바스크립트
- leetcode
- 자바스크립트 문제
- Baekjoon
- 프로그래머스
- Next.js13
- react
- Today
- Total
코드노트
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"
끝!
앞으로 문제를 풀 때 이러한 코드진행도 생각하며 풀어봐야겠다.
'Code note > 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
LeetCode 8. String to Integer (atoi) 자바스크립트 문제 풀이 (0) | 2022.09.27 |
---|---|
Leetcode 7. Reverse Integer 자바스크립트 문제 풀이 (0) | 2022.09.27 |
자바스크립트 스택 알고리즘 문제 풀이, 괄호 계산 (0) | 2022.09.24 |
자바스크립트 스택 문제 풀이 정리, 기린의 시야 (0) | 2022.09.22 |
LeetCode 58. Length of Last Word 문제풀이 자바스크립트 (0) | 2022.09.21 |