6. Zigzag Conversion

LONGNEW·2023년 7월 4일
0

CP

목록 보기
112/155
post-thumbnail

https://leetcode.com/problems/zigzag-conversion/?envType=featured-list&envId=top-google-questions

input :

  • s, numRows

output :

  • s 문자열을 지그재그 형태로 나열 했을 때의 문자열을 출력하시오.

조건 :

  • 지그 재그의 시작지점은 문자열의 첫 문자이다.
  • 움직임은 아래, 위쪽 대각선 2가지이다.

Solution explain : Solution1

idea

주의

  • 수학적으로 규칙을 찾으려 할 때 마지막에 위치한 인덱스들 ([12, 13, 14, 15] 혹은 [16, 17, 18, 19, 20])의 경우 기준을 어떻게 두냐에 따라 접근을 못할 수 있다.
  • 차라리 [0, 1, 2, 3, 4]와 같은 무조건 원소가 존재하는 쪽에서 뒤(interval)를 바라보는 것이 더 안전하다.
import math


class Solution:
    def convert(self, s: str, numRows: int) -> str:
        diff = (numRows - 1) * 2
        if diff == 0:
            diff = 1

        ret = ""
        for i in range(numRows):
            for idx in range(i, len(s), diff):
                ret += s[idx]
                if i != 0 and i != numRows - 1:
                    step1 = (numRows - 1 - i) * 2
                    if idx + step1 >= len(s):
                        continue
                    ret += s[idx + step1]
        return ret

    # def convert(self, s: str, numRows: int) -> str:
    #     if numRows == 1:
    #         return s
    # 
    #     temp = [[""] * 1000 for _ in range(numRows)]
    #     dx, dy = {False: 1, True: -1}, {False: 0, True: 1}
    # 
    #     x, y = 0, 0
    #     flag = True
    #     for item in s:
    #         temp[x][y] = item
    # 
    #         if x == 0 or x == numRows - 1:
    #             flag = not flag
    #         x, y = x + dx[flag], y + dy[flag]
    # 
    #     ret = ""
    #     for item in temp:
    #         for cha in item:
    #             ret += cha
    #     return ret

# s = Solution()
# print(s.convert("ABC", 2))

0개의 댓글