본문 바로가기
  • 실행력이 모든걸 결정한다
반응형

Algorithm143

[Heap, 난이도 중상] 프로그래머즈, 디스크 컨트롤러 본인이 짠 소스 코드의 전체적인 처리 과정은 이렇다. 1. 작업 길이가 짧은 작업을 우선으로 하는 우선순위 큐에 모든 작업들을 push한다. 2. 우선 순위 큐의 top은 가장 작업 길이가 짧은 작업인데, 현재 시간을 기준으로 아직 디스크에 들어오지 않은 작업이라면 당장 실행할 수 없으므로 임시 저장벡터에 빼둔다. 당장 실행할 수 있는 작업이 나올 때 까지 반복해준다. 3-1. 당장 실행할 수 없는 작업이 하나도 없을 수도 있다. 이 때는 앞으로 제일 먼저 들어오는 작업들중 작업 길이가 짧은 작업을 실행해주면 된다. 현재 시간은 이 작업이 끝나는 시간으로 바꿔주면 된다. 3-2. 당장 실행할 수 있는 작업이 있다면 우선 순위 큐의 top에 해당하는 작업을 수행해주고, 현재 시간은 3-1과 마찬가지로 이 .. 2020. 10. 8.
[그래프, 난이도 중] 프로그래머즈, 순위 n명이 있고 일부의 승패 관계를 알 수 있을 때, 어떤 조건에서 자신의 정확한 순위를 알 수 있는지 알아내야 한다. 본인이 해결한 방법은 이렇다. 전체 인원 수는 n명이고 자신이 이기는 사람(우위)을 a명이라고 하고 자신을 이기는 사람(열위)을 b명이라고 하자 이 때 a+b=n-1 식이 성립해야 한다. 예를 들어 총 10명이 있다고 하자. 자신이 7명은 확실히 이길 수 있고 2명에게는 확실히 패배한다. 그렇다면 순위는 10위~4위(7명) 2020. 10. 8.
[그래프, 난이도 중] 프로그래머즈, 가장 먼 노드 노드 번호와, BFS의 깊이 변수를 가지는 구조체 node를 만들고 BFS를 수행했다. 큐에 담을 인접 노드가 하나도 없는 노드(이미 방문한 노드들 뿐)는 단일 노드라는 의미이므로, 이 노드는 가장 먼 노드의 후보가 된다. 아래 소스 코드에서 finished라는 bool 타입의 변수는, 큐에 담을 인접노드가 하나 이상 있는가의 여부를 판단한다. 가장 먼 노드의 후보로 꼽힌 노드들의 depth를 모아서 이들중 최댓값을 찾고, depth가 최댓값인 요소가 몇개 있는지 계산하면 문제가 해결된다. 테스트 케이스 9개 모두 통과 #include #include #include using namespace std; struct node{ int num; int depth; }; queue q; vector a[20.. 2020. 10. 7.
[Heap, 난이도 중하] 프로그래머즈, 더 맵게 scoville의 길이 제한이 1,000,000인 것을 보아 힙을 쓰지 않으면 통과할 수 없는 문제라는 것을 알 수 있다. 이 문제 역시 힙의 원리로 돌아가는 priority_queue 라이브러리로 해결하면 쉽게 풀 수 있다. 삽입, 삭제 모두 시간 복잡도가 O(logn)이기 때문에 최고의 시간 복잡도로 해결할 수 있는 것이다. 오름차순으로 정렬하여, pop할 때 가장 작은 원소가 나오게 하였고 이렇게 덜 매운 순위 1,2위를 뽑아서 주어진 공식에 맞게 새로운 스코빌 지수를 계산하여 pq에 push해주는 과정을 반복했다. pq의 top은 최소 스코빌지수를 나타내므로 pq.top()이 K이상일 경우 반복문을 종료하고, pq.top()이 K미만인데 pq에 원소가 1개 이하라면 더 이상 섞을 수 있는 상태가 .. 2020. 10. 7.
[그리디, 난이도 중] 프로그래머즈, 큰 수 만들기 문자열로 주어진 정수에서 k개의 수를 제거해서 만들 수 있는 가장 큰 수를 계산하는 문제이다. 백준에서 이런 유형의 문제를 풀었던 기억이 있었던 덕에 금방 해결할 수 있었다. 본인의 접근법은 스택의 원리를 이용하는 것이다. 순서대로 정수를 벡터에 넣으며, 기존 벡터의 마지막 인덱스 값(스택 상에선 top)이 현재 push한 정수보다 작을 경우 이 마지막 인덱스 값을 제거해주는 과정을 반복한다. 제거할 때마다 k의 카운트는 1씩 감소시켜야 한다. 해당 규칙으로 입력값의 정수들을 모두 벡터에 넣었음에도 불구하고 수를 k만큼 제거하지 못했을 경우도 있다. 이 과정까지 잘 수행 했다면 벡터의 요소는 ex) (5,4,3,2,1), (7,5,3,2,1), (9,9,7,7,5,5) 같이 내리막수일 것인데, 남은 k가.. 2020. 10. 5.
[그리디, 난이도 중] 프로그래머즈, 구명보트 그리디 알고리즘이기 때문에 먼저 people을 오름차순으로 정렬하였다. 본인이 첫 번째로 생각한 접근법은 단순히 체중이 가벼운 순으로 묶는 방법이었다. 50 50 70 80 이 주어졌다면, (50,50),(70),(80) 총 3개의 보트로 테스트 케이스와 일치 50 70 80 이 주어졌다면, (50),(70),(80) 총 3개의 보트 테스트 케이스와 일치 그러나 이 접근법은 5 10 90 95 라는 반례와 막히게 된다. 이 경우에는 내 첫 번째 접근법으로는 답이 3이 나오는데, (5,95),(10,90) 총 2개의 보트로도 가능한 것이다. 정답처리된 본인의 두 번째 접근법은 무게가 가장 가벼운 사람과 가장 무거운 사람끼리 보트에 태우는 것이다. 단, 이 둘의 합이 무게 제한을 넘어갔을 경우에는 무거운 사.. 2020. 10. 4.
[그리디, 난이도 중] 프로그래머즈, 조이스틱 해결 방법 먼저 조이스틱의 상하 이동 횟수들을 모두 합산해놓고 좌우 이동 횟수만 추가로 더하는 방식이 간편하다. 알파벳의 개수가 총 26개라는 점을 잘 이용하면 상하 이동 횟수를 구하는 것은 간단하지만, 조이스틱의 좌우 이동 횟수를 구하는 것은 쉽지 않을 수 있다. 조이스틱의 최소 좌우 이동 횟수는 다음과 같이 2가지 경우로 나누어야 한다. 한쪽으로만 이동하는 경우(오른쪽, 왼쪽) 중간에 한 번 꺾는 경우(오른쪽->왼쪽, 왼쪽->오른쪽) 즉, 한 방향으로만 커서를 이동하는 경우 외에도 중간에 한 번 꺾어야 하는 경우도 고려해야 한다. 물론, 두 번 이상 꺾는 경우는 최소 좌우 이동 수가 될 수 없다. 예를 들어, "BABAAAAAAAAAABAB" 의 경우를 살펴보자. 오른쪽으로만 이동하는 경우에는 4번째.. 2020. 10. 1.
[그리디, 난이도 중] 프로그래머즈, 섬 연결하기 최소 비용으로 모든 노드를 연결할 때에 사용되는 대표적인 알고리즘 2개가 있다. 1. 크루스칼 알고리즘 먼저, 모든 간선들을 오름차 순으로 정렬 한다. 비용이 적은 간선부터 그 간선으로 인한 사이클의 발생 여부를 판단하여 사이클이 생기지 않는다면, 그 간선을 채택하는 알고리즘이다. 자세한 설명과 예시는 위키피디아를 참고하면 좋을 것이다. ko.wikipedia.org/wiki/%ED%81%AC%EB%9F%AC%EC%8A%A4%EC%BB%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98 크러스컬 알고리즘 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 컴퓨터 과학에서, 크러스컬 알고리즘(영어: Kruskal’s algorithm)은 최소 비용 신장 부분 그래프를 .. 2020. 9. 30.
DFS/BFS 고득점 kit 풀이 완료, 후기 본인이 이전에 DFS/BFS에 대해 설명한 포스팅이 있다. 저 때는 설명에 필요한 그림을 손으로 직접 그렸는데... 얼마 안돼서 한계를 깨닫고 파포로 갈아탔다. kimcoder.tistory.com/15?category=879722 [BFS, 난이도 하] 백준 1260번 DFS와 BFS BFS, DFS 알고리즘의 기본 원리를 공부한 사람이라면 쉽게 풀 수 있을 만한 문제이다. BFS(너비우선탐색)는 자신의 노드 주변에 자신이 갈 수 있는 경로들부터 탐색하는 알고리즘으로, 방문하지 않� kimcoder.tistory.com 프로그래머즈에 와서 문자열 DFS/BFS 문제를 처음 접해보았는데 이런 문제들은 고민을 좀 하고 풀었다. 지금까지 노드에 번호가 매겨져 있는 문제만 풀었는데 특히 '여행 경로' 문제는 .. 2020. 9. 30.