복's

[ LeetCode - 6 ] Zigzag Conversion 본문

알고리즘/LeetCode

[ LeetCode - 6 ] Zigzag Conversion

나복이 2023. 10. 31. 03:53
728x90

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

 

Zigzag Conversion - LeetCode

Can you solve this real interview question? 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

leetcode.com

처음 문제를 접했을 때는 감도 안잡혔다...ㅎ

종이에 적으면서 규칙을 찾으려고 하다가 찾게 되서 풀게 되었는데 그나마 다행인가 싶다.(시간과 공간 효율은 좋지 않았음)


[ 📌 풀이 ]

1) 2차원 배열은 생성해서 규칙에 맞게 각 글자들을 알맞은 배열방에 삽입한다.

2) 배열의 경계를 만나면 pattern을 변경해서 다른 규칙이 적용되도록 한다.

3) 각 배열의 요소를 합쳐서 return

[ 규칙 2차원 배열 시각화 ]

  • 밑으로 내려갈 때는 x값이 1씩 증가한다.
  • 위로 올라갈 때는 x값이 1씩 감소하고, y값이 1씩 증가한다.

 

[ 📌 다른 사람의 풀이 ]

rowNum에 맞춰서 앞 글자를 1부터 시작해서 번호를 부여하다가 rowNum과 동일해지면 1씩 감산해서 번호를 채번하는 방법으로 반복문 한 번에 모두 끝낼 수 있어서 내 코드랑 비교가 불가능함...

[ 다른 사람 풀이 ]

이 풀이를 보니까 뭔가 나는 문제를 주어진 그대로만 받아 들여서 아쉽게 풀었나 싶다.


[ 📌 내 코드 - Python  ]

"""
# Author    : Lee In Bok 
# Date      : 2023.10.31(Tue)
# Spend Time: 31m 19s
# Runtime   : 434 ms (Beats 9.40%)
# Memory    : 20.2 MB (Beats 7.56%)
# Algoritm  : String
"""

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s

        arr = [["" for _ in range(len(s) // 2 + 1)] for _ in range(numRows + 1)]
        x, y = 0, 0
        pattern = True

        for ch in s:
            arr[x][y] = ch

            if pattern:
                x += 1
            else:
                x -= 1
                y += 1

            if x == numRows -1:
                pattern = False
            elif x == 0:
                pattern = True

        ans = ""

        for a in arr:
            for b in a:
                ans += b

        return ans

 

[ 📌 다른 사람 코드 - Python  ]

"""
# Author    : Someone in LeetCode
# Date      : 2023.10.31(Tue)
# Spend Time: (X)
# Runtime   : 50 ms (Beats 91.31%)
# Memory    : 16.3 MB (Beats 86.43%)
# Algoritm  : Copy
"""
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s
        
        row_arr = [""] * numRows
        idx, up = 0, True

        for ch in s:
            row_arr[idx] += ch

            if idx == numRows - 1:
                up = False
            elif idx == 0:
                up = True

            idx += 1 if up else -1

        return "".join(row_arr)

[ 📌 결과 ]

[ Result ]

728x90

'알고리즘 > LeetCode' 카테고리의 다른 글

[ LeetCode - 52 ] N-Queens II  (2) 2023.10.31
[ LeetCode - 12 ] Integer to Roman  (1) 2023.10.31
[ LeetCode - 2 ] Add Two Numbers  (0) 2023.10.30
[ LeetCode - 22 ] Generate Parentheses  (2) 2023.10.30
[ LeetCode - 42 ] Trapping Rain Water  (1) 2023.10.30