목록항해 (48)
거누의 개발노트
문제 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다. N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로..
HDD, SSD를 설명하기 전에!! 컴퓨터에서 정보를 저장하는 메모리는 크게 휘발성 메모리와 비 휘발성 메모리로 분류를 합니다. 휘발성 메모리? 비 휘발성 메모리? 휘발성 메모리 전원이 꺼지면 저장된 데이터가 사라진다. 대표적으로 RAM 비 휘발성 메모리 전원이 꺼져도 저장된 데이터가 사라지지 않는다. → 보조기억장치(HDD, SSD) 그래서? HDD(Hard Disk Drive) 하드 디스크 드라이브(HDD)는 비 휘발성 기억장치로, 자기장의 원리로 정보를 저장합니다. 금속 케이스 안에 원판이 있습니다. 이 원판 위에 정보를 기록하는 것이기 때문에, 물리적인 손상을 입으면 정보도 손상됩니다. 원판은 흔들려도 손상 될 수 있다고 함, 그래서 금속 케이스에 넣어둔거임! SSD(Solid State Driv..
문제 스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다. 1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라. 입력1 8 4 3 6 8 7 5 2 1 출력1 + + +..
문제 중복된 문자를 제외하고 사전식 순서로 나열하라. 입력 s1 = 'bcabc' s2 = 'cbacdcbc' 출력 r1 = 'abc' r2 = 'acdb' 작성한 코드 def removeDuplicateLetters(s: str) -> str: counter = collections.Counter(s) stack = [] seen = set() for char in s: counter[char] -= 1 if char in seen: continue # 1. stack 안에 값이 존재하는지 # 2. char 값보다 스택 top에 있는 값이 크면 # 3. 스탭 top의 숫자가 0보다 크면 while(stack and char 0): # ..
문제 괄호로 된 입력값이 올바른지 판별하라. 입력 '()[]{}' 출력 True 스택으로 풀이 def isValid(s: str) -> bool: if len(s) % 2 != 0: return False default = { ')':'(', ']':'[', '}':'{' } open = '({[' stack = [] for i in s: if i in opedn: stack.append(i) else: if not stack: return False if default.get(i) != stack.pop(): return False return not stack 리코드에서 확인 https://leetcode.com/problems/valid-parentheses/ Valid Parentheses - L..
문제 연결 리스트를 뒤집어라 입력 1->2->3->4->5->NULL 출력 5->4->3->2->1->NULL 작성한 코드 def reverseList(head): node, prev = head, None while node: # 1 2 3 next = node.next # 2 3 node.next = prev # Null 1 prev = node # 1 2 node = next # 2 3 return prev 책에 있는 코드 def reverseList(self, head) -> ListNode: # SOL 1) Recursive Way def reversef(node, prev=None): if not node: # node가 비어있는 경우 return prev next, node.next = n..
문제 정렬되어 있는 두 연결 리스트를 합쳐라 입력 1->2->4 1->3->4 출력 1->1->2->3->4->4 책에 있는 코드 class solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if (not l1) or (l2 and l1.val > l2.val): l1, l2 = l2, l1 if l1: l1.next = self.mergeTwoLists(l1.next, l2) return l1 찾은 코드 # 이해하기 쉬운 풀이 def mergeTwoLists(list1, list2): if (list1 == None and list2 == None): return None head = result = ListNode()..
문제 n개의 페어를 이용한 min(a, b)의 합으로 만들 수 있는 가장 큰 수를 출력하라. 입력 [1, 4, 3, 2] 출력 4 설명 n은 2가 된다. ( 2개씩 묶어서 한쌍! ), 최대합은 min(1, 2) + min(3,4) = 4 작성한 코드 def array_pair_sum(nums: List[int]) -> int: sum = 0 nums.sort() for i, n in enumerate(nums): # 인덱스가 짝수 번째인 값의 계산 if i % 2 == 0: sum += n return sum 회고 아직 문법이나 어떤 함수를 써야할지 잘 몰라서 계속 검색하면서 풀었다. 그래도 이문제는 쉽게 이해가 되었던 것 같다. https://programmers.co.kr/learn/challeng..