defsolution(n, lost, reserve): tmp = lost.copy() for i in lost: if i in reserve: tmp.remove(i) reserve.remove(i)
elif i - 1in reserve: tmp.remove(i) reserve.remove(i-1) elif i + 1in reserve and i + 1notin lost: tmp.remove(i) reserve.remove(i+1) return n - len(tmp)
tmp = lost.copy() 초기에 tmp = lost로 리스트 자체를 복사했더니 tmp.remove(value)를 해버리니 lost의 값도 삭제가 되는 문제가 발생했다.
단순복사 vs 얕은복사 vs 깊은복사
단순 복사
단순 복사는 완전히 동일한 객체를 복사합니다.
1 2 3 4 5 6 7 8
a = [1, [2, 3, 4]] b = a b[0] = 100 b[1][0] = 100 print(a) # [100, [100, 3, 4]] print(b) # [100, [100, 3, 4]]
얕은 복사(shallow copy)
복합개체 ([1, [2, 3, 4]])만 새로운 객체로 복사하고 내부객체 ([2, 3, 4])는 동일한 객체를 참조합니다.
defsolution(number, k): answer = '' stack='' while k!=0: if number!='': stack+=number[0] number=number[1:] len_stack=len(stack) for i inreversed(range(len_stack)): if number=='': break if number[0]>stack[i]: stack=stack[:i] k-=1 if k==0: break else: break else: stack=stack[:-1] k-=1 answer=stack+number return answer
# 모두 A로 이루어진 이름이라면 움직일 필요 X if name == "A" * len(name): pass else: # 오른쪽으로 갈지 왼쪽으로 갈지 나타내주는 지표 l_index = 0#1이면 왼쪽방향
for i inrange(len(name)):
if i == 0: idx = str_Alpabet.index(name[i])
if idx < len(str_Alpabet) / 2: answer += idx # z에 더 가까울 경우 else: idx = len(str_Alpabet) - idx answer += idx
if name[i-1] == name[i+1]: answer += 1 l_index = 0 elif name[i+1] == 'A': # 왼쪽으로 커서 이동 answer += 1 l_index = 1 else: # 오른쪽으로 커서 이동 answer += 1 l_index = 1
if idx < len(str_Alpabet) / 2: answer += idx # z에 더 가까울 경우 else: idx = len(str_Alpabet) - idx answer += idx
# 커서 이동 if i == len(name) -1and name[i+1] == "A": # 1. 마지막 요소가 A일 경우 옮기지 않아도 완성 break elif i == len(name) -1: # 마지막요소일 경우 + 1 하지 않는다. break else: # 오른쪽으로 커서 1 answer += 1
# 왼쪽으로 커서 이동 if i == len(name) -2and name[len(name)-i -1] == "A": break elif i == len(name) - 1: # 마지막 요소일 경우 + 1 안한다. break else: # 왼쪽 으로 커서 이동 answer += 1
return answer
테스트 케이스 10, 11 통과 X
name = "AZAAAAAAAZZ" 일 경우 오른쪽으로 처리 후 왼쪽으로 돌아가 처리를 하는 것이 효율적이다.
deffind_root(v): if parent[v] != v: parent[v] = find_root(parent[v]) return parent[v]
defunion(r1, r2): if r1 != r2: if rank[r1] > rank[r2]: parent[r2] = r1 else: parent[r1] = r2 if rank[r1] == rank[r2]: rank[r2] += 1
defsolution(n, costs): for i inrange(n): make_set(i) s = 0 costs = sorted(costs, key=lambda x: x[2]) for j in costs: v, u, w = j r1 = find_root(v) r2 = find_root(u) if r1 != r2: union(r1, r2) s += w return s
2차 답안은 Union의 개념을 코드로 적용하기 힘들어 Kruskal 알고리즘 코드를 참고해서 작성했다..
defsolution(n, costs): answer = 0 edges = sorted([(x[2], x[0], x[1]) for x in costs]) parents = [i for i inrange(n)] bridges = 0 for w, f, t in edges: if ancestor(f, parents) != ancestor(t, parents): answer += w parents[ancestor(f, parents)] = t bridges += 1 if bridges == n - 1: break return answer