목록전체 글 (59)
이우의 개발일지
백준 2559번 수열 2559번 수열 코딩테스트 풀이이 문제는 투 포인터 알고리즘을 통해 구현할 수 있다. 투 포인터란?배열에서 이중 for문으로 O(n^2)으로 시간 복잡도를 가지는 작업을 2개 포인터의 움직임으로 O(N)에 해결하는 알고리즘이다. 2559번 수열 문제에서는 연속된 k개의 수열 중 가장 최댓값을 구하는 문제이기 때문에, 이중 for문으로 돌기는 하지만, 2번 째 for문은 k번만 돌면 되고 만약 k 값이 크다면 첫번째 for문은 n-k 번째까지만 돌기 때문에온전한 시간복잡도가 O(n^2)이 아니다. for (int i = 0; i max) max = num; } 다른 부분을 볼 필요가 없고, 위 코드처럼 간단히 비교해주면 된다. 여기서 수열의 값의 범위는 -100 부터 100까지이..
SWEA 1859번 백만 장자 프로젝트 문제 SWEA 1859 백만 장자 프로젝트 입/ 출력 및 예제 풀이 백만 장자 프로젝트를 보면 결국에는 입력된 모든 수를 알고 그 수의 max 값을 안 다음에 그 max값에 그 앞의 수들을 뺀 값을 result에 더 해주면 된다. 만약 max 값이 5이고, 그 앞의 값들이 3, 4 라면result + = 5 - 3;result += 5 - 4;이런 식으로 값을 추가해줘서 총 최대 이득을 뽑으면 된다. 하지만, 1 1 4 1 3 처럼 중간에 큰 max 값이 나오고, 마지막에 3 같은 다음 max 값이 나온다면 4의 max 값 뒤로 다시 max 값을 지정해줘야 한다. while (point max) { max = list[num][i]; max_num..
백준 2805번 나무자르기 이분 탐색은 조건을 잘 못 짤시에 무한루프에 빠져 시간 초과가 뜨는 경우가 많다.이렇게 빠지지 않을려면 조건을 잘 세워야한다. 주어진 문제에 조건은1. 나무의 높이 정하기 ( 여기서 주의해야할 점은 m은 적어도 이정도지 무조건 m개는 아니다!!)2. 나무의 높이를 기준으로 이분탐색 하기 long long st = maxx;long long en = 0;int ans = 0;while (en 0) result += num; } 보이는 바와 같이 st가 max면 나무를 짜르는 총 max 값은 0이다. 따라서 en을 0이라고 설정하여 잘랐을 때 나무 길이의 총값으로 st와 en을 정해줬다. if (result > m) { en = mid + 1; } else if (res..
백준 1541번 잃어버린 괄호 사실 그리디는 말그대로 욕심쟁이 알고리즘이라고, 매번 선택에 있어서 가장 최적의 답을 고르는 알고리즘입니다. 우리가 최적이라고 아니깐 이걸 쓰는거지 만약에 예외 테스트가 존재할 시 망할 수도 있는 것이죠. 그래서, 점화식을 잘 세우고 접근을 해야합니다. 이 문제를 봤을 때 괄호를 쳐서 최소의 숫자를 도출해내는 것이 요구 결과입니다.어떻게해야 최소가 된다고 하는지 유심히 봤을 때 뒤에 - 마이너스가 나오는 순간부터 다 빼주면 최소가 나오는 결과에 도달 할 수 있습니다. 또 다른 문제 조건은 string으로 한번에 받아서 문자를 숫자로 처리해야한다는 것인데요. 그래서 이부분에서는 STL 함수인 stoi 함수를 썼습니다. 이 함수는 string을 int형으로 바꿔주는 함수..
백준 10814번 나이순 정렬 이 문제는 시간 초과를 염두해야해서 이중 for문은 불가하다.그러면 sort함수를 사용하여 시간복잡도가 O(nlogn)으로 내려가게 만들어줘야한다. 하지만, 여기서 문제의 조건 중 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 만들어야한다. 따라서, 순서를 기억하는 방법과 stable_sort를 사용하는 방법이 있다. bool compare(pair a, pair b){ return a.first stable _sort의 사용 방법은 위 처럼 vector의 시작점과 끝점을 넣어주고 조건을 달아주면 끝이다.compare 조건문 안에서 a가 b보다 작으면 True, 크면 false를 해주면 된다. 이 함수는 stable_sort 함수가 벡..
백준 15650번 N과 M(2) 풀이 N과 M (2) 설명백트래킹은 완전 탐색과 비슷하게 하나하나 다 경우를 따져보는 알고리즘이다.일반적으로 다 따져보기 때문에 경우의 수가 큰 문제는 적용할 수 없다. 보통 재귀함수를 섞어서 쓰기 때문에 선행적으로 재귀에 대한 이해가 필요하다. 이 문제에서 볼 때 조건은 아래와 같이 2가지이다.조건 1. N개의 자연수를 M 개씩 나열한다.조건 2. 오름차순으로 나열한다. 조건 1을 따져보면 n개와 m개를 입력받고 재귀함수 안에서 m개의 조건을 충족하면 출력한다.bool issu[9];int list[9];int num = 0;int n, m;void func(int a) { if (num == m) { for (int i = 1; i i) continue; el..
백준 1260번 BFS와 DFS BFS와 DFS 풀이이 문제는 생각보다 까다로울 수 있는데, 일반적인 BFS와 DFS 구현에서 추가로 조건이 다음과 같이 붙는다. 조건 1. 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문한다.조건 2. DFS와 BFS 동시에 구현하기 조건 3. 들어간 순서대로 출력하기 BFSvoid Bfs(int start) { Q.push(start); vis_b[start] = 1; cout 먼저, BFS를 보면 일반적인 구현방식과 동일한데 중간에 sort 함수가 보일 것이다. 간선의 개수가 최대 10,000개까지 가능해서 처음에 이중 for문을 시도했다가 시간초과가 뜨는 쓴 맛을 봤다... ㅋㅋ 이중 for문에 시간복잡도는 O(n^2) 이고 내가 현재..
백준 11725번 트리의 부모 찾기 11725번 풀이이 문제도 일반적인 BFS 형식의 확정 문제이다. 결국에는 '각 노드의 부모 노드가 무엇이냐' 를 찾는 문제인데, 트리 구조를 바탕으로 하지만 트리의 층 순서대로 주는 것이 아닌 뒤죽박죽 형식으로 주기 때문에 결국에는 한번에 다 받은 다음에 BFS 구조로 찾는 방법으로 다가갔다. for (int i = 0; i > a >> b; if (a == 1) { parent[b] = 1; Q.push(b); vist[b] = 1; } else if (b == 1) { parent[a] = 1; Q.push(a); vist[a] = 1; } vec[a].push_back(b); vec[b].push_back(a);}1층의 노드는 무조건 1이라는 조..