반응형

 

문자열을 인자로 받습니다.

 

문자열은 [ , ], { , }, ( , )인 괄호들로만 이루어져 있습니다.

 

문자열 괄호들이 올바르게 열고 닫혀있는지를 체크하는 문제입니다.

 

저는 아래와 같이 풀었습니다.

 

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        parenthesis = {"[" : "]", "{" : "}", "(" : ")"}

        for char in s:
            if char in parenthesis.keys():
                stack.append(char)
            else:
                if not stack: return False
                if char == parenthesis.get(stack[-1]):
                    stack.pop()
                else:
                    return False
        
        if stack: return False
        return True

 

1. open 괄호가 들어오면 리스트에 담습니다.

2. close 괄호가 들어오면 list에 open 괄호가 있는지 체크합니다.

3. 있다면 list에서 마지막 open 괄호를 꺼내 close와 맞는지 확인합니다. -> 확인하기 유용하도록 위에 묶음은 dict로 선언했습니다.

4. 맞지 않으면 False를 반환합니다.

5. 마지막으로 list에 문자가 남아 있다면 False를 반환하도록 합니다.

 

감사합니다.

반응형
반응형

 

인자로 문자열을 받습니다.

 

문자열에는 R 혹은 L만 존재합니다.

 

이때, R과 L의 숫자가 같도록 substring을 하여 가장 많은 substring 갯수를 구해야 합니다.

 

이 문제는, R과 L의 숫자를 바꿀수 있는 조건이 없습니다.

그렇기 때문에, 단순히 iterate를 돌며 R과 L의 갯수가 같을 때면 그냥 substring을 한다고 생각하시면 됩니다.

 

저는 아래와 같이 코드를 짰습니다.

class Solution:
    def balancedStringSplit(self, s: str) -> int:
        r_cnt = 0
        l_cnt = 0
        res = 0

        for i in s:
            if i == "L":
                l_cnt += 1
            else:
                r_cnt += 1

            if l_cnt == r_cnt:
                res += 1
                l_cnt = 0
                r_cnt = 0
        return res

 

감사합니다.

반응형

'Algorithm > greedy' 카테고리의 다른 글

leetcode - Last Stone Weight  (0) 2020.03.12
leetcode - Two City Scheduling  (0) 2020.03.12
leetcode - Maximize Sum Of Array After K Negations  (0) 2020.03.11
leetcode - Walking Robot Simulation  (2) 2020.03.10
leetcode - Lemonade Change  (0) 2020.03.05
반응형

 

List<int>를 인자로 받습니다.

이것은 각 돌멩이들의 무게입니다.

 

돌멩이들은 서로 부딪혀 작은 돌멩이로 만들 수 있습니다.

 

만약 7 돌멩이와 8돌멩이가 부딪히면 1 돌멩이로 되고, 7 돌멩이와 7 돌멩이가 부딪히면 두개는 사라집니다.

 

이런 규칙에서, 남은 돌멩이의 최소 무게를 구해야 합니다.

 

논리적으로는 돌멩이 무게가 큰것들끼리 서로 부딪히게 해서 무게를 줄여나가야 합니다.

그렇기 때문에, 저는 아래와 같이 풀었습니다.

 

class Solution:
    def lastStoneWeight(self, stones: List[int]) -> int:
        sorted_stones = sorted(stones, reverse=True)
        for i in range(len(stones) -1):
            if sorted_stones[0] == sorted_stones[1]:
                sorted_stones[0] = 0
                sorted_stones[1] = 0
            else:
                sorted_stones[1] = sorted_stones[0] - sorted_stones[1]
                sorted_stones[0] = 0
            sorted_stones = sorted(sorted_stones, reverse=True)
        return sum(sorted_stones)

 

 

부딪히는 횟수는 최대 돌멩이 갯수 -1 입니다.
이유로는, 최소가 되려면 어찌됐든 한번씩은 부딪혀야 하기 때문입니다.

 

 

  • 무게가 큰 순으로 정렬시킵니다.
  • 정렬했기 때문에 첫번째와 두번째만 비교합니다.
    • 무게가 같다면 둘다 사라지기 때문에 첫번째, 두번째 자리의 값을 0으로 넣습니다.
    • 무게가 같지 않다면, 첫번째자리에는 0, 두번째자리에는 그 차이값을 넣습니다.
  • 무게가 큰것들끼리만 부딪혀야 최소가 나오기 때문에, 마지막으로 다시 정렬시켜 반복되도록 합니다.

감사합니다.

반응형

+ Recent posts