문제 https://www.acmicpc.net/problem/1850 어떻게 했냐면... 처음 딱 생각했을때는 3을 111로 바꾸고 4를 1111로 바꿔서 111과 1111의 최대공약수를 구하려고 했는데, 그렇게 하는게 아니고! 3과 4의 최대공약수가 1이면 답은 1, 3과 6의 최대공약수가 3이면 답은 111이다. 그래서 먼저 입력받은 두수의 최대공약수를 구하고 그 값만큼 반복문으로 printf("1") 해주었다. (직접 정수값으로 1+10+100 이런식으로 구할려고 했는데 시간초과가 떴다.)입력되는 값이 2 63 이므로 long long 타입으로 했다. 결과 입력범위 생각못하고 int형으로 했다가 많이 틀렸다ㅜ 코드 https://github.com/ziwonii24/Algorithm/blob/master/Baekjoon/1850.cpp
문제 https://www.acmicpc.net/problem/1717 풀이 이 문제는 disjoint-set문제로서 union-find로 풀었다. disjoint-set(서로소 집합) : 교집합이 공집합인 집합 Union(a, b) : a가 속한 집합과 b가 속한 집합을 합집합 Find(a) : a가 속한 집합의 번호를 반환 i 1 2 3 4 5 6 7 arr[i] 1 2 3 4 5 6 7 입력 n = 7일때, 서로소 집합의 초기값은 위의 표와 같이 되어있다. Find(1)을 하면 arr[1]==1이므로 1을 return한다. 만약에 같지 않을 경우, 재귀적으로 원소의 부모를 쫓아 올라간다. Union(1, 3)을 하면 먼저 Find를 각각한다. 그러면 pa=1, pb=3이 된다. 둘은 다른 그룹에 있기 때문에 arr[1]=3으로 그룹 번호를 업데이트 해준다. i 1 2 3 4 5 6 7 arr[i] 3 2 3 4 5 6 7 이런 식으로 쭉 진행한다. union-find를 이용하여 kruskal algorithm으로 mst찾는데 쓰인다. 결과 Union연산에서 if(pa != pb) 면 그룹번호를 갱신하도록 조건이 있는데 시간을 단축시키기 위함이다. 이 문제에서는 없어도 맞았다고 한다! 코드 https://github.com/ziwonii24/Algorithm/blob/master/Baekjoon/1
댓글
댓글 쓰기