정답) class Solution: def plusOne(self, digits: List[int]) -> List[int]: # 1의 자리에 1을 더함 digits[-1] += 1 # digits의 0번째 정수 제외 만약 i번째 정수가 10이면 # 0으로 바꿔주고 [i-1]에 더함 for i in range(len(digits)-1, 0, -1): if digits[i] == 10: digits[i] = 0 digits[i-1] += 1 # 만약 0번째 정수가 10이면 0으로 바꾸고 # 0번째 정수에 1을 새롭게 추가 if digits[0] == 10: digits[0] = 0 digits.insert(0, 1) return digits 문제) 주어진 리스트 digits는 정수가 자릿값에 따라 놓인 리..
정답) class Solution: def strStr(self, haystack: str, needle: str) -> int: # needle의 길이 만큼의 문자열을 haystack에서 검색 for i in range(len(haystack) - len(needle) + 1): # 그 문자열이 needle과 같다면 if haystack[i:i+len(needle)] == needle: return i return -1 문제) 문제출처 주어진 문자열 haystack과 needle을 사용하여, haystack에서 needle이 처음 발견되는 index를 리턴하거나 haystack에 needle이 존재하지 않는다면 -1을 리턴하시오. 예시 1) haystack = "sadbutsad", needle = "..
정답) class Solution: def removeDuplicates(self, nums: List[int]) -> int: # 딕셔너리의 key에 유니크한 정수를 저장 numDic = {nums[0]:1} k = 1 for i in range(1, len(nums)): # 만약 새로운 유니크한 정수가 발견되면 if nums[i] not in numDic: # 딕셔너리에 추가 numDic[nums[i]] = 1 # k에 1 더함 k += 1 # nums의 올바른 위치에 새로운 유니크한 정수 옮김 nums[k-1] = nums[i] return k 문제) 문제출처 주어진 정수 배열 nums는 오름차순으로 정렬되어 있습니다. 반복되는 정수를 제거하여 그 정수가 한 번만 나오도록 하시오. 원래 nums에 ..
정답) class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: # 마지막에 병합된 리스트의 헤드를 찾기 위해 저장해 놓은 노드 header = ListNode(-1) # 병합할 리스트를 선형하기 위한 노드 start = ListNode(None) header.next = start # 두 리스트 모두 검색해야될 노드가 남아있을 때 while list1 and list2: if list2.val > list1.val: start.next = ListNode(list1.val) start = start.next list1 = list1.next else: ..
정답) class Solution: def isValid(self, s: str) -> bool: stack = [] closeToOpen = {")" : "(", "]" : "[", "}" : "{"} for parenthesis in s: # 만약 열린 괄호라면 스택에 추가 if parenthesis not in closeToOpen: stack.append(parenthesis) # 만약 닫힌 괄호라면 else: # 만약 스택이 비어있지 않고 # 스택의 top이 닫힌 괄호와 상응하는 열린 괄호라면 if stack and stack[-1] == closeToOpen[parenthesis]: # 스택에서 제거 stack.pop() else: return False # 스택이 비어있다면 True, 스택에..
정답) class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: # 주어진 문자열 리스트를 길이 순서로 정렬. strs.sort(key=len) # 가장 작은 문자열이 기준. compare = strs[0] for i in range(1, len(strs)): for j in range(len(compare)): # 문자들을 비교 중 맞지 않는 문자가 발견되면 if compare[j] != strs[i][j]: # 비교 변수를 맞는 부분까지만 저장 compare = compare[0:j] # j for문 끝내기 break return compare 문제) 문제링크 주어진 문자열 리스트에서 가장 긴 공통 접두사(prefix)를 찾는 함수..
정답) class Solution: def romanToInt(self, s: str) -> int: # 딕셔너리에 각 문자에 상응하는 정수를 저장. romanDic = { 'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000 } # 최종으로 리턴할 변수에 0번째 변환된 정수를 저장. res = romanDic[s[0]] for i in range(1, len(s)): # 선형할때마다 변환된 정수를 더해줌. res += romanDic[s[i]] # 하지만 특수상황이 발견되면 필요한만큼의 값을 다시 뺌. if s[i] in ['V', 'X', 'L', 'C', 'D', 'M']: if romanDic[s[i]] > romanDic[s[i-1]]: res -..
정답) class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: # 딕셔너리를 사용해 필요한 정수와 그 인덱스 값을 저장. # 첨에는 배열의 0번째 정수와 그 인덱스 0을 저장. numDic = {nums[0] : 0} # 1부터 배열의 끝까지 선형검색한다 for i in range(1, len(nums)): # 선형검색하면서 짝을 이룰 정수를 구한다 pair = target - nums[i] # 만약 짝이 존재한다면 if pair in numDic: # 그 짝의 인덱스와 선형검색하던 정수의 인덱스를 리턴. return numDic[pair], i # 짝이 존재하지 않는다면 딕셔너리에 현재 정수와 인덱스를 저장. numDic..