나동빈 100

[파이썬] 구간 합(Interval Sum)

[구간 합 문제란 ?] 연속적으로 나열된 N개의 수가 있을 때 특정 구간의 모든 수를 합한 값을 계산하는 문제이다. 예를 들어 5개의 데이터로 구성된 수열 {10, 20, 30, 40, 50}이 있다고 가정하고, 두번째 수부터 네번째 수까지의 합은 20 + 30 + 40 = 90 이다. 구간 합 문제를 빠르게 계산하기 위해 접두사 합(Prefix Sum)을 활용한 알고리즘을 사용할 수 있다. [접두사 합이란 ?] 배열의 맨 앞부터 특정 위치까지의 합을 미리 구해 놓은 것이다. 즉, 접두사 합을 활용한 알고리즘 동작과정은 다음과 같다. 1. N개의 수 위치 각각에 대하여 접두사 합을 계산하여 P에 저장한다. 2. 매 M개의 쿼리 정보를 확인할 때 구간 합은 P[Right] - P[Left - 1] 이다. ..

[파이썬] 투 포인터(Two Pointers)

[투 포인터란 ?] 투 포인터 알고리즘은 리스트에 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘이다. 리스트에 담긴 데이터에 순차적으로 접근해야 할 때는 시작점과 끝점 즉, 2개의 점으로 접근할 데이터의 범위를 표현할 수 있다. 투 포인터 알고리즘의 동작 과정은 다음과 같다. 1. 시작점(start)과 끝점(end)이 첫 번재 원소의 인덱스(0)를 가리키도록 한다. 2. 현재 부분 합이 M과 같다면 카운트한다. 3. 현재 부분 합이 M보다 작다면 end를 1 증가시킨다. 4. 현재 부분 합이 M보다 크거나 같다면 start를 1 증가시킨다. 5. 모든 경우를 확인할 때까지 2번부터 4번까지의 과정을 반복한다. [투 포인터 알고리즘 예제] # 데이터의 개수 N n = 5 # ..

[파이썬] 에라토스테네스의 체 알고리즘

[에라토스테네스의 체란 ?] 에라토스테네스의 체는 다수의 자연수에 대하여 소수 여부를 판별할 때 사용하는 대표적인 알고리즘이다. 에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾을 때 사용할 수 있다. 에라토스테네스의 체 알고리즘의 동작 과정은 다음과 같다. 1. 2부터 N까지의 모든 자연수를 나열한다. 2. 남은 수 중에서 아직 처리하지 않은 가장 작은 수 i를 찾는다. 3. 남은 수 중에서 i의 배수를 모두 제거한다. (단, i는 제거하지 않는다.) 4. 더 이상 반복할 수 없을 때까지 2번과 3번의 과정을 반복한다. 이러한 에라토스테네스의 체를 이용해서 소수판별 프로그램을 C언어로 구현한 코드는 아래의 게시물에서 확인할 수 있다. https://unie2.tistory.com/42?categ..

[파이썬] 소수 (Prime Number)

[소수란 ?] 소수란 1보다 큰 자연수 중에서 1과 자기자신을 제외한 자연수로는 나누어 떨어지지 않는 자연수이다. 즉, 6은 1, 2, 3, 6으로 나누어 떨어지므로 소수가 아니며, 7은 1과 7을 제외한 다른 수로 나누어 떨어지지 않기 때문에 소수이다. [기본적인 소수 판별 예제] def is_prime_number(x) : for i in range(2, x) : if x % i == 0 : return False return True print(is_prime_number(4)) print(is_prime_number(7)) 소수 판별 함수(is_prime_number) 를 통해 2부터 x-1 까지의 모든 수를 확인하며 만약 x가 해당 수로 나누어 떨어지면 소수가 아니기 때문에 False를 반환하고..

[파이썬] 위상 정렬

[위상 정렬이란 ?] 위상 정렬은 사이클이 없는 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 것을 의미한다. 위상 정렬 알고리즘 학습 시 진입차수(Indegree)와 진출차수(Outdegree)가 존재하는데, 진입차수는 특정한 노드로 들어오는 간선의 개수이고, 진출차수는 특정한 노드에서 나가는 간선의 개수이다. 큐를 이용하는 위상 정렬 알고리즘의 동작 과정은 다음과 같다. 1. 진입차수가 0인 모든 노드를 큐에 삽입한다. 2. 큐가 빌 때까지 다음의 과정을 반복한다. (1) 큐에서 원소를 꺼내 해당 노드에서 나가는 간선을 그래프에서 제거한다. (2) 새롭게 진입차수가 0이 된 노드를 큐에 넣는다. 3. 결과적으로 각 노드가 큐에 들어온 순서가 위상 정렬을 수행한 결과와 같다. 구..

