algorithm/problem solving

leetcode 560(구현?), 937(구현), 54(달팽이), 59(달팽이)

qkqhxla1 2020. 5. 12. 23:25

560 https://leetcode.com/problems/subarray-sum-equals-k/


딕셔너리에 https://leetcode.com/problems/two-sum/ 문제를 풀때처럼 이전까지의 합을 저장해놓는다. 그리고 현재까지의 총합 - k가 딕셔너리에 있으면 이 값은 이전 어디선가 만들어질수 있다는 뜻이므로 그만큼 +를 해준다. 

그게 아니면 해당 수가 만들어질 경우의 수를 딕셔너리에 저장해준다.

class Solution(object):
    def subarraySum(self, nums, k):
        d = {}
        d[0] = 1
        total = 0
        ret = 0
        for i in xrange(len(nums)):
            total += nums[i]
            if total - k in d:
                ret += d[total-k]
            if total in d:
                d[total] += 1
            else:
                d[total] = 1
        return ret

937 https://leetcode.com/problems/reorder-data-in-log-files/


문제 푸는시간보다 문제를 이해하는데 시간이 더 걸렸다..... 별로 좋은 문제는 아닌듯 싶다

class Solution(object):
    def reorderLogFiles(self, logs):
        digit_list = []
        alpha_list = []
        for l in logs:
            s = l.split()
            if s[1].isdigit():
                digit_list.append(s)
            else:
                alpha_list.append(s)
        return map(lambda x: ' '.join(x),sorted(alpha_list, key=lambda x:[x[1:], x[0]]) + digit_list)

54 https://leetcode.com/problems/spiral-matrix/


달팽이 배열?같은거 구현.

class Solution(object):
    def spiralOrder(self, matrix):
        ret = []
        while True:
            if not matrix:
                break
                
            if matrix:  # 왼~오
                ret += matrix.pop(0)
            if matrix and matrix[0]: # 오른쪽 위~ 오른쪽 아래
                for row in matrix:
                    ret.append(row.pop())
            if matrix:  # 맨 아래 오른쪽~ 맨 아래 왼쪽
                ret += matrix.pop()[::-1]
            if matrix and matrix[0]:
                for row in matrix[::-1]:  # 맨 아래 왼쪽~ 맨 위 왼쪽
                    ret.append(row.pop(0))
        return ret

넘사벽 답변 : https://leetcode.com/problems/spiral-matrix/discuss/20571/1-liner-in-Python-%2B-Ruby


59 https://leetcode.com/problems/spiral-matrix-ii/


달팽이 2

class Solution(object):
    def generateMatrix(self, n):
        ret = [[0 for j in xrange(n)] for i in xrange(n)]
        l,r,hi,lo = 0, n, n, 0
        num = 1
        while l < r and lo < r:
            for i in xrange(l, r):
                ret[lo][i] = num
                num += 1
            lo += 1
            
            for i in xrange(lo, hi):
                ret[i][r-1] = num
                num += 1
            r -= 1
            
            for i in xrange(r-1, l-1, -1):
                ret[hi-1][i] = num
                num += 1
            hi -= 1    
            
            for i in xrange(hi-1, lo-1, -1):
                ret[i][l] = num
                num += 1
            l += 1
        return ret