https://leetcode.com/problems/zigzag-conversion/
문자열과 row의 크기가 주어지면 이를 지그재그 패턴으로 읽는 문제이다.
처음엔 지그재그패턴으로 한글자씩 읽어 2차원배열로 저장하려고 했다가, 이를 다시 지그재그패턴으로 읽은 문자열을 반환해야되서 단순하게 numRows 의 길이를 가진 1차원 배열에 넣어 지그재그패턴으로 읽은 값을 각 행별로 저장했다.
1. 미리 StringBuilder타입의 1차원 배열을 선언한다. 이때 i번째 요소들을 new Stringbuilder()로 초기화해줘야한다!
2. 지그재그 패턴으로 읽어갈것이지만, StringBuilder 의 배열엔 각 행별로 한글자씩 읽은 값들을 이어붙일것이기때문에 아래로 내려갈땐 행의 크기만큼 아래로내려가는 반복문과 대각선크기만큼 올라가는 반복문을 각각 돌아야한다.
2-1. 아래로 내려갈때, numRows크기만큼 sb[행인덱스++].append(c[문자열인덱스++])
2-2. 대각선으로 올라갈때, 대각선크기만큼(numRows-2) sb[대각선에 해당하는 행인덱스--].append(c[문자열인덱스++])
3. sb 배열에 지그재그패턴으로 읽어들인 값들이 저장되어있으므로, sb[0]부터 마지막 인덱스까지 붙인다음 리턴하면된다.
Java Code
class Solution {
public String convert(String s, int numRows) {
if(numRows <= 1) return s;
char[] c = s.toCharArray();
StringBuilder[] sb = new StringBuilder[numRows];
for (int i = 0; i < sb.length; i++) {
sb[i] = new StringBuilder("");
}
int size = s.length();
int idx=0;
while(idx < size) {
int i = 0;
while(i < numRows && i < size && idx < size) {
sb[i++].append(c[idx++]); // 아래로 내려가기
}
int j = numRows-2;
while(j >= 1 && j < size && idx < size) {
sb[j--].append(c[idx++]); //대각선으로 올라가기
}
}
for (int i = 1; i < sb.length; i++) {
sb[0].append(sb[i]);
}
return sb[0].toString();
}
}
'Algorithm' 카테고리의 다른 글
[LeetCode] Java, Python - 94. Binary Tree Inorder Traversal (0) | 2021.06.18 |
---|---|
[LeetCode] Python - 648. Replace Words (0) | 2021.06.18 |
[LeetCode] Java - 64. Minimum Path Sum (DFS + DP 기본문제) (0) | 2021.06.12 |
[백준] JAVA - 2805. 나무 자르기 (0) | 2021.05.13 |
[프로그래머스] Java - 경주로 건설 (0) | 2021.05.04 |