본문 바로가기

알고리즘

(17)
2042 구간 합 구하기 https://www.acmicpc.net/problem/2042 문제 어떤 N개의 수가 주어져 있다. 그런데 중간에 수의 변경이 빈번히 일어나고 그 중간에 어떤 부분의 합을 구하려 한다. 만약에 1,2,3,4,5 라는 수가 있고, 3번째 수를 6으로 바꾸고 2번째부터 5번째까지 합을 구하라고 한다면 17을 출력하면 되는 것이다. 그리고 그 상태에서 다섯 번째 수를 2로 바꾸고 3번째부터 5번째까지 합을 구하라고 한다면 12가 될 것이다. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄까지 N개의 수가..
7578 공장 https://www.acmicpc.net/problem/7578 문제 어떤 공장에는 2N개의 기계가 2열에 걸쳐 N개씩 배치되어 있다. 이 2개의 열을 각각 A열과 B 열이라고 부른다. A열에 있는 N개의 기계는 각각이 B열에 있는 N개의 기계와 하나씩 짝을 이루어 케이블로 연결되어 있다. 즉, A열의 임의의 기계는 B열의 유일한 기계와 케이블로 연결되어 있고, B열의 임의의 기계는 A열의 유일한 기계와 케이블로 연결되어 있다 또한, 각 기계에는 식별번호가 붙어있으며, 짝이 맺어진 기계끼리는 같은 식별번호가 붙어있다. 즉, 각 열에 있는 N개의 기계끼리는 서로 다른 식별번호를 가지고 있으며, 반대쪽 열에 있는 같은 식별번호를 가진 기계와 케이블로 이어져 있다. 공장 작업의 효율성을 위해 기계들은 짝을 ..
2465 줄세우기 https://www.acmicpc.net/problem/2465 문제 N명의 사람들이 어떤 공연장에 입장하기 위해서 한 줄로 서 있다. 줄 서 있는 각 사람은 자기 앞에 서 있는 사람들 중에서 자기보다 키가 작거나 같은 사람들의 수를 알고 있다. 그러면, 이 수들을 표시하는 수열을 S라고 한다. N명의 키 집합과 수열 S가 주어질 때, 원래 줄 서 있는 키 순서를 정확히 찾아내는 프로그램을 작성하시오. 예를 들어서, 사람들의 키 집합이 다음과 같이 주어진다 (여기서, 같은 키의 사람들이 여러 명 존재할 수 있어서 중복이 포함된다). {120, 167, 163, 172, 145, 134, 182, 155, 167, 120, 119, 156} 또한 각 사람이 자기 앞에 있는 사람들 중에서 자기보다 키가 작..
2517 달리기 https://www.acmicpc.net/problem/2517 문제 KOI 장거리 달리기 대회가 진행되어 모든 선수가 반환점을 넘었다. 각 선수의 입장에서 자기보다 앞에 달리고 있는 선수들 중 평소 실력이 자기보다 좋은 선수를 남은 거리 동안 앞지르는 것은 불가능하다. 반대로, 평소 실력이 자기보다 좋지 않은 선수가 앞에 달리고 있으면 남은 거리 동안 앞지르는 것이 가능하다. 이러한 가정 하에서 각 선수는 자신이 앞으로 얻을 수 있는 최선의 등수를 알 수 있다. 각 선수의 평소 실력은 정수로 주어지는데 더 큰 값이 더 좋은 실력을 의미한다. 현재 달리고 있는 선수를 앞에서 부터 표시했을 때 평소 실력이 각각 2, 8, 10, 7, 1, 9, 4, 15라고 하면 각 선수가 얻을 수 있는 최선의 등수는 ..
세그먼트트리 1. RMQ 구간에서 최소값 구하기 배열 A[1], A[2], … , A[N]가 있고, 이중 A[i], … ,A[j] 중에서 최소 값을 찾아 출력 이러한 연산이 총 Q개 주어짐 1개 : $O(N)$ , Q개 : $O(NQ) N,Q logN=log2^h -> logN = hlog2 -> longN/log2 =h N = 5 일 경우 3 ~ 4 조회 int h = (int)Math.ceil(Math.log(5) / Math.log(2)); int tree_size = (1
[삽입정렬] Python, Kotlin, Java 우선 배열은 0부터 시작하지만 우리가 바로 오른 쪽 값 부터 비교 하므로 1부터 배열의 길이까지 for 문을 돌린다. j는 i의 시작값 좌측으로 -1 씩 인덱스를 감소하면서 정렬 시킨다. 기본적으로 i와 j의 이중 for문으로 시간복잡도는 O(N^2)가 된다. - Python # 파이썬 array=[7,5,9,0,3,1,6,2,4,8] for i in range(1,len(array)) : for j in range(i,0,-1) : if array[j] < array[j-1] : array[j],array[j-1] = array[j-1],array[j] else : break print(array) - Kotlin //코틀린 fun main(array: Array){ var array = arrayOf..
[선택정렬] Python, Java, Kotlin 상단의 이미지와 같이 앞에 값 하나와 그 이외의 값의 크기를 계속 비교하면서 최소값을 찾아나간다. 시간 복잡도는 N번만큼 가장 작은 수를 가장 앞으로 보내야한다. 처음 0번째 부터 하나씩 오른쪽으로 밀려가는 for문이 돌아가므로 N+(N-1)+(N-2)+...+2 이고 마지막은 굳이 정렬을 돌리지 않아도 된다. 등차수열의 합 공식 n(a+l)/2 = (N-1)(N+2)/2 = (N^2+2N-N-2)/2 = (N^2+N-2)/2 가 된다 빅오 표기법에 의해 가장 큰 N^2만 남게되고 O(N^2)가 된다. - Python # 파이썬 array=[7, 5, 9, 0, 3, 1, 6, 2, 4, 8] #selection sort for i in range(len(array)): tempIdx=i for j in..
[Kotlin ]2501번 약수 파이썬과 풀이방법은 동일하다 여기서는 result 값을 하나 주고 초기 값을 0으로 해준다 그리고 여기에 i의 값을 세팅해주고 마지막에 출력해준다. count랑 i랑 헷갈리면 안된다. 6 3 과 같은 예제를 하면 count와 i값이 동일하게 3이 나와 혼돈이 생긴다. 주의하자 package com.example.myapplication.algorithm import java.util.* fun main(array: Array) = with(Scanner(System.`in`)) { val n = nextInt() val k = nextInt() var result=0 //println(k) //println(n) var count: Int = 0 for (i in 1..n) { //println("cou..