본문 바로가기

파이썬7

[Python] 문자열 덧셈 vs Join 함수 # [+] 방식PyObject *result = PyUnicode_New(new_len, maxchar); // 👈 새로운 문자열 객체 생성# join 방식result = PyUnicode_New(total_length + sep_len * (count - 1), maxchar); // 👈 한 번에 메모리 할당백준 2448번을 풀다가 일반적인 문자열 덧셈에서는 시간초과가 뜨는 것을 보고 둘을 비교하게 되었습니다. 우선 아래는 파이썬의 일반적인 문자열 누적의 예시입니다.parts=['a', 'b', 'c', '1', '2', '3']# 문자열 덧셈s = ""for part in parts: s += partprint(s)# join은 "구분자"를 기준으로 parts에 있는 문자열들을 하나의 문.. 2025. 5. 20.
[백준 16236번 | 골드3] 아기상어 파이썬 풀이 반년 정도 전에 백준 열심히 풀 때 못 풀었던 문제를 오히려 오랜만에 푸니깐 바로 풀어서 공유해봅니다.. (코드가 더러워도 이해 부탁) 문제: 아기상어가 물고기 먹으러 댕길건데 0이나 자기랑 같은 크기의 물고기는 지나갈 수 있고, 자기보다 작은 물고기만 먹을 수 있음. 물고기를 먹으러 갈 때는 가장 가까운 놈을 먹어야 하는데 같은 거리에 물고기가 많다면 제일 윗쪽, 그리고 왼쪽에 있는 물고기를 먹어야함. 자신의 크기만큼 물고기를 먹으면 성장함. 여기서 'BFS로 풀고, 탐색할 때 윗쪽, 왼쪽, 오른쪽, 아래 이 순서로 탐험하면 되겠다.'라고 생각하는 것이 일반적이라 생각한다. 나 또한 그랬고, 질문 게시판에도 많은 사람들이 같은 생각을 하고 있다. 하지만 일반적인 BFS로는 앞에서 말한 순서로 실행해도 .. 2024. 1. 20.
[백준 2252번 | 골드3] Python 풀이 문제를 보면 1 3, 3 2 이런식으로 두 개의 숫자를 주는데 왼쪽의 수가 오른쪽의 수보다 앞에 있어야 한다는 조건이 있다. 여기 이 문제가 위상정렬 문제임을 알 수 있다. (여러 가지 일이 있는데 이들 상호 간에 상호 선후 관계가 있을 때 위상정렬을 사용한다.) 위상정렬에서는 크게 두 가지 방법이 있다고 한다. 1. 진입 간선이 없는 정점을 선택하고 해당 정점과 연결되어 있는 정점 방문을 반복하면서 진출 간선을 하나씩 없애는 방법. 2. DFS(+백트래킹) 나는 2번 방식으로 풀어보았다. (시간나면 1번으로도 풀어서 수정하겠습니다.) from collections import deque import sys input = sys.stdin.readline def dfs(v): visited[v]=1 fo.. 2024. 1. 8.
*args와 **kwargs args는 arguments의 줌말로 *args가 아닌 *a로 해도됨 함수에 매개변수를 받을 때 얼마나 받을지 모르는 상황일 때 써주면 됨 def met(a, b, *args): print(a*b) for i in args: print(i) 이런식으로 사용하면 되는데 항상 다른 매개변수들보단 뒤에 있어야함. -> *args가 앞으로 가면 파이썬은 얼마까지가 args로 가야할지 모르기 때문 kwarg는 keyword argument의 약자로 딕셔너리 형태로 생각하면 된다. def gogo(**kwargs): for i, j in kwargs.items(): print(i+"는"+j+"원이다.") 2023. 12. 14.
[1922, 4386번 | 골드4, 3] 최소 신장 트리 2 1922번 네트워크 연결 문제는 이틀전에 풀었던 최소 스패닝 트리(1197번)과 똑같은 문제다. 복습 겸 풀어보았다. #B1922 최소 스패닝 트리 import sys def union_find(a, b): #루트(부모)를 찾아서 루트 번호가 더 작은 곳에 큰 루트번호를 붙임 ah = get_parent(a) bh = get_parent(b) if ah>bh: parent[ah] = bh else: parent[bh] = ah def get_parent(x): if parent[x]==x:#루트노드는 값이 루트의 번호 return x parent[x] = get_parent(parent[x]) return parent[x] def same_parent(a,b): return get_parent(a) ==.. 2023. 12. 10.
[백준 1197번 | 골드4] 최소 스패닝 트리 2년전 알고리즘 수업에서 배웠던 최소 스패닝 트리.. 코드로 구현하기는 사실상 처음. 스패닝트리는 G(V, E)그래프가 주어졌을 때 사이클을 피해 V-1개의 간선을 가지고 트리를 만들면 된다. 최소 스패닝트리는 그저 간선 가중치들의 합이 최소가 되게 하면 된다. 대표적으로 프림, 크루스칼이 있는데 난 크루스칼 방식을 택했다. 크루스칼 방식은 사이클을 만들지 않는 범위에서 최소 비용의 '간선'을 하나씩 더해가는 방식이다. 개념 자체는 어렵지 않다고 생각한다. 1. 모든 간선을 가중치 크기 순으로 정렬 2. 사이클이 생성되지 않는 선에서 간선 추가 이 두가지를 수행하면 되는데 사이클이 생성되지 않게 하려면 집합을 이용해야 한다. 그런데 아무리 생각해도 집합 하나로는 힘들고, '여러개면 어떻게 관리하지?'라는.. 2023. 12. 8.