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개의 수가..
2465 줄세우기
https://www.acmicpc.net/problem/2465 문제 N명의 사람들이 어떤 공연장에 입장하기 위해서 한 줄로 서 있다. 줄 서 있는 각 사람은 자기 앞에 서 있는 사람들 중에서 자기보다 키가 작거나 같은 사람들의 수를 알고 있다. 그러면, 이 수들을 표시하는 수열을 S라고 한다. N명의 키 집합과 수열 S가 주어질 때, 원래 줄 서 있는 키 순서를 정확히 찾아내는 프로그램을 작성하시오. 예를 들어서, 사람들의 키 집합이 다음과 같이 주어진다 (여기서, 같은 키의 사람들이 여러 명 존재할 수 있어서 중복이 포함된다). {120, 167, 163, 172, 145, 134, 182, 155, 167, 120, 119, 156} 또한 각 사람이 자기 앞에 있는 사람들 중에서 자기보다 키가 작..
[삽입정렬] 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..