프로그래밍 언어 (C++, Java)를 할 줄 알고, 기초 알고리즘을 배우는 강의입니다.
전체 강의 구성은 https://code.plus/notice/16 를 참고해주세요.
알고리즘 기초1 강의 링크: https://code.plus/course/41
먼저, 알고리즘이 무엇인지, 어떻게 공부하는 것이 좋은지 알아봅니다. 그 다음으로 알고리즘의 효율성을 측정하는 방법 중 하나인 시간 복잡도에 대해서 배워봅니다.
내용을쓰세요
이 강의('알고리즘 시작')는 정말 좋은 강의이기 때문에 꼭 들으셔야 합니다.
알고리즘: 알고리즘이란 어떤 문제를 해결하기 위한 여러 동작들의 모임
알고리즘 공부에 가장 효과적인 방법 -> 문제 풀이
알고리즘문제해결전략의 서문을 읽어보길 추천.
|
프로그래밍을 많이 하는것 보다 생각을 많이 해보는것이 더 중요하다.
n!은 순서가 중요할때, 즉, 132와 123이 다를때,
코드 작성전에 시간복잡도를 생각해보고, 이게 구현 가능할지 생각해보는것이 더 중요하다.
문제를 풀면서 만나는 입출력 패턴은 총 8가지 이다.
이 중에서 첫번째 입출력 패턴을 살펴보자.
세번째 입출력 패턴을 살펴보자.
4번유형
테스트케이스의 갯수가 주어지지 않는다.
몸풀기용 연습문제
규칙성을 찾는 연습문제
스택 (Stack)에 대해서 집중적으로 배워봅니다. 스택을 사용하는 문제를 이용해 스택의 어떤 성질을 이용해서 문제를 해결할 수 있는지 알아봅니다. 큐(Queue)와 덱(Deque)은 이 챕터에서 소개만 합니다. 두 자료구조는 그래프와 BFS 챕터에서 집중적으로 다루게 됩니다.
문제를 푸는데 필요한 기본적인 수학 내용을 알아봅니다. 나머지 연산, 최대 공약수, 소수에 대해서 알아봅니다.
♠ 백준 알고리즘 강의 후기(코드플러스): 수학1 & 수학2
다이나믹 프로그래밍이 무엇인지, 난이도가 가장 낮은 문제들을 이용해 다이나믹 프로그래밍을 이해해 봅니다.
♠ DP는 따로 정리.. inner-game.tistory.com/426
[백준 BOJ 코드플러스/백준 BOJ 온라인저지 사용법] - [알고리즘 공부 방법] 나는 어떻게 알고리즘 공부를 했을까? - 최백준 님
[왕초보] 리트코드 시작하는 방법 (릿코드/leetcode 활용법, 공부 방법)
여기 까지가 이 글의 마지막 입니다.
아래 접은글 삭제하면 새로 옮긴글에서 사진이 지워질까봐 접어두기만함.
아래의 다이나믹 프로그래밍 프로그래밍1) 맛보기 강의를 가져왔다.
피보나치수를 예를 들어서 설명해 준다.
메모이제이션을 설명해준다.
탑다운과 바텀업도 알려준다.
문제풀이전략
- 점화식을 만들자.
- 문제를 많이 풀면서 감을 잡는것이 중요하다.
문제 이해: 초반 1분, 원형으로 둘러 앉아서 k만큼 건너뛰며 제거하는 형태
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Deque<Integer> deque = new ArrayDeque<Integer>();
StringBuilder sb = new StringBuilder("<");
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
for(int i = 1;i <= n; i++) {
deque.add(i);
}
while(!deque.isEmpty()) {
for(int i = 0; i < m-1;i++) {
deque.addLast(deque.removeFirst());
}
sb.append(deque.removeFirst() + ", ");
}
System.out.println(sb.toString().substring(0, sb.length()-2) + ">");
}
}
나머지연산으로도 처리 가능
while(!list.isEmpty()) {
index += m; if (index >= list.size()) {
index %= list.size();
}
sb.append(list.remove(index) + ", ");
}
♣ 수학1 & 수학2 정리: inner-game.tistory.com/504
♣ DP1 정리 : inner-game.tistory.com/426
♠ DP는 새로운 포스트로 옮기고 그림삭제 될까봐 그림있는 부분만 남겨둠 inner-game.tistory.com/426
[][][] (R,G,B)
[][][] (minGB+R, minRB+G, minRG+B)
[][][] (minGB+R, minRB+G, minRG+B)
...
[][][]
마지막줄의 3개중 가장작은값
배열이 두줄 필요하다.
윗줄은 제거않는버전, max(아무것도 안더한거, 지금까지더한거)+현재값
아랫줄은 하나제거한버전, max(하나뺀거+현재값더한거, 윗줄의이전최대값(즉,현재값을제거한것))
ans = max(max(윗줄, 아랫줄), 이전답)
근데 얼핏생각하며 아랫줄버전에서 계속 하나지운거에 또지우고 또지우고 그런 dp를 할수도 있지 않을까 싶은데..
잘 생각해보면,
1, -1, -1, 2 인 경우
1라운드
윗줄에서 1
아랫줄에서 1
2라운드 1, -1
윗줄에서 0
아랫줄에서 1(-1을 제거하였음)
3라운드 1, -1, -1
윗줄에서 -1
아랫줄에서 1(이미하나제거되어있음)+-1, -1(이미하나제거되있음) 중에 두번째꺼를 선택하게 되면 두개를 제거하는건데 동시에 맨처음꺼만 선택한 수열이됨
ans 는 현재 1
4라운드 1, -1, -1, 2
윗줄에서 2(현재값)
아랫줄에서 0+2, -1
ans는 2가됨
이런식으로 초기화 되므로, 연속해서 숫자를 빼줄 가능성은 없어짐