본문 바로가기

알고리즘/알고리즘 이론

(7)
해싱을 통한 부분수열(음수포함)의 합이 m이는 경우 이론 - java nums = {1,  2,  3,  -3,  1,  2,  2,  -3} m=5정수 m과  수열 nums 배열이 주어졌을때, 연속부분수열의 합이 m(5)가 되는 경우를 구하라는 문제가 주어진다. 결론부터 말하면 정답은 5이다. 아래는 연속부분수열의 합이 m(5) 가 되는 경우들이다.[1,2,3,-3,1,2,2,-3][2,3]  [2,3,-3,1,2][3,-3,1,2,2][3,-3,1,2,2][1,2,2] 어떻게 이 문제를 푸는지가 중요하다. 사실 중첩 반복문으로 풀면 누구나 풀 수 있는 문제일 것이다. 하지만 보통 이런 문제는 nums의 길이가 100,000 이상으로 나와 효율성을 고려해야 한다.나는 이 문제를 보자마자 투포인터 방식을 생각했지만 연속부분수열이기 때문에 정렬을 하지못해 규칙성이 없어 투포..
시간에 따른 시뮬레이션 문제 이론 및 풀이 (회의실 만남문제) - java 문제 :회의실에 출입할때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.오늘 회의실에는 총 n명이 입실 후 퇴실했습니다. 편의상 사람들은 1부터 n까지의 번호가 하 나씩 붙어있으며, 두 번 이상 회의실에 들어온 사람은 없습니다. 현수는 각 사람별로 회의실에 서 반드시 만난 사람은 몇 명인지 구하려 합니다. 예를 들어 입실 명부에 기재된 순서가 [2, 1, 3], 퇴실명부에 기재된 순서가 [1, 3, 2]인 경 우,‣ 1번과 2번은 반드시 만납니다.‣ 1번과 3번은 반드시 만났는지 알 수 없습니다. ‣ 2번과 3번은 반드시 만납니다. 출입명부에 [1, 2, 5, 3, 4] 퇴실명부에 [2, 3, 1, 4, 5]일때 각 번호의 사..
[ 냅색 알고리즘 ] 설명, 유형 별 풀이방법 DP(다이나믹 프로그래밍) 에서 냅색 알고리즘 이라는 것이 있다. 냅색 알고리즘이라고 이름이 붙은 이유는 이 알고리즘을 만든 사람의 이름을 딴 것이 아닌 단순하게 이 알고리즘의 가장 대표적인 문제가 배낭 문제여서 이름이 그렇게 붙여졌다고 한다 냅색 알고리즘은 조합 최적화(Combination Optimization) 문제에 사용하면 된다. 아래에 2가지 예시를 통해 자세히 알아보자. * 예시 1 ) 동전 1원, 2원, 5원이 주어진다. 15원을 상대방에게 거슬러 주려면 최소 몇개의 동전이 필요한가?? 주어진 동전은 무한정 쓸 수 있다. 자. 이런식으로 가진 동전에서 조합으로 최소로 거슬러 줄 동전을 구하면 된다. 우선 정답은 3이다. 15원을 최소로 거슬러주려면 3(5원,5원,5원 으로 거슬러주면 됨) ..
DFS 기초 - Java (여러가지 유형 별 DFS 사용방법 정리) 알고리즘 문제를 풀때 DFS알고리즘을 사용해야 하는 경우 크게 3가지 정도로 나뉘는 걸 확인했다.문제마다 스택을 그려가며 확인했지만 깊이 이해가 가지 않았고, 결론은 유형에 따라 DFS가 쓰이는 방식을 통째로 외우는게 맞다고 생각했다. 적어도 나는.. 아래에는 유형과 코드를 설명한다. 1. 부분집합 예를들어 n=3일때 1~n 까지의 부분집합을 출력하라고 한다면 아래와 같이 출력되어야 할 것이다. 123 12 13 1 2 3 2 3 main단에서 T.DFS(1)를 호출한다. DFS단은 아래와 같다. public void DFS(int L){ if(L==n+1){ for(int i=1; i
퀵 정렬(quick sort) 이란 가장 기초적인 정렬 알고리즘 (선택,삽입,버블)을 학습하고 조금 더 복잡한 정렬 알고리즘들을 학습하려고 한다. 이름만 들어도 빠를거 같은 퀵 정렬에 대해서 알아보자. 퀵 정렬 이란? 1. 퀵 정렬은 분할 정복 방식을 통해 정렬하는 알고리즘이다. 1-1. 퀵 정렬은 피벗(pibot)을 정한 뒤 피벗을 기준으로 리스트를 분할 한다. (피벗 왼쪽, 피벗 오른쪽) 1-2. 퀵 정렬은 올바르게 정렬될 때까지 재귀적으로 분할 정복한다. 2. 퀵 정렬은 필수적으로 피벗(pibot)을 지정해야 한다. 방식에는 3가지가 있다. (일반적으로 첫번째값을 많이 쓴다고 한다) 2-1. 첫번째 값이나 마지막 값을 피벗으로 지정. 2-2. 첫번째, 가운데 , 마지막 값 중에 중간값을 피벗으로 지정.(Median of Three) ..
결정 알고리즘(Decision Algorithm) 이란? 결정 알고리즘 이란 기본적으로 이분 탐색을 이용해서 해를 구하는 알고리즘 이다. 그렇다면 이분 탐색은 무엇이냐? 이분 탐색은 기본적으로 오름차순 정렬 되어 있는 배열에서 사용가능하며, 찾고자 하는 수가 몇번째 인덱스에 있는지에 대한 해를 구할때 사용된다. int [] arr = {1, 2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 } 이러한 배열이 있을때 , 4 가 이 배열의 몇번째 인덱스에 있는지 알고싶다. 이분탐색의 규칙은 다음과 같다. 1. lt, rt , mid 값 설정 2. target > mid 이면 , lt = mid+1 3. target 9 1-3. mid..
스택프레임 이란? public void solution(int n) { if(n==0) return; else{ System.out.print(n+" "); //Line 1 solution(n-1); //Line 2 } } public static void main(String[] args) { Main M = new Main(); Scanner kb = new Scanner(System.in); int n = 5; M.solution(n); } 위와 같은 코드일 때, 결괏값은 Output: 5 4 3 2 1 이다. 예상한 결과이다. n이 5일 때 solution() 함수는 5가 0이 될 때까지 재귀함수를 호출하며 0이 되면 종료된다. 그렇다면 public void solution(int n) { if(n==0) retu..