[파이썬] 크루스칼 알고리즘

[신장 트리란 ?] 신장 트리는 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. [크루스칼 알고리즘이란 ?] 크루스칼 알고리즘은 대표적인 최소 신장 트리 알고리즘이다. 그리디 알고리즘으로 분류가 되며, 동작 과정은 다음과 같다. 1. 간선 데이터를 비용에 따라 오름차순으로 정렬한다. 2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인한다. 만약, 사이클이 발생하지 않는다면 최소 신장 트리에 포함시키고, 사이클이 발생한다면 최소 신장 트리에 포함시키지 않는다. 3. 모든 간선에 대하여 2번의 과정을 반복한다. 구체적인 동작 과정은 아래의 게시물에서 확인할 수 있다. https://unie2.tistory.com/37?category=873806 크루스칼 ..

[최단 경로] 이코테 (파이썬) 전보 풀이

[문제] 어떤 나라에는 N개의 도시가 있다. 그리고 각 도시는 보내고자 하는 메시지가 있는 경우, 다른 도시로 전보를 보내서 다른 도시로 해당 메시지를 전송할 수 있다. 하지만 X라는 도시에서 Y라는 도시로 전보를 보내고자 한다면, 도시 X에서 Y로 향하는 통로가 설치되어 있어야 한다. 예를 들어 X에서 Y로 향하는 통로는 있지만, Y에서 X로 향하는 통로가 없다면 Y는 X로 메시지를 보낼 수 없다. 또한 통로를 거쳐 메시지를 보낼 때는 일정 시간이 소요된다. 어느 날 C라는 도시에서 위급 상황이 발생했다. 그래서 최대한 많은 도시로 메시지를 보내고자 한다. 메시지는 도시 C에서 출발하여 각 도시 사이에 설치된 통로를 거쳐, 최대한 많이 퍼져나갈 것이다. 각 도시의 번호와 통로가 설치되어 있는 정보가 주..

[최단 경로] 이코테 (파이썬) 미래 도시 풀이

[문제] 미래 도시에는 1번부터 N번까지의 회사가 있는데 특정 회사끼리는 서로 도로를 통해 연결되어 있다. 방문 판매원 A는 현재 1번 회사에 위치해 있으며, X번 회사에 방문해 물건을 판매하고자 한다. 미래 도시에서 특정 회사에 도착하기 위한 방법은 회사끼리 연결되어 있는 도로를 이용하는 방법이 유일하다. 또한 연결된 2개의 회사는 양방향으로 이동할 수 있다. 공중 미래 도시에서 특정 회사와 다른 회사가 도로로 연결되어 있다면, 정확히 1만큼의 시간으로 이동할 수 있다. 또한 오늘 방문 판매원 A는 기대하던 소개팅에도 참석하고자 한다. 소개팅의 상대는 K번 회사에 존재한다. 방문 판매원 A는 X번 회사에 가서 물건을 판매하기 전에 먼저 소개팅 상대의 회사에 찾아가서 함께 커피를 마실 예정이다. 따라서 ..

[다이나믹 프로그래밍] 이코테 (파이썬) 병사 배치하기 풀이

[문제] N명의 병사가 무작위로 나열되어 있습니다. 각 병사는 특정한 값의 전투력을 보유하고 있습니다. 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 합니다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 합니다. 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용합니다. 그러면서도 남아 있는 병사의 수가 최대가 되도록 하고 싶습니다. 예를 들어, N = 7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하겠습니다. 병사 번호 1 2 3 4 5 6 7 전투력 15 11 4 8 5 2 4 이때 3번 병사와 6번 병사를 열외시키면, 다음과 같이 남아 있는 병사의 수가 내림차순의 형태가 되며 5명이 됩니다. 이는 남아 있는 병..

[다이나믹 프로그래밍] 이코테 (파이썬) 금광 풀이

[문제] n x m 크기의 금광이 있습니다. 금광은 1 x 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있습니다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작합니다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있습니다. 이후에 m - 1번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 합니다. 결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하세요. [입력 조건] 1. 첫째 줄에 테스트 케이스 T가 입력됩니다. (1