https://leetcode.com/problems/zigzag-conversion/
6. Zigzag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
Example 3:
Input: s = "A", numRows = 1
Output: "A"
Constraints:
- 1 <= s.length <= 1000
- s consists of English letters (lower-case and upper-case), ',' and '.'.
- 1 <= numRows <= 1000
풀이
주어진 문자열을 지그재그 형태로 배열하고 이를 다시 첫 row부터 순서대로 출력하는 문제이다.
따라서 주어진 numRows의 1차원 배열을 가진 2차원 배열을 만들고 이를 층으로 생각했다.
중요한 것은 문자열의 i번째 문자를 몇 번째 배열에 넣는가 이다.
numRows가 1증가하면 2개의 문자가 추가로 위에 배치되므로 이를 토대로 새로운 인덱스를
let index = i % (2 * numRows - 2)
2 * (numRows - 1) - index 로 만들어줬다.
그리고 index에 맞춰서 배열에 넣으면 지그재그 순서로 들어간다.
var convert = function (s, numRows) {
if (numRows === 1) return s;
let answer = [];
for (let i = 0; i < numRows; i++) {
answer.push([]);
}
s = s.split("");
s.forEach((x, i) => {
let index = i % (2 * numRows - 2);
if (index >= numRows) index = 2 * (numRows - 1) - index;
answer[index].push(x);
});
answer = answer.map((x) => x.join(""));
return answer.join("");
};
'CS > Algorithm\Coding Test' 카테고리의 다른 글
프로그래머스 : 신고 결과 받기 - javascript (0) | 2022.01.18 |
---|---|
프로그래머스 : 거리두기 확인하기-javascript (0) | 2022.01.04 |
프로그래머스 : 다리를 지나는 트럭-javascript (0) | 2021.12.22 |
프로그래머스 : H-index-javascript (2) | 2021.12.20 |
프로그래머스 : 소수 찾기-javascript (0) | 2021.12.20 |