본문 바로가기

Algorithm

[LeetCode] Java - 6. ZigZag Conversion

https://leetcode.com/problems/zigzag-conversion/

 

ZigZag Conversion - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문자열과 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();
    }
}