문제 링크 코딩테스트 연습 - 이중우선순위큐 programmers.co.kr 풀이 우선순위 큐를 이중으로 하라는 문제같은데 front와 back 모두 pop과 push를 할 수 있는 deque 컨테이너를 사용해서 풀었다. (물론 vector의 erase로 front()를 지울 수 있지만, 하나 지우면 복사해서 다시 당겨오기 때문에 비효율적이다) // init answer[0] = 0, answer[1] = 0 덱(deque) 선언 // process 삽입과 삭제로 나눈 후, 삭제는 최댓값 삭제와 최솟값 삭제로 나눈다. 반복문(연산 목록) { 삽입 { deque 뒤에 push 정렬(오름차순) } 삭제 { 최대값 삭제: 뒤의 원소 pop 최소값 삭제: 앞의 원소 pop } } 만약, dq가 비어있지 않을 경..
문제 링크 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를�� programmers.co.kr 풀이 문제를 보고 종료시점이 핵심이라는 것을 알고 우선순위 큐를 적용했다. 종료 시점에서 (요청시간 요청~종료 시간의 합 평균을 줄이기 위해서는 작업들의 대기시간을 줄여야 한다. -> 작업들의 대기시간을 줄이기 위해서는 작업을 할 수 있을 때, 작업의 수를 줄여야 한다. -> 작업의 수를 빠르게 줄이기 위해서는 작업을 할 수 있을 경우에 소요 시간이 작은 것을 먼저 하면 된다. 따라서, 코드 작성은 종료시점을 기록하면서 종료시점에서 작업을 할..
문제 링크 코딩테스트 연습 - 더 맵게 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같�� programmers.co.kr 풀이 우선순위 큐를 이용하여 푸는 문제다 // init 우선순위 큐(priority_queue)를 작은 것이 먼저 나오도록 order를 바꿔준다. pq의 생성자{pq(scoville.begin(), scoville.end())}로도 해도 되지만 for문을 이용해서 push해주었다. // process 우선순위 큐의 top()은 가장 작은 원소값(가장 안매운 스코빌 지수)이 나온다. 이를 이용해서 pop()을 두 번한다. cur = 가장..
문제 링크 코딩테스트 연습 - 네트워크 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있�� programmers.co.kr 풀이 DFS/BFS 파트에 있지만 문제를 보고 union-find가 먼저 떠올라서 union-find로 풀었다. // 요약 // find_root() - root를 찾아주는 재귀로 구현한 함수 // init 자신을 root로 설정 // process 인접행렬 computers가 대각선을 기준으로 대칭되므로 연산을 줄이기 위해 반복문을 최소한으로 돌게한다. (i = 0~n-1일 때, j=i+1 ~ n이다) { 연결돼있다면, 각 i와 j의 roo..
문제 링크 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+ programmers.co.kr 풀이 문제에서 중간에 타겟넘버가 되는 경우가 없고 최종까지 가야 타겟넘버로 지정하는 것이므로 "완전탐색"이다. 재귀로 최종까지 가게되면(index값이 size랑 같을 경우) target이 같은지 여부에 따라 return 1과 0을 나누었다. 더보기 #include #include #include #include using namespace std; // +, - 만 하기 // 숫자가 담긴 배열 nu..
문제 링크 코딩테스트 연습 - 카펫 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 �� programmers.co.kr 풀이 그림을 잘 보면 안쪽(노랑)의 width와 전체 카펫의 width는 2개의 격자 차이, 안쪽(노랑)의 height과 전체 카펫의 height은 2개의 격자 차이를 볼 수 있다. 따라서, 안쪽 색깔(노랑)의 width와 height을 알기 위해 약수를 구하면서 "(width+2) * (height+2) = 전체 카펫의 격자 개수" 식을 이용한다. 위 식이 참을 나타내는 width+2와 height+2에 대해 리턴해준다. - 참고! widt..
문제 링크 코딩테스트 연습 - 프린터 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린�� programmers.co.kr 풀이 문제를 보면 Queue 문제를 느낄 수 있었다. 우선순위 큐(Priority Queue) 문제로 보았는데 같은 원소가 중복될 수 있어서 일반 Queue를 사용했다. 문제에 주어진 작업 순서대로 수행하였다. // init 1. 우선순위 목록을 검색할 수 있는 v(vector) 컨테이너를 내림차순으로 정렬한다. 2. Queue에 원소들을 넣는다. // process Queue에 원소가 남아있지 않을 때까지 반복문을 돌린다 { 제일 앞에 있는 원소를 ..
문제 링크 코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이�� programmers.co.kr 풀이 처음에 무작정 배열로 풀다가 고생했다. 해결방법은 그리고 (시작시간+다리 길이)가 해당 트럭이 빠져나오는 시간인 것을 파악하고 다리가 순서대로 빠져나오므로 Queue문제인것은 확실해서 여러 조건문을 달고 정리하여 해결했다. 조건은 다음과 같이 나눌 수 있다. 1) 다리가 비어있을 경우(트럭을 무조건 올릴 경우) 2) 다리가 비어있지 않을 경우 2.1) 트럭이 빠져나올 수 있는 경우 2.1.1) 트럭을 올릴 수 있는 경우 (현재..