순열
-
백준 17142 연구소 3Algorithm/BOJ 2021. 3. 17. 16:09
출처: www.acmicpc.net/problem/17142 분류: 완전탐색, BFS, DFS 접근방식 조합과 BFS를 사용해 해결할 수는 문제였습니다. 바이러스가 활성화될 수 있는 지역과 최대 활성화시킬 수 있는 바이러스의 수가 주어졌을 때, 활성화 바이러스의 조합을 뽑아 BFS를 돌려 최단 거리를 계산합니다. 활성화 바이러스의 조합은 순서 상관없이 뽑는 경우의 수이기 때문에 순열이 아닌 조합으로 처리해줘야 합니다! var selected = [Point]() func selectVirus(curr: Int) { if selected.count == nm[1] { let time = infectTime(selected) if time != -1 { if minimumTime == -1 { minimum..
-
백준 10819 차이를 최대로Algorithm/BOJ 2021. 3. 16. 13:20
출처: www.acmicpc.net/problem/10819 분류: 완전탐색, 순열 접근방식 n이 최대 8밖에 되지 않아 가능한 배열 조합을 모두 구해서 주어진 식대로 계수의 최댓값을 계산했습니다. 주어진 예제에서는 [8, 15, 1, 20, 4, 10] 경우에 가장 큰 최댓값이 나오는데 어떤 경우에 최대가 나오는 특별한 규칙이 있는건지는 잘 모르겠습니다.. ㅠㅠ 순열을 오랜만에 해서 처음에는 배열을 만들어가고 해당 수를 넣었는지 체크하는 bool 배열을 만들고... 굉장히 비효율적으로 풀었었네요 ㅠㅠ 덕분에 오랜만에 순열을 다시 복습해볼 수 있어서 좋았네요 :) 전통적인 순열은 스왑을 통해 백트래킹 방식으로 구할 수 있습니다. 앞에서부터 해당 자리에 들어갈 수를 채워넣어가는 방식으로 바꿀 자리의 인덱스..
-
백준 6603 로또Algorithm/BOJ 2020. 7. 15. 12:26
출처: www.acmicpc.net/problem/6603 분류: 완전 탐색 접근방식 주어진 문제에서 로또번호 6개를 골라서 출력하는 문제입니다. 전형적인 순열문제였습니다. 제 순열 관련 글도 있습니다 :) 위 글에서 사용한 스왑방식 대신 select 를 체크할 배열을 만들어서 인덱스만 넘겨주는 방식으로 풀었습니다. 스왑해서 재귀호출하고 다시 스왑을 한 번 더 해서 원상태로 바꿔주듯이 인덱스를 선택해서 true로 바꿔주고 호출한 다음에 다시 false로 바꾸고 호출해주는 과정이 필요합니다 ! 해결방법 func select(index: Int, count: Int) { //print("index: \(index), count: \(count)") if count == lottoNumberCount { fo..
-
Permutation 순열Algorithm/Theory 2020. 6. 11. 12:48
안녕하세요. 문제를 풀다가 순열 관련 부분에서 머리가 터져버려(?) 순열에 대해 공부해보고자 합니다. 순열은 순서가 있는 열, 순서를 가지고 줄세우는 경우의 수 라고 생각하시면 됩니다. 1번과 2번의 사람이 있다면 이 둘을 줄세우는 경우의 수는 1, 2 2, 1 이렇게 2가지 경우가 있겠죠. 1, 2, 3 세 명의 사람이라면 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1 이렇게 총 6가지 경우가 있습니다. 맨 앞 자리에 올 수 있는 사람의 수는 3 맨 앞자리가 정해졌다면 그 다음에 올 수 있는 사람의 수는 2 그 다음은 1 즉 순열의 경우의 수는 n! 이 됩니다. 여기까지는 많이들 알고계셨던 내용이겠죠? 이제 이를 코드로 구현하려면 어떻게 해야하는지 살펴보겠습니다...