본문 바로가기

알고리즘/BOJ

(19)
[백준] 2816번 디지털 티비 [풀이] 답이 하나만 정해져있는 것이 아닌 문제였는데요, 저는 예제처럼 33이 아닌 1과 4만 사용해서 Greedy하게 해결했습니다. 단순하게 KBS1 찾아서 제일 위로 올리고 KBS2 찾아서 그 위로 올려버렸습니다. 이렇게 하면 만약 채널 수가 최대값(100) 이더라도 눌러야할 버튼 수가 400번이 안됩니다.(문제 조건은 500개 미만) 아래는 해당 코드입니다 :) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include #include using namespace std; int main(void) { int n; cin >> n; int kbs1_idx, kbs2_idx; for (int i = 0; i > chnl; if (chnl..
[백준] 3109번 빵집 [풀이] 이 문제는 DFS를 활용해서 Greedy 하게 풀 수 있는 문제입니다. DFS를 활용한다는 건 점을 하나하나 이어가면서 x면 되돌아오는 식으로 하는 것으로 쉽게 이해할 수 있는데, 여기서 가장 중요한게 Greedy 부분입니다. 만약 DFS만 활용했을 경우에는 20 20 ..................x. ..................x. ..................x. (중략...) .................... 이런 입력에 대해서 시간초과가 나오게 됩니다. x가 끝쪽에 있으니 거의 모든 경우의 경로를 다 돌아보게 되기 때문입니다. 그렇기 때문에 Greedy를 활용해 주어야 합니다. 이미 실패한 경로는 다시 가더라도 어짜피 결과는 FAIL 입니다. 그러므로 성공한 경로든 실패한..
[백준] 8980번 택배 [풀이] 처음에 많이 헤맸지만.. 결국 각 마을 마다 실을 수 있는 공간을 체크해나가며 해결할 수 있는 문제였습니다. 문제를 해결하기 위해선 우선 도착지를 기준으로 오름차순 정렬 해주어야 합니다. 출발지는 상관 없습니다. 왜 그런지는 이 후에 제가 설명드리는 과정을 보면 이해할 수 있을 겁니다:) 1. 출발지부터 도착지 - 1 까지에서 트럭 잔여용량이 가장 적은 곳 찾기 2. 실을 박스의 수 정하기 (1에서 찾은 잔여용량보다 박스의 수가 많다면 1에서의 결과값만큼 박수 싣기) 3. 출발지부터 도착지 - 1 까지 실을 박수의 수만큼 잔여용량을 줄여주기 이렇게 3가지를 차례대로 반복해줍니다. 문제상의 예제를 바탕으로 풀이해보겠습니다. 마을 1 2 3 잔여용량 40 40 40 우선, 초기상태 입니다. 마을은 ..
[백준] 1543번 문서 검색 [문제] 문서와 검색하려는 단어가 주어졌을 때, 그 단어가 최대 몇 번 중복되지 않게 등장하는지 구하는 문제 입니다. 예로, 문서가 abababa가 있을때 찾으려는 문장이 ababa 라면 중복되지 않게 1번 등장합니다. [풀이] 이 문제는 KMP 문자열 탐색 알고리즘을 쓰면 간단하게 해결되는 문제 입니다. 제 블로그의 문자열 탐색 알고리즘 KMP에 코드와 함께 설명을 작성해 두었습니다 :) 아래는 문제 풀이한 코드입니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5..
[백준] 1202번 보석도둑 [문제] 각 보석은 무게 M와 가격 V를 가지고 있다. 가방이 K개 있고, 각 가방에 담을 수 있는 최대 무게는 C이다. 가방에는 최대 한 개의 보석만 넣을 수 있다. 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오. [풀이] 복잡하게 생각할수록 어려워지는 문제인것 같습니다. 풀이 방향은 맞췄지만 너무 복잡하여 예외 처리가 되질 않아 자꾸 틀렸습니다.. ㅠㅠ 꾸준함(https://jaimemin.tistory.com/760)님의 블로그를 참조하여 코드를 단순하고 깔끔하게 수정하였습니다. 풀이 방식의 핵심은 Max-Heap을 사용하는 것입니다. 해당 가방의 무게만큼 heap에 넣고 최대값만 쏙쏙 빼내는 방식입니다. 1. 가방과 보석을 모두 무게를 기준으로 오름차순 정렬합니다. 2. i번째 가..
[백준] 1969번 DNA [문제] Hamming Distance(이하 HD)란 길이가 같은 두 DNA가 있을 때, 각 위치의 문자가 다른 것의 개수입니다. 예로, AGCAT와 GGAAT의 HD는 0, 3번째가 다르므로 2입니다. DNA들이 주어져 있을 때 HD의 합이 가장 작은 새로운 DNA s를, 그리고 이 s는 사전순서로 가장 앞에 오는 것 구하기! DNA가 a, b, c, d 이렇게 4개 주어졌다 하면, s와 a의 HD, s와 b의 HD, ... , s와 d의 HD 를 합한게 최소가 되는 s를 구하라는 의미입니다. [풀이] 생각보다 단순하게 Greedy하게 풀 수 있는 문제입니다. 문제상의 예시를 바탕으로 보면 TATGATAC TAAGCTAC AAAGATCC TGAGATAC TAAGATGT 우선 0번째 index를 보면 T..
[백준] 1449번 수리공 항승 [문제] 파이프의 가장 왼쪽에서 정수만큼 떨어진 거리만 물이 샌다. 각 새는 포인트를 길이가 L인 테이프를 붙여 막는다. 막을때 앞뒤 각 0.5의 간격을 두어야 하고 테이프를 자르거나 겹쳐붙일 수 없다. 사용되는 테이프의 개수는? [풀이] 간단한 문제인데 생각보다 너무 복잡하게 풀어서 재정리 후 코드를 간소화 시켜보았습니다. 테이프의 시작점을 잡고 start(시작점) + L(테이프길이)로 비교하며 두가지 케이스로 나누었습니다. 1. 현재 구멍난 곳이 start + L 보다 크거나 같을 때 2. 현재 구멍난 곳이 start + L 보다 작을 때 1번의 경우는 마지막 구멍일 경우에 tape 개수를 한번 더 + 해주었고 2번의 경우는 마지막 구멍이 아닐 경우에는 continue, 마지막일 경우에만 + 해주어 ..
[백준] 2352번 반도체 설계 [문제] 위 사진처럼 반도체 설계를 하는데 선들이 겹치지 않으면서 최대 몇개까지 연결할 수 있는지 구하는 문제입니다. [풀이] 복잡하게 생각이 들지만 Greedy 방식으로 생각보다 단순하게 풀 수 있는 문제였습니다. 우선 안겹치는 선들을 cache라는 변수에 저장을 해나가는 방식입니다. 크게 아래 두가지 경우로 나누면 되는데, 1. 다음 포트와 연결된 선이 현재 최신 cache와 연결된 선과 겹칠 경우 2. 다음 포트와 연결된 선이 현재 최신 cache와 연결된 선과 겹치지 않을 경우 1번의 경우에는 겹치지 않으니 그냥 cache에 추가해주면 되고, 2번의 경우에는 STL의 lower_bound를 활용해서 다음 포트와 연결된 선을 기준으로 그것보다 큰 가장 작은 정수 값을 찾아 교체합니다. * lower..