본문 바로가기

반응형

알고리즘/BOJ

4991번 4991번 - 로봇 청소기 문제에서 쓰레기의 값이 10개 이하이고, 맵에서 vertex 의 최대 갯수가 400개가 된다는 것을 파악하였다. 따라서 플로이드 워셜 알고리즘은 시간 복잡도가 O(N^3) 이고 , 400^3 은 6천만정도 되기 때문에 가능하다고 생각하고 문제를 풀었다. 하지만 이 문제는 독특하게도 테스트케 이스가 while문을 통해서 한꺼번에 여러개가 실행되므로 최대 6천만을 여러번 돌리다보면 시간초과가 발생하게 된다. 따라서 이제는 각 쓰레 기마다 BFS를 이용해서 로봇,쓰레기들의 최소거리의 모든 쌍을 구해야 했다. 따라서 dirt 라는 벡터에 로봇의 위치와 쓰레기들의 위치를 모두 저장해주었다. 그 다음 for문을 이용해서 모든 쓰레기들에서 BFS를 돌리고, 다른 쓰레기들과의 거리를 D라는 .. 더보기
15662번 15662번 - 톱니바퀴(2) 톱니바퀴 1과 똑같은 문제, 예전에 풀었던 문제 다시 풀어보는 느낌으로 풀어보았다. 비교해보니 마지막 정답을 구하는 부분과, N의 크기가 달라졌다. 재귀에서 일단 현재 톱니바퀴를 회전시킨다. (단, 회전시키기 전의 3시와 9시 값을 미리 저장한다.) 그 다음으로는 진행 방향의 톱니의 특정 위치의 값과 비교한다. 이때 합이 1이면 S극 과 N극으로 구성된 것이므로 회전시킨다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485#include#.. 더보기
15486번 15486번 - 퇴사(2) 기존의 퇴사 문제와 같다. 하지만 N제한이 커졌기 때문에 기존 문제처럼 완전탐색으로 해결할 수 없다. (시간복잡도가 최대 N^2 이 되기 때문에) 그리고 int 형 변수를 사용할지 long long 을 사용할지 확인해보면 P의 최대값이 1000이고, N의 1500000 이므로, 최대값은 15억으로 int 형 변수로 충분히 해결할 수 있다. 최종적으로 DP를 이용해서 문제를 해결할 수 있다. 12345678910111213141516171819202122232425262728293031323334353637383940#include#includeusing namespace std;#define MAX 1500001int N;int P[MAX];int T[MAX];int D[MAX.. 더보기
15658번 15658번 - 연산자 끼워넣기(2) 기존에 있던 연산자 끼워넣기 문제와 똑같다. 다만 최대값과 최소값을 모두 구해야 한다는 차이점이 있다. N의 범위가 최대 11이기 때문에, 시간복잡도는 최대 4^11 로 완전탐색으로 충분히 구현할 수 있게 된다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#includeusing namespace std;int N;int num[12];int op[4];int MAX = -2000000000;int MIN = 2000000000;void go(int k,int sum){ if (k == N) { if (sum > MAX) MAX = s.. 더보기
15663번 15663번 - N과M (9) N과 M 시리즈는 같은 문제인 듯 달라서 헷갈린다. N과 M (10)을 풀고 (9)를 풀었다. 처음에는 (9) 번에서 막혔었다.. 아이디어는 같은 depth 에서 같은 숫자를 사용하면 안된다는 것! 그래서 check 배열을 만들어서 1~10000까지 숫자를 사용했는지를 체크. 그리고 used 배열을 통해서 특정 인덱스를 사용했는지 안했는지를 체크했다. 12345678910111213141516171819202122232425262728293031323334353637383940414243#include#include using namespace std;int num[8];int used[8];int op[8];int n, k;void go(int depth,int befor.. 더보기
15684번 15684번 -사다리 조작 이번 상반기에 대기업 알고리즘 문제로 나왔던 문제. 막상 가서 실전에서 문제를 풀 때에는 배열을 더 크게 잡아서 약간 미로탐색처럼 문제를 풀었었다. 하지만 지금 다시 보면서 생각해보니, 각 점들을 노드라고 생각하여 방향 그래프를 완성하면 문제가 쉬워진다. 근데 이 문제에서 계속 헷갈렸던게 입력값이었다.. N,M,H 가 주어지는데 나는 평상시에 N을 세로, M을 가로로 놓고 문제를 많이 풀다보니 헷 갈려서 그냥 변수를 바꿔버렸다. X축은 X로 Y축은 Y로 바꿔서 문제를 풀었다. 그리고 좌표값들을 노드 번호로 바꿔서 문제를 풀었다. 즉 세로가 3, 가로가 4인 사다리로 보았을 때, (1,1)은 1번 노드로, (1,2)는 2번 노드로, (1,3)은 3번 노드로 이런식으로 좌표를 노드.. 더보기
1938번 1938번 - 통나무 옮기기 단순한 BFS로 풀려고 했는데, 생각해줘야 할 예외 사항이 많아서 경우의 수를 나누었다. 일단 처음에 입력받는 부분에서 통나무 B위치(bx,by,bd) 와 마지막 놓을 E의 위치를 (ex,ey,ed) 를 구해주었다. 이때 bx,by 는 통나무 중심의 좌표이고, bd 는 통나무가 놓인 방향을 나타냈다. bd 가 0 이면 세로, 1이면 가로 방향. 통나무 중심의 위치는 통나무가 가로이건 세로이건, for 문 두번을 돌때 2번째가 통나무가 중심인 것으로 찾았다. 또 중심값을 통해 통나무의 방향도 알아낼 수 있었다. 그리고 BFS를 수행하는 함수를 보면, 구조체를 만들어서 통나무의 좌표와 방향을 갖는 구조체를 큐의 인자로 넣는다. chek 배열 같은 경우는 3차원 배열을 설정하여 c.. 더보기
2665번 2665번 - 미로만들기 오랜만에 문제를 풀어보니까 머리가 굳은 거 같다. 문제를 처음에 너무 어렵게 생각해서 '벽부시고 이동하기' 와 같이 차원을 늘린 bfs를 사용하려고 고민했었다. 하지만 그냥 단순한 BFS에 조건만 추가해서 문제를 풀 수 있었다. 기본적으로 모든 map 의 값을 INF 로 지정된 큰 수를 저장한다. 그리고 BFS에서 4가지 방향을 보면서 조건문으로 나보다 적은 횟수로 이동가 능한 점을 큐에 넣는다. 즉 0,0 에서는 벽을 길로 바꿀 필요없이 이동가능하므로 dist 값을 0 으로 갖는다. 하지만 만약 0,1 이 벽이라면 0,1 까 지 가는 방법은 벽을 1번 바꾼값이 된다. 따라서 0,0 까지 가는 벽을 바꾸는 방법의 수 + 1이 된다. 이런식으로 나보다 작은 값으로 바꾸면서 이동하면.. 더보기

반응형