[Python] 손코딩 케이스 모음(3)
손코딩에 빈출하는 사례들을 정리
nums = [2,2,1] 처럼 주어질때 유일한 숫자를 리턴하라
# hashmap 이용 - 시간복잡도 O(N) 공간복잡도 O(N)
# nums = [4,1,2,1,2]
my_dict = {}
for n in nums:
if n in my_dict:
my_dict[n] += 1
else:
my_dict[n] = 1
answer = [k for k,v in my_dict.items() if v == 1]
answer[0] # 4
# XOR 사용
answer = 0
for n in nums:
answer ^= n
nums = [-2,1,-3,4,-1,2,1,-5,4] 처럼 주어질 때 합이 최대인 subarray를 리턴하라
max_v = nums[0]
a_sum = [nums[0]]
for i in range(len(nums)):
hubo = max(nums[i], a_sum[-1]+nums[i])
a_sum.append(hubo)
if hubo > max_v:
max_v = hubo
print(max_v)
sorted 된 array가 주어졌을 때 target_value가 있는 인덱스 혹은 들어갈 인덱스를 리턴하라
def find_index(nums, target):
low = 0
high = len(nums)-1
while low <= high:
mid = (low + high) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
high = mid-1
else:
low = mid+1
return low
# nums = [1,3,7]
# target = 8 --> low = 3, high = 2
# target = 6 --> low = 2, high = 1
# 둘 다 low 위치
숫자 집합 candidates를 조합하여 합이 target이 되는 원소를 나열하라. 각 원소는 중복으로 나열 가능하다.
combinations = [2,3,6,7]
target = 7
answer = []
def combination(cum_sum, path, start):
if cum_sum >= target:
if cum_sum == target:
answer.append(path)
return
for i in range(start, len(candidates)):
combination(cum_sum + candidates[i], path + [candidates[i]], i)
서로 다른 정수를 입력 받아 가능한 모든 순열을 리턴하라 - 순열
arr = [1, 2, 3]
n = len(arr)
visited = [False]*n
answer = []
def permutation(depth, result):
if depth == n:
# 리프 노드일때 결과 추가
answer.append(result)
return
for i in range(len(my_list)):
if not visited[i]:
visited[i] = True
permutation(depth+1, result+[my_list[i]])
visited[i] = False
전체 수 n을 입력받아 k개의 조합을 리턴하라 - 조합
# 조합
# 전체 수 n을 입력받아 k개의 조합을 리턴하라
n = 4
k = 2
arr = [x for x in range(1,n+1)]
visited = [False]*n
answer = []
visited = [False]*n
def combination(depth, result, start):
if depth == k:
answer.append(result)
return
for i in range(start, len(my_list)+1):
if not visited[i]:
visited[i] = True
combination(depth+1, result+[arr[i]], i)
visited[i] = False
combination(0,[],0)
print(answer) # [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]