practivceAlgorithm 570

[PYTHON] call by value? call by reference?

Passed by assignment. 즉 어떤 값을 전달하느냐에 따라 달라진다. num = 10 메모리에 저장된 10이라는 정수형 객체를 num이라는 변수가 가리킨다. 파이썬은 int, str, tuple,dictionary의 key는 immutable하고 list, dict는 mutable하다. (dict value는 마찬가지로 자료형에따라 달라짐) immutable은 call by value 즉 value만 가져와 새 메모리에 객체를 담는다는 뜻. mutable은 기존 메모리를 가르킨다는 뜻. 즉 list와 dictionary는 변수명을 바꿔서 담아준다 하더라도 하나가 변하면 모든 변수의 값이 변하게 된다. (메모리에 담긴 본체가 변하므로) 이때 list같은 경우 c = a[:] 즉 슬라이스로 재정..

[백준][Python] 13398 연속합 2

n = int(input()) lst = list(map(int, input().split())) # 원소 제외 없는 결과, 원소 하나 제외한 결과 dp = [[0, 0] for _ in range(n)] # 초깃값 : 나자신 or 나를 제외한 경우. dp[0] = [lst[0], -999999999] for i in range(1, n): # 끊고 출발하거나 이전에꺼에 덧붙히거나. dp[i][0] = max(dp[i - 1][0] + lst[i], lst[i]) # 이전까지의 합에 나를 제외한 경우.(+0이 생략된 값을 이어붙힘), 이전까지의 합에 나를 붙힌경우(생략x) # => 앞에서 -가 생략이 됐고 그게 최적이라면 dp[i-1][1]+lst[i]가 더 커야하고 아니라면 # 앞의 생략이 최적이 아니..

[백준] 틀렸을 시 원인 분석.

틀렸습니다 : output이 틀렷을 경우. testcase 초기화를 잘해줘야함. 시간초과 : 시간복잡도 제한을 못맞췄을 경우. => 보통 추상화 알고리즘을 잘못썼거나, 변하지 않는 dp값을 여러번 계산했을 경우(계산값 저장을 하지 않는 경우), 내장함수 계산값을 저장해두지 않고 반복문마다 돌리는 경우 => 파이썬에서 어떤 값이 같은지 비교할 때 == 대신 is를 사용하면 안됨. ++list를 큐 또는 덱으로 사용하면 절대 안됨. 반드시 collection.deque를 써야함. 런타임 에러 : 실행 시 나타나는 type, index접근 등 에러, 재귀함수가 있는 경우에는 재귀 깊이 제한인 sys.setrecursionlimit(100000)을 써줘야함. 메모리 초과 : sys.setrecursionlimi..

practivceAlgorithm 2021.07.10

[백준][Python] 1717 : 집합의표현

시간초과 및 메모리초과 때문에 10트정도 했다. 원소를 1개씩 가지고 있는 집합들을 합치고 어떤 원소가 이미 같은 집합으로 합쳐져있는지 확인하는 Union-Find구현문제이다. import sys input = sys.stdin.readline sys.setrecursionlimit(100000) n,m = map(int,input().split()) parent = [i for i in range(n+1)] def Union(a,b): a = Find(a) b = Find(b) if a>b: parent[a] = b else: parent[b] = a def Find(u): if parent[u]==u: return u parent[u] = Find(parent[u]) return parent[u] f..

[백준][Python] 10775: 공항

array의 P들은 같은 gi에 동시에 존재 할 수 없고 교집합도 있을 수 없다. 되도록이면 gi에 도킹하는 것이 효율적이고 불가능하면 gi-1에 도킹하는 식으로 설계한다. 도킹을 완료하면 이전 트리와 union을 통해 통합된 tree로 도킹 가능한 G를 parent node로 관리한다. import sys input = sys.stdin.readline G = int(input()) P = int(input()) parent = [i for i in range(G+1)] def find(v): if parent[v] == v: return v parent[v] = find(parent[v]) return parent[v] def union(a, b): a = find(a) b = find(b) pare..

[자료구조] 유니온-파인드(union-find)

유니온 파인드 = 디스조인트 셋(disjoint set) = 머지 파인드 셋(merge find set) 디스 조인트 셋은 서로소 집합(교집합이 공집합인 집합) 많은 상호 배타적 부분 집합들로 나눠진 원소들에 대한 정보를 저장하고 조작하는 자료구조이다. A와 B 사건 중 둘이 동시에 일어날 수 없고 둘 중 하나만 일어나야 한다. = 두 사건 중 하나의 사건이 일어날 확률이 두 사건이 각각 일어날 단순 확률의 합 과 같다. (P(A)가 일어날때 P(B)가 0이기 때문) P(A or B) = P(A) + P(B) //상호배타적이 아닌 독립적 관계는 A,B의 교집합이 없는 것은 동일하나 A,B동시에 일어나도 상관없음. 구현에는 Union, Find가 존재. 부분 집합들은 트리로 표현 할 수 있고, 파인드를 통..

백준 11005 진법변환 파이썬

system = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" #10진법이면 9 까지, 36진법이면 Z까지 표현된다 N, B = map(int, input().split()) answer = '' while N != 0: # N을 B로 나눈 나머지를 마지막칸에 채움(1의자리)(36진법이면 나머지 = 36진법중 2번째 숫자) answer += str(system[N % B]) #위치로 진법 변환 # N을 B로 나눈 몫이 N이 된다. N //= B print(answer[::-1]) 변환은 결국 dictionary or list or 문자열로 1:1 매칭. key값, index를 무엇으로 잡을것이냐부터 시작.

알고리즘 학습 대원칙

결국 알고리즘이란 생각하는 능력이며 문제를 해결하는 방법이다. 하지만 기존 인간의 논리에서 벗어나 CT를 할 필요가 있다. 문제를 기능으로 나누고 기능이 실행되는 시점을 나누고 각 기능이 동작하는 과정을 생각해본다. 1. 문제 읽고 이해하기 2. 문제를 익숙한 용어로 재정의하기 3. 어떻게 해결할지 계획 세우기 4. 계획 검증하기 5. 프로그램으로 구현하기 6. 풀이를 돌아보고 개선할 방법 찾기. -직관적이고 체계적인 접근 1. 비슷한 문제를 풀어본 적 있는가? 2. 단순한 방법에서 시작할 수 있는가? 3. 문제를 단순화 할 수 있는가? (그림그릴수있나? 수식으로 표현할 수 있나?) 4. 문제를 분해 할 수 있을까? 5. 뒤에서부터 생각해서 문제를 풀수있는가? 6. 특정형태의 답만을 고려할 수 있을까?

practivceAlgorithm 2021.06.01