목록분류 전체보기 (189)
거누의 개발노트
빌드? 프로그래머가 작성한 소스 코드를 실행할 수 있는 독립적인 형태(.war, .jar)로 변환하는 과정 및 결과를 말한다. 변환하는 과정에는 컴파일 과정도 포함이 된다. 예를 들어 개발자가 이클립스나 인텔리제이와 같은 IDE로 java코드를 작성하면 개발자는 '실행'버튼을 눌러서 코드의 결과물을 볼 수 있다. 그런데 개발자가 아닌 사용자가 코드의 결과물을 보려면? 사용자가 자바를 설치하고 IDE를 설치하고 해당 코드를 가져와서 실행을 눌러야 하는가? 아니다, 사용자는 어떠한 형태로든 빌드 된 결과물(.war, .jar 등)을 실행만 하면 된다. 그리고 이러한 빌드 결과물을 실제 서버에 업로드하는 것을 배포라고 한다. JAR? .jar 확장자 파일에는 Class와 같은 Java 리소스와 속성 파일, 라..

글을 쓰려면 언어를 알아야 한다. 프로그램을 작성하려면 프로그래밍 언어를 알아야 한다. 프로그래밍 언어의 발전 - 간략 설명 1970년대 시스템 프로그램을 만들 용도로, 어셈블러, 컴파일러, 텍스트 편집기 같은 프로그래머 도구와 운영체제까지 작성할 목적으로 사용할 언어들이 만들어졌다. 그 중 C언어가 가장 성공적이었다고 함 C언어는 1973년 벨 연구소에서 일하던 데니스 리치가 개발 아직도 폭넓게 이용하며, 가장인기있는 언어 중 하나이다. C언어는 개발 이후 미미하게 변경돼서 오늘날의 C언어 프로그램은 30~40년 전의 코드와 비슷하다. 1980년대 규모가 매우 큰 프로그램의 복잡성 관리를 위해 설계된 언어들이 개발되었다. 대표적으로 C++ 이 있다. C++은 비야네 스트롭스트룹?이 개발 했는데, 이 사..
DP DP, 즉 다이나믹 프로그래밍(또는 동적 계획법)은 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것으로 특정한 알고리즘이 아닌 하나의 문제해결 패러다임으로 볼 수 있다. 피보나치 수열로 예를 들어 본다면, def fibo(n): if n in [1, 2]: return 1 return fibo(n-1) + fibo(n-2) assert fibo(10) == 55 assert fibo(100) == 354224848179261915075 # 안끝난다. 이런식으로 재귀 함수로 푼다면 100번째 값을 찾을 때는 fibo(1)번째, fibo(2)번째를 찾았던 n번째수를 계속해서 찾아나갈 것이다. 그렇지만 찾아 나간 결과를 저장..

문제 설명 위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다. 삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요. 제한사항 삼각형의 높이는 1 이상 500 이하입니다. 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니 풀이 def solution(triangle): for i in range(1, len(triangle)): for j in range(len(triangle[i])..
플로이드 워셜(Floyd-Warshall) 알고리즘이란? 모든 최단 경로를 구하는 알고리즘 다익스트라는 하나의 정점에서 다른 모든 정점까지의 최단 거리를 구하는 알고리즘(S.S.S.P - Single Source Shortest Path) 이었다면, 플로이드-워셜 알고리즘은 한 번 실행하여 모든 노드 간 최단 경로를 구할 수 있습니다. 플로이드-워셜 알고리즘은 다익스트라 알고리즘과는 다르게 음의 간선도 사용할 수 있다. 파이썬 코드 INF = int(1e9) def floyd_warshall(graph): N = len(graph) dist = [[INF] * (N + 1) for _ in range(N + 1)] for idx in range(1, N + 1): dist[idx][idx] = 0 for..
문제 V개의 마을와 E개의 도로로 구성되어 있는 도시가 있다. 도로는 마을과 마을 사이에 놓여 있으며, 일방 통행 도로이다. 마을에는 편의상 1번부터 V번까지 번호가 매겨져 있다고 하자. 당신은 도로를 따라 운동을 하기 위한 경로를 찾으려고 한다. 운동을 한 후에는 다시 시작점으로 돌아오는 것이 좋기 때문에, 우리는 사이클을 찾기를 원한다. 단, 당신은 운동을 매우 귀찮아하므로, 사이클을 이루는 도로의 길이의 합이 최소가 되도록 찾으려고 한다. 도로의 정보가 주어졌을 때, 도로의 길이의 합이 가장 작은 사이클을 찾는 프로그램을 작성하시오. 두 마을을 왕복하는 경우도 사이클에 포함됨에 주의한다. 입력 첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) ..
문제 방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다. 입력 방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다. 출력 첫째 줄부터 V개의 줄에 걸쳐, i번째 줄에 i번 정점으로의 최단 경로의 경로값을 출력한다. 시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다. 예제 입력 5 6 1 5 1 1 1 2 2 1 3 3 2 3 4 2 4 5 3 4 6 예제 출력 0 2 3 7 INF 작성한 코드 import heapq import sys INF = int(1e9) de..
문제 어떤 나라에는 N개의 도시가 있다. 그리고 각 도시는 보내고자 하는 메시지가 있는 경우, 다른 도시로 전보를 보내서다른 도시로 해당 메시지를 전송할 수 있다. 하지만 X라는 도시에서 Y라는 도시로 전보를 보내고자 한다면,도시 X에서 Y로 향하는 통로가 설치되어 있어야 한다. 예를 들어 X에서 Y로 향하는 통로는 있지만, Y에서 X로 향하는통로가 없다면 Y는 X로 메시지를 보낼 수 없다. 또한 통로를 거쳐 메시지를 보낼 때는 일정 시간이 소요된다.어느 날 C라는 도시에서 위급 상황이 발생했다. 그래서 최대한 많은 도시로 메시지를 보내고자 한다. 메시지는 도시 C에서 출발하여 각 도시 사이에 설치된 통로를 거쳐, 최대한 많이 퍼져나갈 것이다. 각 도시의 번호와 통로가 설치되어 있는 정보가 주어졌을 때,..