목록Algorithm (131)
Dolphins의 HelloWorld
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42628 풀이 필요할 때마다 어쩔 때는 앞에서, 어쩔 때는 뒤에서 숫자를 꺼내야 하므로 deque라는 자료구조를 사용한다. 쉽게 생각해서 deque은 앞뒤로 뚫려있는 큐의 형태라고 생각하면 된다. 여기서 우선순위를 구현하기 위해 먼저 새로운 숫자를 맨 앞에 집어넣은뒤 bubble sort를 할 때 처럼 오름차순이 될 때 까지 새로 들어간 숫자를 뒤로 밀어주면서 조건을 만족시키도록 하였다. #include #include #include using namespace std; vector solution(vector arguments) { vector answer; deque deq; for (int i..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42629 풀이 기본적으로 공급을 받을 때마다 stock을 누적시키는 방식으로 반복문을 작성하였다. 먼저 지금 가지고 있는 stock으로 버틸 수 있는 날 까지 받을 수 있는 공급을 우선순위 큐에 삽입시켰다. 이후 쌓여진 stock으로 k까지 버틸 수 없을 경우 우선순위에 있는 큐중에 가장 앞에있는것, 즉 가장 큰 공급을 받아 다시 반복문을 진행하였고 stock이 k이상이 될 때 반복문을 멈추고 이 때까지 받은 보급을 반환하도록 하였다.
문제링크 : https://www.acmicpc.net/problem/6603 풀이 주어진 k개의 번호중 6개를 골라 만들 수 있는 경우를 모두 구하는 문제이다. 6개를 고르기 위해 순열의 특성을 이용했는데 예를들어 숫자가 7개가 있다고 가정하고 0을 1개 1을 6개를 배열에 넣고 모든순열을 구하면 다음과같이 나온다. 이 부분에서 아마 이 문제를 어떻게 풀어야할지 대충 감이 왔으리라 생각된다. 이렇게 k-6개에 대해 0을 넣고 k개의 1을 넣은 후 순열을 돌렸을 때 1이 있는 곳과 대응되는 자리의 수를 출력하면 모든 경우를 구할 수 있는것이다. 소스코드는 다음과 같다. #include #include #include using namespace std; int main() { while (1) { int..
문제링크 : https://www.acmicpc.net/problem/10971 풀이 외판원이 순회할 수 있는 경로를 모두 검사하면서 그 중 가장 최솟값을 구하면 문제를 풀 수 있다. 순회 경로같은 경우 만약 N=4라면 배열에 0 1 2 3 을 넣어놓은 후 next_permutation함수를 통해 구해주었고 순열이 바뀔 때마다 경로비용의 합을 구해주면서 최솟값을 추출하도록 하였다. #include #include using namespace std; int arr[10][10]; int permutation[10]; int main() { int N; scanf("%d", &N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d..
문제링크 : https://www.acmicpc.net/problem/10819 풀이 순열을 모두 검사하여 문제에서 제시한 연산을 했을 때 가장 큰 수를 출력하면 되는 문제이다. #include #include using namespace std; int N; int calculate(int* arr) { int result = 0; for (int i = 0; i < N-1; i++) { result += abs(arr[i] - arr[i + 1]); } return result; } int main() { int arr[8]; scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &arr[i]); sort(arr, arr + N); int answer ..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42626 풀이 우선순위 큐를 이해하고 사용할 줄 안다면 어렵지 않게 풀 수 있다. 이 문제를 풀기위해 먼저 priority_queue pq; 를 선언하였다. 가지고 있는 원소들에 대해 오름차순을 유지하는 우선순위 큐이다. 그래서 이 우선순위 큐의 맨 앞과 다음의 스코빌 지수를 추출한 후 K이상이 될 때까지 반복해서 섞는식으로 문제를 풀었다.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42587 풀이 처음에 queue q; priority_queue pq; 를 선언하였다. 그냥 큐에서 인자 하나는 우선순위, 하나는 위치를 저장해 놓았고 우선순위 큐에는 우선순위를 넣었는데 기존의 우선순위들을 내림차순으로 정렬하기 위함이다. 이렇게 되면 우선순위 큐의 가장 앞에는 우선순위가 가장 큰 것이 있으므로 만약 큐의 맨 앞에 있는것과 우선순위 큐의 맨 앞에있는 것이 같다면 큐의 인자를 pop하면 되고 같지 않다면 큐의 맨 뒤로 옮겨주면 된다. 그리고 우선순위가 같을 때 우리가 찾고자하는 것과 location이 같다면 인쇄되는 순서를 return해주면 되고 아니라면 인쇄순서를 증가시킨 후 과정을 ..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42586 풀이 처음에 complete라는 벡터함수를 하나 만들고 각 작업별로 끝내가 위해 필요한 일 수를 순서대로 저장하였다. 그 후 제일 먼저 해야하는 작업을 기준으로 하면서 그 작업을 마칠 때 함께 배포할 수 있는 작업들을 검사하여 answer벡터에 삽입시키도록 하였다.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42583# 풀이 과정하나를 빠뜨려서 그것때문에 꽤 오랜시간을 푼 문제이다. 일단 이 문제를 위해 다음의 queue q; 를 사용하였다. 이 큐의 첫번째 인자로는 다리를 지나는 트럭의 무게 그리고 두번째 인자로는 그 트럭이 다리를 건너기 시작한 시간을 주었다. 이 문제를 풀기 위해 첫 트럭부터 조건문을 통해서 문제를 해결해주었고 무게를 검사했을 때 해당 트럭이 다리에 올라갈 수 있다면 큐에 트럭의 정보를 삽입 후 시간을 1 증가시켰다. 만약 다리에 올라갈 수 없다면 큐의 맨 앞에 있는 트럭(다리의 맨 앞에있는 트럭)이 다리를 일단 지나가야 뭘할 수 있으므로 시간과 다리가 견딜 수 있는 무게를 트럭이 완..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42585 풀이 이 문제를 풀기위해 스택을 사용하였다. 반복문을 이용해서 주어진 arrangement의 맨 앞부터 끝까지 검사를 하였는데 반복문 안에서 다음과 같은 절차를 수행하였다. 1. 만약 '('과 ')'이 붙어서 나온다면 레이저가 나오는 것이므로 현재 존재하는 쇠막대기의 수를 결과값에 더하였다. 2. 만약 그냥 '('가 나온다면 새로운 쇠막대기가 추가되는 것이므로 스택에 그대로 추가하였다. 3. 만약 그냥 ')'가 나온다면 결과값에 1을 더하고 스택에 들어있는 '(' 하나를 제거해주도록 하였다. 이렇게 한 이유는 만약 한 막대기를 레이저로 2번 잘랐을 때 3토막이 나오는 것을 레이저가 나오는 횟..