본문 바로가기

전체 글47

[16236] 아기 상어 bfs로 풀었다. (최소거리로 가야하기 때문) 다만 갈 수 있는 것 중에 제일 상단, 아니면 제일 좌측에 있는 걸 찾아야 한다. 단순 bfs로는 해당 조건에 만족하는 물고기가 바로 나온다는 보장이 없어서배열에 해당 거리를 지나서 먹을 수 있는 물고기를 담아서sort한 뒤에 찾는 방식으로 찾았다.'''16236 아기상어'''import sysfrom collections import dequedef bfs(N, sea, pos, size): delta_x = [0, -1, 0, 1] delta_y = [-1, 0, 1, 0] my_queue = deque() visited = dict() caneat = list() current_depth = -1 my_queue.a.. 2025. 9. 2.
[7562] 나이트의 이동 나이트가 갈 수 있는 곳의 delta들을 활용해서단순 bfs를 돌립니다. 최단 경로를 찾아야 하기 때문에 dfs보다는 bfs가 어울립니다.또한 경로의 길이를 뜻하는 depth가 같이 queue에 저장될 필요가 있습니다.import sysfrom collections import dequeT = int(sys.stdin.readline().strip()) def moveKnight(N, pos, des): delta_x = [-2, -2, -1, -1, 1, 1, 2, 2] delta_y = [-1, 1, -2, 2, -2, 2, -1, 1] queue = deque() visited = set() queue.append(tuple([pos[0], pos[1], 0])) w.. 2025. 8. 28.
[2206] 벽 부수고 이동하기 일단 최소경로를 찾아야 하기 때문에 bfs 문제라고 보았다. 이 경로가 벽을 뚫고 왔는지 저장할 isDrilled 변수를 선언해서벽을 뚫고 왔으면 (isDrilled 가 1이면) 벽을 생각하지 않고 가고벽을 뚫지 않고 왔으면 (isDrilled 가 0이면) 벽도 생각하고 간다. 기초적인 알고리즘은 제대로 짰는데 시간에러, 메모리에러가 나서 고민을 많이 했는데, 무슨 문제가 있었나면..queue에 저장된 set의 얕은 복사 문제처음에는 queue에 visited set을 넣어서 연산했는데queue에서 pop한 visited set을 다시 append해주었을 때, 모든 queue의 set이 동일한 주소를 가지게 되어 얕은 복사 문제가 발생했다. queue에 append 해줄 때는 set.copy()를 써서 .. 2025. 8. 28.
[프로젝트 회고] Lostark-simulator: MSA / API-Gateway 슬슬 프로젝트의 윤곽이 잡혀가는 요즘, 프로젝트에 적용한 아키텍처에 대한 경험을 회고하고자 합니다.특히 마이크로서비스 아키텍처(MSA) 와 API 게이트웨이 에 대해 이야기하겠습니다.1. Monolithic vs Mircoservice처음 프로젝트를 시작할 때, 프로젝트의 전체적인 아키텍처를 선택해야만 합니다. 어떤 선택지가 있었을까요..?모놀리식 아키텍처 - Monolithic Architecture전통적인 방식으로, 애플리케이션의 모든 기능이 하나의 거대한 서비스 안에 통합된 구조입니다. 개발 초기에는 단순하고 빠르게 개발할 수 있다는 장점이 있지만, 프로젝트의 규모가 커질수록 다음과 같은 단점이 나타납니다.낮은 유연성: 작은 수정 사항이 전체 애플리케이션의 재배포를 요구합니다.기술 스택의 종속성: .. 2025. 8. 27.
[11724] 연결 요소의 개수 더 탐색할 노드가 있는지 확인하기 위해빈 visited 가 아닌 → 꽉 차있는 tovisit set으로 바꿨다. 기본적으로 tovisit에서 pop한 값을 togo에 넣어서 dfs 돌린다. tovisited의 key들은 간선이 있는 node들이므로간선이 없는 node는if N > len(tovisit): connected_component += N - len(tovisit)으로 해결한다.import sysN, M = map(int,sys.stdin.readline().split())graph = dict()for m in range(M): u, v = map(int,sys.stdin.readline().split()) if graph.get(u)==None: graph[u] = [.. 2025. 8. 26.
[2346] 풍선 터뜨리기 queue를 사용해서 무조건 0번 index를 pop하고balloon에 적혀져 있는 만큼 뒤나 앞에서 앞이나 뒤로 balloon을 하나씩 옮겨줘서 0번 index를 pop해도 되도록 한다. 음수값과 양수값 무엇을 만나도 0번 index가 다음 balloon이 되도록 range를 조절해야 한다.import sysfrom collections import dequeN = int(sys.stdin.readline().strip())balloon = deque(zip(range(1, N+1), list(map(int, sys.stdin.readline().split()))))# print(balloon)lst = list()while balloon: b = balloon.popleft() # prin.. 2025. 8. 26.
CRA vs Vite 이번 프로젝트를 시작하면서 frontend webpage를 만들 일이 생겼는데 아마도 예전에 인터넷강의에서 학습했던 CRA - Create React App 을 선택했었다. 어찌저찌 프로젝트가 진행되고 있었는데server에 배포하고 docker로 build를 날려보니 frontend service의 build가 너무너무 오래걸렸다 방법을 찾다보니 vite라는 대체재를 만나게 됬다vite로 migration을 하니까 build속도가 거진 1/10이 되더라.. 일단 CRA와 Vite가 뭘까? CRA(CreateReactApp) 과 Vite는 Build Toolbuild tool이 뭘까? 웹페이지를 받기 위해서는 server가 우리가 짠 code를 보내줘야 하는데조금이라도 웹페이지의 코드가 짧고 효율적이.. 2025. 8. 19.
[14510] 나무 높이 나무에 물을 주는데홀수번째 날은 1만큼 크고짝수번째 날은 2만큼 큰다 모든 나무가 나무들의 최댓값만큼 자라야 한다 나무가 더 자라야할 길이에서 2를 나눈 몫과 나머지를 구해서2만큼 자라야 할 부분이랑 1만큼 자라야 할 부분으로 나눠서 계산했다 일단 짝수번째 날은 2만큼 자라야 할 부분만 신경쓰면 된다 홀수번째 날에는 1만큼 자라야 할 부분을 먼저 신경써야 한다2만큼 자랄땐 딱 1이 필요한 경우를 해결하지 못하기 때문이다 다만 1만큼 자라야 할 부분 다 쓰고 2만큼 자라야할 부분이 잔뜩 남아있으면1만큼 자랄때 2만큼 자랄 부분을 쪼개서 1만큼 두번 자라는걸로 생각할 수 있다 다만 이 작업은 홀수번째 날을 놀게 될 때 쓰는거지 기본적으로 2만큼 한번 자랄걸 1만큼 두번 자라는 것이므로두배의 시간이 든다 따라.. 2025. 8. 19.
REST, gRPC, Kafka REST, gRPC, Kafka현재 아키텍처 분석MSA 구조: api-gateway, data-service, simulator-service로 서비스가 분리되어 있습니다.통신 방식: 서비스 간 통신은 REST API (HTTP/JSON)를 사용하고 있을 것으로 보입니다. 클라이언트(React)와 api-gateway 간의 통신도 마찬가지입니다.gRPC 도입: 서비스 간 통신 고도화gRPC는 주로 서비스 간의 동기적(Synchronous) 호출을 더 효율적으로 만들기 위해 REST API를 대체하는 기술입니다.적용 시나리오:api-gateway ↔ data-serviceapi-gateway ↔ simulator-servicesimulator-service ↔ data-service장점 (Pros)성능 향.. 2025. 8. 12.