본문 바로가기

반응형

알고리즘

9938번 9938번 - 방 청소 이동할 수 있는 서랍을 parent 와 child 관계로 묶으면서 문제를 풀 수 있었다. 그리고 각 서랍이 술병이 들어있는지를 full 배열을 통해서 나타냈다. 규칙 3,4번을 어떻게 나타내야 할까 하다가, 끝까지 가보지 않더라도 find 함수를 통해, 제일 root값을 찾았을 때, 그 서랍이 비어있으면 규칙을 만족하므로, 다시 parent 를 재정의 하면서 문제를 풀 수 있었다. 처음에 술병을 이동시켜서 서랍을 바꿔주면, parent 와 child 관계를 일일이 거꾸로 표현을 어떻게 해야할지 고민했다. 그런데 조금 생각해보니까, root 만 바꿔주면, 모든 관계가 거꾸로 표현할 수 있다는 것을 깨달았다.. 또 문제가 되었던 점은, 처음에 merge 함수를 쓰지 않고, 그냥 p[x.. 더보기
10775번 10775번 - 공항 union-find set을 다시 공부하려고 문제를 푸는데, 사실 어떤식으로 사용해야 할지 몰랐다.. 일단 그리디적으로 갈 수 있는 가장 큰 게이트를 방문해야 한다는 사실은 알았다. 하지만 아무리 생각해도, 시간초과가 발생하는 방법밖에는 몰라서, 고민하다가 다른 분들 코드를 참고했다. 획기적이었다. 나는 생각도 못함 나는 자꾸, 공항 게이트와 비행기 시간을 뭔가 집합으로 연결하려고 했다. 즉, 게이트마다 집합을 만들고 확인하는 작업을 거치다 보니 O(10000 * 10000) 이라는 시간초과가 발생했다. 그런데 게이트들만 연결하면서, find 함수를 쓰다보니까 너무나 쉬운 문제가 되버렸다. 일단 게이트마다 parent 를 자기 자신으로 초기화 시켜준다. 그리고 그리디적으로 알았던 방.. 더보기
1417번 1417번 - 국회의원 선거 몇 개를 써가면서 규칙을 찾으려고 노력하다 보니, 첫번째로는 큰수들과 교환작업을 한 뒤, 같은 숫자들과 교환작업을 해야하는 우선순위가 있다는 것을 알았다. 또 큰 수 중에서 가장 큰 수와 교환작업을 하는게 더 이득이라는 것을 알게되었다. 따라서 처음에 sort 함수를 통해서 가장 큰 수와 지속적으로, 표를 바꿔주고, 그 후에 같은 값들이 존재하면, 바꿔주는 방식으로 문제를 풀었다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include#include#includeusing namespace std;int n, ans; int main(){ scanf(.. 더보기
2573번 2573번 - 빙산 연결요소의 갯수를 구하는 문제이기 때문에 dfs 를 이용해서 문제를 풀었다. 그리고 빙산이 계속 녹아야 하기 때문에, 맵을 계속 갱신해주는 remake 함수를 만들었다. 빙산의 연결 요소가 2개 이상이 되면 바로 출력해준다. 단 빙산이 하나도 없는 경우에는 0을 출력해준다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107#include#include usi.. 더보기
1174번 1174번 - 줄어드는 숫자 우선 줄어드는 숫자 중에서 가장 큰 수는 9876542310 이 된다. 그리고 이 숫자는 길이가 10자리 이기 때문에 재귀함수에서의 depth 를 11로 놓고 재귀를 이용해서 풀었다. 앞의 숫자부터 채워가면서, 그 다음수는 작아지게 재귀함수를 이용해서 짰다. 만족하는 모든 수를 vector 에 저장하고, 나중에 sort 를 이용해서 오름차순으로 정렬한다. 그 뒤에 N번째 수, vector 배열에서는 N-1 번째 수를 출력한다, 만약 존재하지 않는 값이면 -1을 출력하도록 vector 의 크기를 이용해서 설정한다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include#in.. 더보기
1398번 1398번 - 동전 동전을 최소개수로 사용하는 방법을 찾는 문제. 그리디 문제에서 많이 나오지만, 만약 동전이 배수를 이루지 않는다면, 그리디 방식으로 풀 수 없다. 그래서 동전을 써가면서 규칙을 찾아봤다. 일단 가장 큰 가치를 가지는 동전을 써야한다는 기본 베이스는 똑같이 시작했다. 25 * 100^k , 100이라는 값에 주목했다. 이는, 숫자의 길이가 짝수 일 때 사용해야 이익을 볼 수 있다는 생각을 떠올렸다. 만약 125원을 만들려면, 100원1개,10원2개,1원5개 or 25원 5개 or 100원1개,25원1개.. 결국 25 * 100^k 은 짝수일 때 사용할 수 밖에 없다, 홀수 길이일 때 사용하면 오히려 손해가 발생한다. 그래서 10^k 로 모두 구해보면서 ,짝수일때만 25*100^k 의 동.. 더보기
3980번 3980번 - 선발 명단 ability[i][j] 에는 i번 선수가 j번 포지션에서 뛸 때 능력치를 나타냈다. 그리고 재귀함수를 이용해서, 만들 수 있는 포지션을 모두 만들고, 포지션이 꽉 찼을 때, 최대값을 구하도록 하였다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include#includeusing namespace std;int ability[11][11];bool haveTeam[11];int ans;void makeTeam(int position, int sum){ if (position==11) { ans = sum > ans ? sum : ans; return; }.. 더보기
1614번 1614번 - 영식이의 손가락 이 문제는 규칙성을 파악해서 풀 수 있었다. 일단 손가락을 쓰는 순서가 1-2-3-4-5-4-3-2-1-2-3-4-5-4-3-2-1-.... 이런식으로 반복이 되는데 밑줄 친 부분이 반복이 일어난다. 이를 통해서 숫자를 구할 수 있다. 일단 저 8개에서 1과 5는 1번, 2,3,4는 2번이 나오게 된다. 일단 1은 0번째 다음에 나오고, 2는 1번째,7번째 다음에 나오고, 3은 2번째,6번째 다음에 나오고, 4는 3번째,5번째 다음에 나오고, 5는 4번째 다음에 나오게 된다. 이 모든 값을 plus 배열에 저장하였다. 값을 구하는 방법은 2를 3번 사용할 때는 동일부분 1번 반복하고(그러면 2를 두번 사용), 그 다음에 두번째에 있는 2의 앞의 갯수(7번째)까지 더해주면 된.. 더보기

반응형