[알고리즘] 투 포인터
·
알고리즘
1차원 배열에서 이중 for문으로 O(N^2)에 처리되는 작업을 2개의 포인터를 사용하여 O(N)에 해결하는 알고리즘연속된 구간의 원소들을 처리하거나 정렬된 배열에서의 작업을 구현할 때 시도📕 문제 1. 다음의 배열에서 원소들의 합이 x인 연속 부분 배열의 개수를 구하라.arr = [1, 3, 6, 5, 2, 7, 9], x = 9시작 시점을 한 칸씩 전진해나가면서 구간의 합을 구해야함. 📕 문제 2. 다음의 배열에서 두 개의 원소의 합이 x와 같은지를 확인하고, 같다면 각 원소의 인덱스를 반환하라.arr = [10, 4, 15, 11, 7, 5], x = 15이전 문제처럼 배열을 그대로 두고 st와 en 두 포인터를 0으로 잡으면 답을 찾을 수 없음.배열이 정렬되어 있지 않으면 다음에 올 값이 이전..
[BOJ] 30804. 과일 탕후루
·
BOJ
📌 문제 제목문제 링크: BOJ 30804🗒️ 문제 설명1부터 9까지의 과일 N개가 꽂혀있는 탕후루가 있을 때, 앞이나 뒤의 과일을 제거하여 최대 2종류의 과일만을 가지는 탕후루를 만들어라.이때, 탕후루에 꽂혀있는 과일의 최대 개수를 구하여라.시간 제한: 2초메모리 제한: 1024MB1 1 💡 문제 해결 아이디어N이 최대 200,000 이므로 시간복잡도가 O(N)의 알고리즘 사용연속된 구간에서의 과일의 개수를 구하는 문제이므로 투 포인터를 사용다음에 꽂아야 할 과일이 이미 꽂혀있지 않고 이미 종류가 2종류라면 break⌛️ 시간 복잡도O(N)st는 시작점 포인터로 최대 N번 반복en은 끝점 포인터로 전체적으로 N번까지 증가겉보기에는 이중 반복이지만, en은 한 번 증가하면 다시 줄어들지 않음. ->..
[BOJ] 1806. 부분합
·
BOJ
📌 문제 제목문제 링크: BOJ 1806🗒️ 문제 설명10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 있을 때, 이 수열에서 연속된 수들의 부분합 중 그 합이 S 이상이 되는 것 중 가장 짧은 것을 구하여라.시간 제한: 0.5초메모리 제한: 128MB10 0 💡 문제 해결 아이디어시간 제한이 0.5초이고 N이 최대 100,000개 이므로 O(N)의 시간복잡도를 가지는 알고리즘을 사용연속된 수들의 부분합을 구하는 문제이므로 투 포인터 사용st를 0으로 잡고 부분합이 S 이상일 때 까지 en을 증가 + total에 부분합을 더하기처음 total이 S 이상일 때 answer을 비교 후 갱신total에 seq[st] 감소⌛️ 시간 복잡도O(N)st는 최대 N번 반복en은 전체 루프 동안 N번까지 ..
[BOJ] 2230. 수 고르기
·
BOJ
📌 문제 제목문제 링크: BOJ 2230🗒️ 문제 설명N개의 정수로 이루어진 수열이 있을 때, 이 수열에서 두 수를 골랐을 때 그 차이가 M 이상이면서 제일 작은 경우를 구하여라.시간 제한: 2초메모리 제한: 128MB1 0 0 💡 문제 해결 아이디어N이 최대 100,000 이기 때문에 O(N log N) 이하의 시간복잡도를 가지는 알고리즘 사용정렬을 시킨다면 st가 증가할 때 en이 줄어들 수 없으므로 O(N)의 시간복잡도를 가지는 투 포인터를 사용할 수 있다.입력이 정렬되어 있지 않으므로 수를 정렬 - O(N log N)st를 0으로 잡고 두 수의 차가 M 이상일 때까지 en을 증가시킴.처음 M 이상인 지점에 두 수의 차를 answer과 비교⌛️ 시간 복잡도O(N log N)정렬에 O(N log..