STUDY/알고리즘(24)
-
백준 2579 - 계단 오르기
간단한..... dp 문제구나 ..... ^^... ㅠㅠ https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 풀이는 이분꺼 참고함..! https://wtg-study.tistory.com/76 b?a:b int dp[301]; int stair[301]; int main() { int N; scanf("%d", &N); for (int i = 1; i
2022.07.03 -
백준 1463번 - 1로 만들기
문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. 1. X가 3으로 나누어 떨어지면, 3으로 나눈다. 2. X가 2로 나누어 떨어지면, 2로 나눈다. 3. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 예제 1 | 입력 : 2 / 출력 : 1 예제 2 | 입력 : 10 / 출력 : 3 힌트 : 10의 경우에, 10->9->3->1 로, 3번 만에 만들 수 있다. 풀이 : 애초에 DP문제를 지금 풀고 있는건데 ^^... 생각을 우찌하시는건가요 .... 입력..
2022.07.02 -
백준 2748 - fibonacci 2
DP 문제 입문... ^_ㅠ 하..... 가망도 없는거 붙잡고있을라니까 멘탈이 힘들군... int main() { int N; long long arr[91] = {0,1}; scanf("%d", &N); for(int i = 2; i
2022.07.02 -
Merge Sort ( 합병 정렬 )
## 개념 요약 ## 일반적인 방법으로 구현했을 때 이 정렬은 "안정 정렬"에 속하며, 분할 정복 알고리즘 중의 하나 이다. 분할 정복 ( divide and conquer ) 방법 문제를 작은 2개의 문제로 분리하고, 각각을 해결한 다음 ! 결과를 모아서 원래의 문제를 해결하는 전략이다. 분할 정복 방법은 대개 순환 호출을 이용하여 구현한다. 과정 ! 리스트의 길이가 0 or 1 이면, 이미 정렬된 것으로 본다. 1이상이면 ? 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 개로 나눈다. 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 두 리스트를 다시 하나의 정렬된 리스트로 합병한다 ## 구체적인 개념 ## 하나의 리스트를 2개의 균등한 크기로 분할하고, 분할된 리스트를 정렬, 2개..
2022.06.30 -
Bubble Sort ( 버블 정렬 )
** 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘 ! , 오름차순으로 정렬한다. ## 개념 요약 ## 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘. 인접한 2개의 값을 비교하여, 크기가 순서대로 되어있지 않으면 교환한다. 선택 정렬과 기본 개념이 유사하다. (SWAP) ## 구체적인 개념 ## 버블 정렬은 1번째 값과 2번째 값을, 2번째 값과 3번째 값을....3번째와 4번째를.... 이런식으로 (마지막-1) 번째 자료와 마지막 자료를 비교해 교환하면서 자료를 정렬한다. 1회전을 수행하고 나면 , 가장 큰 값이 맨 뒤로 이동하므로, 2번째 loop 에서는 맨 끝에 간 큰값은 정렬에서 제외되고, 2회전을 수행하면 끝에서 2번째 값은 다음 loop 에서 제외된다. 이렇게 1회전을 수행할 때 마다..
2022.06.30 -
Insertion Sort ( 삽입 정렬 )
* 오름차순을 기준으로 정렬한다. ## 개념 요약 ## 손 안의 카드를 정렬하는 방법과 유사하다. 새로운 카드를 기존의 정렬된 카드 사이의 올바른 자리를 찾아 삽입하는 방법. 새로 삽입될 카드의 수 만큼 반복하게 되면, 전체 카드가 정렬됨. 배열의 모든 요소를, 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교 해서, 자신의 위치를 찾아 삽입해 완성하는 알고리즘. 매 순서마다 해당 원소를 삽입 할 수 있는 위치를 찾아 해당 위치에 넣는다. ## 구체적인 개념 ## 삽입 정렬은 2번째 값 부터 시작해, 그 앞의 값들과 비교하여 삽입할 위치를 지정한 후 값을 뒤로 옮기고, 지정한 자리에 값을 삽입해 정렬하는 알고리즘이다. 즉, 2번째 값은 첫 번째 값, 3번째 값은 2, 1번째 값, 4번째 값은 3,2,1 ..
2022.06.30 -
Selection Sort ( 선택 정렬 )
오름차순을 기준으로 정렬한다. ## 개념 요약 ## 제자리 정렬(in-place sorting) 알고리즘 중의 하나. > 입력배열 (입력받은 배열값들) 이외에 다른 추가 메모리를 요구하지 않는 정렬 방법. 해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 어떤 원소를 넣을지 선택하는 알고리즘. > Ex) 첫 번째 순서에는 가장 최소값을 넣고, 2번째 순서에는 2번째 위치에 남은 값 중에서의 최소값을 넣고.... 과정 설명 1) 주어진 배열 중에서 최소값을 찾는다. 2) 그 값을 맨 앞에 위치한 값과 교체한다. 3) 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체. 4) 하나의 원소만 남을 때 까지 위의 1~3 과정을 반복. ## 구체적 개념 ## - 선택정렬은, 첫 번째 값을 두번째 값부터 마지..
2022.06.29 -
Merge, Merge Sort
합병 정렬, 합병... 걍 머지는 이해했는데 머지 소트가 ^_ㅠ 하 우선 외운다 ㅋㅋㅋㅋㅋ Merge : #include // 백준17728번 int N, M; int a[1000100]; int b[1000100]; int main(void) { scanf("%d %d", &N, &M); for (int i = 0; i = b[j] ) printf("%d ", b[j++]); else printf("%d ", a[i..
2022.06.19 -
백준 2577번 - 숫자의 개수 (코틀린)
풀이 : fun main() { val num1 = readln().toInt() val num2 = readln().toInt() val num3 = readln().toInt() var arr = Array(10, {0}) val res = (num1*num2*num3).toString() //println(res) for (i in 0 .. res.length-1) { //println("res[$i]: " + res[i].digitToInt()) var tmp = res[i].digitToInt() //println(tmp) when(tmp) { 0 -> arr[0]++ 1 -> arr[1]++ 2 -> arr[2]++ 3 -> arr[3]++ 4 -> arr[4]++ 5 -> arr[5]++ 6..
2022.06.06 -
백준 2562 - 최댓값 (코틀린)
fun main() { var arr = ArrayList() var count = 0 while (count < 9) { arr.add(readln().toInt()) count++ } var arr2 = arr.sorted() //println(arr.contains(arr2[8])) println(arr2[8]) println(arr.indexOf(arr2[8])+1) } 풀이법 : 먼저 입력 값을 받아주고, 그걸 sorted() 한 리스트에서 맨 마지막 값을 출력함으로써 최대값을 구하고, 기존 List의 index값은 , 앞에서 찾은 최대값의 list의 indexOf를 사용해 출력했다.
2022.06.06