본문 바로가기

반응형

전체 글

5644. 무선충전 5644. 무선충전 시뮬레이션 문제. 조금 문제를 충실히 생각해봐야 했던 문제였다. 일단 내가 생각하던 x, y 좌표가 아니어서 내 방식으로 바꿔주는 부분에서도 헷갈렸다. 문제의 그림만 처음 봤을때는 BFS를 생각했지만, 문제 상에서 그냥 거리 D를 이용하면 따로 BFS를 사용하지 않아서 간단해졌다. p[i][j] 를 통해서 i 시간에 좌표들의 위치를 저장하였다, 즉 j=0 일때는 0번 사람, j=1 일때는 1번 사람의 위치가 된다. 전체적인 흐름으로는 주어진 시간을 0초부터 끝까지 돌면서 각 점에서 닿을 수 있는 BC중 가장 Power 가 쌘놈을 찾는다. 단 이 과정에서 닿 을 수 있는 BC가 여러개인 놈을 체크하기 위해, cnt 라는 갯수를 세는 변수를 추가했다. 가장 쌘놈이 교집합일 때는 케이스를 .. 더보기
트랜지스터 참고 사이트 http://electroncookery.com/archives/413 (트랜지스터 참고 사이트) 더보기
15684번 15684번 -사다리 조작 이번 상반기에 대기업 알고리즘 문제로 나왔던 문제. 막상 가서 실전에서 문제를 풀 때에는 배열을 더 크게 잡아서 약간 미로탐색처럼 문제를 풀었었다. 하지만 지금 다시 보면서 생각해보니, 각 점들을 노드라고 생각하여 방향 그래프를 완성하면 문제가 쉬워진다. 근데 이 문제에서 계속 헷갈렸던게 입력값이었다.. N,M,H 가 주어지는데 나는 평상시에 N을 세로, M을 가로로 놓고 문제를 많이 풀다보니 헷 갈려서 그냥 변수를 바꿔버렸다. X축은 X로 Y축은 Y로 바꿔서 문제를 풀었다. 그리고 좌표값들을 노드 번호로 바꿔서 문제를 풀었다. 즉 세로가 3, 가로가 4인 사다리로 보았을 때, (1,1)은 1번 노드로, (1,2)는 2번 노드로, (1,3)은 3번 노드로 이런식으로 좌표를 노드.. 더보기
1247.최적경로 1247. 최적경로문제에서 나와있듯이 그냥 모든 경로를 탐색하면서 최소값을 찾아주어도 시간제한이나 메모리제한에 걸리지 않는다. 그래서 그냥 부르트포 스를 이용해서 문제를 해결했다. 한 집의 위치정보와 그 집을 방문했는지 여부를 구조체를 이용해서 만들어주었다. house 변수의 0번째를 출발하는 집으로, 1번째를 도착하는 집으로 설정하였고, 재귀함수를 이용해서 모든 경우를 탐색하였다. 재귀함수의 매개변수로 이전의 값들을 저장하면서 거리를 구하면서 재귀함수를 실행시켰다. 그리고 마지막으로 도착점과 그 이전 점과의 거리를 더해주고 정답과 비교하면서 최소값을 찾아냈다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444.. 더보기
5213. 진수의 홀수 약수 5213. 진수의 홀수 약수 숫자의 범위가 커서 시간제한이 문제일 것 같았다. 따라서 testcase 를 받기전에 get_f 함수를 통해서 각각의 f[x] 값들을 미리 구해주었다. 그리고 조금 더 시간을 단축하기 위해서 sum 이라는 배열을 통해서 sum[x] 는 1~X 까지 f[X] 의 합을 구했다. 따라서 정답을 구할 때는 sum[R]-sum[L-1] 을 통해서 구할 수 있었다. get_f 에서 최대 루트 1000000 까지 돌고, main 함수에서 1000000 번 돌기 때문에 1억번으로 시간제한을 통과할 것이라고 생각하고 코드를 구현하였다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546#incl.. 더보기
1248. 공통 조상 1248. 공통 조상 공통 조상 같은 경우에는 LCA라고 하여, 해당하는 노드의 높이를 맞춰준 후에 같이 부모 노드로 거슬러 올라가면서 같은 노 드가 될 때까지 while 문을 이용하여 구할 수 있습니다. 또한 문제에서 해당하는 조상 노드의 서브 트리의 크기를 구하라고 하였는데, 이는 분할정복을 이용하여 get_size() 함수에 서 자식 노드의 존재 여부를 파악하면서 재귀함수로 구현하였다. 처음에 get_size 에서 ret 값을 0으로 초기화 했었는데, 생각 해보니 그렇게 하면 노드가 자기 자신도 서브 트리의 크기에 포함을 해야하므로 ret 의 초기값을 1로 수정하였다. 1234567891011121314151617181920212223242526272829303132333435363738394041.. 더보기
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이 된다. 이런식으로 나보다 작은 값으로 바꾸면서 이동하면.. 더보기

반응형