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"
s
, 가로 줄 수 numRows
0th row P I N
1th row A L S I G
2th row Y A H R
3th row P I
각 줄 구하는 방법
0
부터 시작해서 6
(2 * numRows - 2
)씩 증가3
(numRows - 1
)부터 시작해서 6
(2 * numRows - 2
)씩 증가1
부터 시작해서 4
,2
가 번갈아가면서 증가curRows
부터 시작해서 (numRows - curRows - 1) * 2
, curRows * 2
가 번갈아가며 증가각 줄의 문자들을 순서대로 넣어서 답을 반환
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
char[] array = s.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
addFirstLine(array, numRows, stringBuilder);
for (int curRows = 1; curRows < numRows - 1; curRows++) {
addMiddleLine(array, numRows, curRows, stringBuilder);
}
addLastLine(array, numRows, stringBuilder);
return stringBuilder.toString();
}
public void addFirstLine(char[] array, int numRows, StringBuilder sb) {
int index = 0;
while (index < array.length) {
sb.append(array[index]);
index += 2 * numRows - 2;
}
}
public void addMiddleLine(char[] array, int numRows, int curRows, StringBuilder sb) {
int index = curRows;
int count = 0;
while (index < array.length) {
sb.append(array[index]);
count++;
index += count % 2 == 0 ? curRows * 2 : (numRows - curRows - 1) * 2;
}
}
public void addLastLine(char[] array, int numRows, StringBuilder sb) {
int index = numRows - 1;
while (index < array.length) {
sb.append(array[index]);
index += 2 * numRows - 2;
}
}
}
char[][]
를 만든다면, 성능은 떨어질 수 있으나 코드가 상대적으로 읽기 쉬워진다.class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
char[][] matrix = new char[numRows][s.length()];
int x = 0;
int y = 0;
int unitSize = (numRows - 1) * 2;
for (int i = 0; i < s.length(); i++) {
matrix[y][x] = s.charAt(i);
if (i % unitSize < unitSize / 2) {
y++;
} else {
y--;
x++;
}
}
StringBuilder sb = new StringBuilder();
for (char[] array : matrix) {
for (char element : array) {
if (element != 0) {
sb.append(element);
}
}
}
return sb.toString();
}
}