[LeetCode] 649 - Dota2 Senate
·
Algorithm
문제 문제 제목이 익숙한 게임이어서 선택했는데, 문제의 길이가 너무 길어서 해석에 많은 시간이 걸렸다. 문제를 해석해보자면 도타2 세계관에서 펼쳐지는 Radiant 와 Dire 진영간의 게임을 진행하는 코드를 구현하는 것이다. R과 D로 이루어진 문자열 senate가 주어짐 ex) RDD, RDRD 각 문자는 각 진영의 의원을 뜻한다 → R : Radiant , D : Dire라운드 방식으로 진행, 앞에서부터 차례대로 행동라운드마다 다른 의원 한명을 투표하지 못하게 만든다자기 진영의 의원만 남았으면 즉시 승리 선언위의 순서로 진행되는데, 라운드는 계속 반복되고, 끝까지 가면 처음으로 되돌아가며, 모든 의원이 자기 진영이 이기도록 최적의 전략을 사용한다고 할 때, 이기는 진영을 반환하는 문제이다. 풀이 ..
[LeetCode] 155 - Min Stack
·
Algorithm
문제 스택을 구현하는 간단한 문제이다. 스택만을 구현하는 것은 간단하지만 스택에 들어있는 요소들의 최소값을 반환하는 메소드가 추가되어있어 이를 추가하는게 관건인 문제이다. 풀이(1)class MinStack: def __init__(self): self.stack = [] #스택의 기능을 할 리스트 선언 def push(self, val: int) -> None: self.stack.append(val) #append() 이용하여 스택에 추가 def pop(self) -> None: if self.stack : #스택에 요소가 있어야 pop이 가능하므로 return self.stack.pop() def top(self..
[LeetCode] 141 - Linked List Cycle
·
Algorithm
문제 링크드 리스트(Linked List)에서 사이클이 있는지 확인하는 문제인데, tail 노드가 링크드 리스트 어딘가에 연결되어 있으면(이미 지나온 노드를 다시 만나면) True를 반환하고, 그렇지 않다면 False를 반환한다. 위의 문제에 example에 있는 그림에서는 마지막 노드인 -4에서 2로 돌아오므로, 사이클이 있어서 True를 반환한다. 풀이 먼저 방문한적이 있는 노드를 기록하기 위해서 set()함수를 이용해 집합 자료형으로 정의-> 링크드 리스트를 노드 하나씩 나아가며 집합과 비교해 이미 방문했던 적이 있는 노드인지 확인-> 이미 visit set에 있는 노드를 만나게 되면, 사이클이 있는 것이므로 True 반환-> 끝까지 None이면(while 문이 종료되었을 때)는 사이클이 없는 것이..
[LeetCode] 387 - First Unique Character in a String
·
Algorithm
문제 s라는 문자열이 주어졌을때, 한번만 나오는 문자 중 제일 왼쪽에 있는(첫번째의) 문자의 인덱스를 반환하며, 한 번만 나오는 문자가 없는 경우에는 -1을 반환하는 문제이다. 풀이 문자열을 받아서 문자 하나씩 반복하여 매칭되는 문자가 있을 때에는 문자의 수를 카운팅하게 하였고, 새로운 문자가 추가될 경우에는 1로 초기화 하여 키-값 방식의 딕셔너리로 만들었고, 이후 첫 번째로 한번만 나오는 문자의 인덱스를 반환하기 위해서 while문을 활용하여 cnt의 값이 1일 경우에 return문으로 while문을 빠져나오게 하였다.class Solution: def firstUniqChar(self, s: str) -> int: cnt = {} # 문자당 count를 딕셔너리로 저장, cnt..
[LeetCode] 496 - Next Greater Element 1
·
Algorithm
문제 위 문제는 nums1 리스트와 nums2 배열이 주어지는데, nums1의 원소는 모두 nums2에 들어있고, nums1의 각 원소에 대해 nums2 안에서의 다음 큰 수를 찾는 문제이다. 조건nums1에 있는 모든 숫자는 nums2에 있고(포함), nums1 과 nums2에 있는 숫자는 모두 고유하다(중복 X) 풀이(1)처음 문제를 보고 생각해보았을때는 for문을 이중으로 돌리면 되지 않을까 ? 하고 먼저 풀어보았다. nums1의 각 숫자에 대해 nums2에서 그 숫자의 위치를 찾고 그 위치에서부터 뒤로 가면서 처음으로 나오는 더 큰수를 찾는 코드를 사용하였다. class Solution: def nextGreaterElement(self, nums1: List[int], nums2: Li..
[LeetCode] 682 - Baseball Game
·
Algorithm
문제 문제를 보았을 때 이게 왜 야구 게임인지 ..? 싶었지만 풀어보도록 하자. 설명을 해석하자면 ["5", "2", "C", "D", "+"]이런 식으로 문자로 된 리스트가 들어오는데, 처음에는 기록이 비어있다. 리스트에 들어있는 요소에 따라 순서대로 연산을 수행하는데, 정수 x : 정수 x를 추가한다.+ : 이전 두 점수의 합을 추가한다.D : 이전 점수의 2배를 추가한다.C : 이전 점수를 삭제한다.위의 연산을 수행하고, 모든 점수의 합을 반환하는 함수를 정의하면 되는 문제이다. 풀이 모든 연산이 최근 점수를 기준으로 동작하기 때문에, LIFO 구조인 Stack을 사용하는 것이 적절하다고 생각했고, 새로운 res 라는 스택을 만들어서 점수를 저장하면서 연산을 이어나갔고, 마지막엔 저장된 스택의 ..