본문 바로가기

알고리즘 관련/Programmers

(9)
추석 트래픽 programmers.co.kr/learn/courses/30/lessons/17676 window[j].first) count++; } answer = max(answer, count); } 정답 코드 더보기 #include #include #include #include #include using namespace std; vector startv; vector window; int get_ms_dur(string& str) { int total = 0; int digit = 1000; for(int i = 0; i < str.size(); i++){ if('0'
징검다리 건너기 programmers.co.kr/learn/courses/30/lessons/64062 코딩테스트 연습 - 징검다리 건너기 [2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3 programmers.co.kr 처음에 이 문제를 접근할 때 DP로 생각했었다. 왜냐하면 K개 이상의 연속된 돌 중에서 가장 큰 값이 건널 수 있는 인원 수이기 때문이다. K개의 돌 중에서 가장 값이 큰걸 기준으로 DP배열에 기록해두고, 이후에 진행할 때는 덱을 사용하여 먼저 넣었던 원소를 빼고, 그 다음 원소를 추가 및 최댓값을 갱신하여 다시 DP 배열에 기록하는 방식이다. 그런데 정확성은 모두 통과했지만 효율성을 통과하지 못했다. 의심되는 원인으로는 최댓값을 구하기 위한 방법으로 max_element를 K개의 범위에서..
합승 택시 요금 programmers.co.kr/learn/courses/30/lessons/72413 코딩테스트 연습 - 합승 택시 요금 6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4 programmers.co.kr 문제의 특징은 묵시적 그래프인 것과 최단거리를 구하는 것, 합승하는 경우를 계산하는 것이다. 일반..
소수 만들기 문제의 조건에 n = 50이기 때문에 완전탐색으로 충분히 풀 수 있는 문제이다. 그런데 주의할 점은 재귀로 구현하면 시간초과가 발생한다.. 코드의 시간복잡도는 50^3 * sqrt(3000)일텐데, 어째서 시간 초과가 발생하는지는 결국 알 수 없었다. 그래서 3중for문으로 수정하였다. 재귀로 작성한 코드 더보기 #include #include #include using namespace std; #define PRIME 1 #define NOT_PRIME 2 int result = 0; vector v; int dp[3000] = { 0, }; bool IsPrime(const vector& picked) { int sum = 0; for (const auto& item : picked) sum += ..
가장 큰 정사각형 가장 단순하게 생각해 볼 수 있는 방법은 특정 좌표가 1이라면, 가능한 정사각형들을 반복문을 돌면서 하나씩 탐색해보는 방법이다. 이해를 돕기 위해 함수로 표현하면 다음과 같다. //size : 정사각형의 변의 길이 bool IsPossible(int row, int col, int size) { for(int i = row; i < row + size; i++){ for(int j = col; j < col + size; j++){ if(board[i][j] == 0){ return false; } } } return true; } 그러나 이 방법으로는 효율성 부분을 통과할 수 없었다. 두 번째 방법으로 가장 큰 정사각형을 찾는게 답이기 때문에 지금까지 계산했었던 가장 큰 변의 길이로 계산하는 방법이었다..
구명보트 처음 문제를 보고 생각한건, 무게 제한을 만족하는 최대 인원 수가 최적해라고 생각하여 우선순위 큐를 사용하여 가장 작은 무게를 가진 사람부터 빼내는 방법을 사용했지만 오답이라고 나왔다. 왜냐하면 구명보트의 인원 제한이 2명이라는걸 인지하지 못했다. 다른 코드를 참고해본 결과, 무게 제한에 가장 근접하면서도 인원 제한을 만족하는 원소들이 최적해라는걸 알았다. 이해를 돕기 위해 예를 들어보겠다. 무게제한 : 100 [30, 40, 50, 60] 무게가 가장 작은 인원부터 빼내면 횟수가 3번이지만 (30, 40), (50), (60) 무게 제한에 가장 근접하게 빼내면 2번이다! (30, 60), (40, 50) 이 점에서 Greedy의 특성이 나타난걸 알 수 있다. 또한 탐색 범위를 효과적으로 줄이기 위해 투..
가장 큰 수 만들기 문제의 조건은 배열의 원소들로 만들 수 있는 가장 큰 수를 만들어야 한다. 쉽게 생각해보면, 가장 큰 수대로 정렬하여 만들 수 있어보이지만 함정이 숨어있다. 9, 13을 생각해보면 만들 수 있는 가장 큰 수는 913이다! 그래서 처음엔 정수의 맨 앞자리와 맨 뒷자리를 비교하여 커스텀 비교함수를 만들었다. 그런데, 예외케이스가 있었는데 232, 252와 같은 경우 중간 자리를 비교할 수 없다. 그래서 구글링해본 결과 문자열로 치환하여 비교하는 신박한 방법이 있었다. 정답코드 더보기 #include #include #include #include using namespace std; //커스텀 비교함수, 문자열 비교방식으로 치환한다. bool cmp(string& a, string& b) { return a..
다리를 지나는 트럭 programmers.co.kr/learn/courses/30/lessons/42583 코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이 programmers.co.kr 다리의 무게 제한과 트럭들이 지나는 걸 구현해주면 쉬운 문제이다. 문제의 조건에 트럭이 순서대로 가기 때문에, 대기 중인 트럭과 다리를 건너는 트럭을 표현하기 위한 자료구조로 큐를 사용했다. 현재 무게 제한을 저장해두고, 대기 중인 트럭에서 제한에 걸리지 않는다면, bridge 큐에 추가한다. 반대로, 대기 중인 트럭에서 제한에 걸린다면, 추가하지 않는다. #..
프린터 programmers.co.kr/learn/courses/30/lessons/42587 코딩테스트 연습 - 프린터 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린 programmers.co.kr 이 문제에서 생각해 볼 점은 프린터의 인쇄 순위와 대기 목록의 후순위로 들어가야 하는 점이다. 각각을 자료구조로 나눠서 저장하고, 처리하도록 해보자 1. 프린터의 인쇄 순위 순위에 따라 정렬이 필요하기 때문에, 우선순위 큐를 이용하여 우선순위대로 정렬한 뒤, 대기 목록의 맨 앞의 우선순위와 일치한다면 pop한다. 2. 대기 목록 큐를 이용하여 대기하는 순서대로 pop한 뒤, 인쇄..