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

Algorithm/Greedy14

[그리디] 셔틀버스 - 2018 KAKAO BLIND RECRUITMENT 해결 방법 이 문제의 핵심은 막차의 만원 여부이다. i) n, t를 이용하여 버스의 timetable을 만든다. ii) 크루의 timetable을 정렬한다. iii) 버스의 timetable과 크루의 timetable을 차례대로 비교해가며 탑승할 수 있는 크루를 먼저 온 순서대로 태운다. 단, 막차는 몇 명이 타는지 카운트해야 한다. iv) 막차가 만원이 아니라면, 즉, 카운트한 값이 m과 다르다면 콘은 그대로 막차를 타고가면 된다. v) 막차가 만원이라면, 즉, 카운트한 값이 m과 일치하다면 콘은 막차에서 가장 늦게 탄(우선순위가 가장 낮은)사람의 도착시간보다 1초 일찍 오면 된다. 소스 코드 #include #include #include using namespace std; string time_c.. 2022. 5. 28.
[그리디] 기지국 설치 - Summer/Winter Coding(~2018) 해결 방법 아파트의 개수 N의 범위는 2억까지이기 때문에 O(N) 이상의 시간복잡도로 풀면 시간초과가 나올 것이다. 그래서 범위가 1만까지인 stations 벡터를 이용해서 해결하였다. 문제의 접근법은 다음과 같다. Step 1) 전파가 닿지 않는 연속된 아파트의 길이들을 벡터에 저장한다. - 예를 들어, 아래 예제의 경우에는 1~2, 6~9 구역에 전파가 닿지 않으므로 2, 4를 벡터에 저장하면 된다. Step 2) 벡터에 저장된 거리들을 하나씩 꺼내어 각 거리마다 설치할 수 있는 최소 기지국의 수를 합산한다. - 거리 n에 설치할 수 있는 최소 기지국의 수의 공식은 ceil((float)n/(2*w+1)) (ceil()은 올림 함수)가 된다. 소스 코드 #include #include using na.. 2022. 4. 26.
[그리디] 숫자 게임 - Summer/Winter Coding(~2018) 해결 방법 A, B 벡터를 각각 오름차순으로 정렬해서 낮은 숫자를 가진 사람들부터 출전시켜가며, A팀에서 숫자가 낮은 사람들은 반드시 매칭이 이루어지도록 하는 식으로 접근하면 쉽게 해결할 수 있다. A의 n번째 팀원을 an이라고 하고, B의 n번째 팀원을 bn이라고 하자. A팀과 B팀의 각 첫 번째 사람인 a1, b1부터 출전시켜서 a1의 숫자가 더 크다면, b1는 A팀의 모든 뒷 사람들을 이길 수 없는 상태임을 알 수 있다. 왜냐하면 A를 오름차순으로 정렬해놓았기 때문이다. 그래서 B팀의 다음 사람(b2)을 출전시켜서 a1와 비교하면 된다. 만약에 b1의 숫자가 더 크다면 B팀의 승점을 1만큼 카운트하고 A팀과 B팀의 다음 사람을 출전시키면 된다. 그리고 매칭에 시도한 B의 팀원은 더 이상 매칭할 일이.. 2022. 4. 24.
[그리디] 튜플 - 2019 카카오 개발자 겨울 인턴십 해결 방법 Step1) 문자열을 파싱하여 각 집합을 벡터 v로 만들고, 벡터 v들로 이루어진 2차원 벡터 allv를 구성한다. Step2) allv의 v들을 크기가 작은 순으로 정렬한다. allv를 구성하는 벡터들의 크기는 순서대로 1, 2, 3, ..., allv.size()가 될 것이다. Step3) allv의 마지막 벡터를 이용하여 각 요소의 개수를 카운트 한다. Step4) allv의 n번째 벡터에서 카운트(element_cnt)가 0이 아닌 요소를 answer의 n번째 요소로 넣고, 해당 요소의 카운트를 1 감소시키는 작업을 allv의 첫 번째 벡터부터 수행한다. Step4 예시 {{1}, {2, 1}, {1, 2, 2}, {4, 1, 2, 2}} -> 요소를 카운트해보면 1은 1개, 2는 2개.. 2022. 4. 10.
[그리디] 추석 트래픽 - 2018 카카오 블라인드 채용 해결 방법 프로그래밍 언어로는 날짜 계산에 익숙한 Java를 선택했다. 요청 날짜가 밀리초(millis)까지 표시되므로, 두 날짜의 차이는 두 Date 객체의 getTime() 값의 차이로 구할 수 있다. getTime()은 지정된 시간을 long 타입의 밀리초로 표시한다. 그리고, 처리시간은 시작시간과 끝시간을 포함하므로, 측정 범위에서 끝시간-시작시간=999ms가 된다는 점을 기억해두자. 날짜 계산은 이렇게 하는걸로 하고, 이제 요청 i와 요청 j가 1초 간격 내에 포함되는가를 따져봐야 한다. 먼저, 요청 i의 왼쪽점 기준으로 따져봐야 한다. 요청 i의 왼쪽점 기준으로 요청 i와 요청 j가 1초 간격 내에 포함되는 경우는 다음과 같다. 위 4가지 경우는 3가지 조건으로 다음과 나타낼 수 있다. -> .. 2022. 3. 9.
[그리디, 난이도 중] 프로그래머즈, 큰 수 만들기 문자열로 주어진 정수에서 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.