리트코드 문제 6,7

2 minute read

6. Zigzag Conversion

The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this:

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: “PAHNAPLSIIGYIR” Write the code that will take a string and make this conversion given a number of rows:

입력: s = “PAYPALISHIRING”, numRows = 3

출력: “PAHNAPLSIIGYIR”

내 풀이

class Solution:
    
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s
        zigzag = [[] for _ in range(numRows)]
        i, j, k = 0, 0, 0
        
        while j < len(s):
            if i!= 0 and i % numRows == 0:
                zigzag = zigzag[::-1]                
                i += 1
                k += 1
                continue
            
            zigzag[i%numRows].append(s[j])
            i += 1
            j += 1
                           
        if k % 2 == 1:
            zigzag = zigzag[::-1]  
            
        ans = ''
        for l in zigzag:
            ans += ''.join(l)
            
        return ans
  • zigzag 리스트에 numRows만큼 빈 리스트를 생성한다.
  • zigzag의 리스트에 s의 문자를 하나씩 추가한다.
  • i % numRow == 0 일때 마다 zigzag 요소를 반대로 뒤집는다.
  • k는 최종적으로 답을 리턴을 할때 zigzag가 처음상태와는 반대로 뒤집혀져 있는지 나타내는 값이다. 만약 홀수이면 처음상태와는 반대로 뒤집혀져 있다는 의미이므로 다시 반대로 집는다.

결과

Runtime: 104 ms, faster than 45.37% of Python3 online submissions for Zigzag Conversion. Memory Usage: 14 MB, less than 51.46% of Python3 online submissions for Zigzag Conversion.

풀이 1

class Solution(object):
    def convert(self, s, numRows):
        if numRows == 1 or numRows >= len(s):
            return s

        L = [''] * numRows
        index, step = 0, 1

        for x in s:
            L[index] += x
            if index == 0:
                step = 1
            elif index == numRows -1:
                step = -1
            index += step

        return ''.join(L)
  • idx가 0에 한번 도달하면 numRows-1 에 도달할때까지 1만큼 커진다.
  • idx가 numRows-1에 한번 도달하면 0에 도달할때까지 1만큼 작아진다.
  • 매우 간단한 풀이방법으로 runtime과 memory 모두 내풀이 방법보다 현저히 낮게 나온다.

7. Reverse Integer

Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.

입력: x = 123

출력: 321

내 풀이

class Solution:
    def reverse(self, x: int) -> int:
        x = str(x)
        if x[0] == '-':
            x = '-' + x[:0:-1]
        else:
            x = x[::-1]
        
        x = int(x)
        if x<(-2)**31 or x>(2**31)-1:
            return 0
        else:
            return x
        
  • 문자열 슬라이싱을 x[a:b:c] 라고 할때 a부터 b까지 c단계만큼 밟는다

결과

Runtime: 50 ms, faster than 56.09% of Python3 online submissions for Reverse Integer. Memory Usage: 13.9 MB, less than 63.35% of Python3 online submissions for Reverse Integer.

풀이 1

class Solution:
  def reverse(self, x):
      sign = [1,-1][x < 0]
      rst = sign * int(str(abs(x))[::-1])
      return rst if -(2**31)-1 < rst < 2**31 else 0

Comments