본문 바로가기
  • 실행력이 모든걸 결정한다
반응형

Algorithm/Brute force11

[완전탐색] 카드 짝 맞추기 - 2021 KAKAO BLIND RECRUITMENT 해결 방법 필자는 DFS와 BFS를 기반으로 완전탐색을 이용해서 해결했다. BFS를 통해 현재 커서로부터 각 칸까지 이동할 때 필요한 최소 키 조작 횟수를 구했다. 예를 들어, 입출력 예 #1에서 최초로 실행되는 BFS 결과는 다음과 같다. 1칸 이동, 일괄 이동의 경우를 모두 반영했다. 그리고 DFS에서는 뒤집혀 있는 카드의 상태에 따라 동작 방식이 다르다. 소스 코드에서는 뒤집혀 있는 카드의 상태를 state 변수에 저장했다. state가 0인 경우에는 어떠한 카드도 뒤집혀 있지 않은 상태고, state가 0이 아닌 경우에는 뒤집혀 있는 카드의 번호가 저장되어 있다. DFS는 다음과 같이 동작한다. state==0 : 현재 뒤집힌 카드가 없다면 남아있는 모든 카드를 한 번씩은 뒤집어본다. state!.. 2022. 11. 2.
[완전탐색] 양궁대회 - 2022 KAKAO BLIND RECRUITMENT 해결 방법 화살을 쏴서 얻을 수 있는 점수로는 총 11가지(0점부터 10점) 경우가 있기 때문에, n개의 화살이 11가지 경우에 분배되는 모든 경우를 따지면 된다. 과녁에 있는 하나의 원에 여러 화살이 꽂힐 수도 있으므로 중복 조합(H)을 구하면 된다. 예를 들어, 입출력 예 #1 에서는 11H5=3003 가지 경우를 따지면 된다. 중복 조합을 구하는 소스 코드는 https://hydroponicglass.tistory.com/20를 참고했다. 중복 조합으로 계산한 모든 경우에 대해 어피치와의 점수 차이를 구하고 문제에 안내된 대로 동일 점수에 대한 처리도 진행해주면 된다. 소스 코드 #include #include #include using namespace std; vector perm; // 중복 .. 2022. 10. 18.
[완전탐색] 메뉴 리뉴얼 - 2021 KAKAO BLIND RECRUITMENT 해결 방법 단품 메뉴 조합에서 2개 이상을 고른 모든 조합을 모두 추출하고, 나타난 조합의 빈도를 계산하면 된다. map을 이용하면 이를 쉽게 계산할 수 있을 것이다. 의 next_permutation() 함수를 이용하면 간단하게 모든 조합을 구할 수 있다. 사용 방법은 아래 포스팅을 참고하길 바란다. https://kimcoder.tistory.com/118 next_permutation을 이용한 조합 구현 #include #include #include #include using namespace std; vector arr; vector check; void set_check(int n, int r){ for(int i=0;i next_permutation 함수는 배열을 순열해주는 함수이다. 일반적.. 2022. 9. 23.
[완전탐색] 외벽 점검 - 2020 KAKAO BLIND RECRUITMENT 기존에 필자가 풀이한 방법은 통과는 했지만 실행 시간이 꽤 길어서 다른 좋은 풀이 방법을 찾아보았다. 참고한 풀이 방법의 출처는 맨 아래에 표시하겠다. 해결 방법 필자가 설명할 풀이 방법은 완전 탐색을 사용한 방법이다. 이런 식으로 원을 탐색하는 문제는 2n 크기의 1차원 배열로 풀어서 생각하면 쉽다. 늘어난 부분은 원의 위치 0을 기준으로 2바퀴 째 도는 부분인 것이다. 즉, weak 배열의 크기를 2배로 늘리고 늘어난 부분은 기존의 원소에 n을 더해서 추가하면 된다. ※ 예) n=12이고 weak=[1, 5, 6, 10]인 경우에는 weak=[1, 5, 6, 10, 13, 17, 18, 22]로 만든다. 이렇게 되면 기존의 weak의 크기를 w라고 했을 때, [0, w) 범위의 정수인 임의의 i에 대.. 2022. 9. 8.
[완전탐색] 후보키 - 2019 KAKAO BLIND RECRUITMENT 해결 방법 i) 테이블의 모든 속성에 대한 조합(Combination)을 구한다. - 예를 들어, 테이블의 속성 번호를 0, 1, 2, 3으로 매겼을 때, 모든 속성에 대한 조합은 {0, 1, 2, 3, {0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}, {0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3}, {1, 2, 3, 4}}가 된다. - 조합을 C++ 코드로 구현하는 방법은 https://kimcoder.tistory.com/118?category=888042 에 설명했으니 이를 참고하면 된다. ii) 모든 속성 조합에 대하여 유일성을 검증한다. - 각각의 속성 조합들에 대한 중복 여부를 검증한다. - 예를 들어, 필자는 ["이름", "전.. 2022. 6. 24.
완전탐색 고득점 kit 풀이 완료, 후기 완전탐색을 브루트 포스(brute force)라고도 많이 부르고, brute는 무식한 이라는 뜻이다. 알고리즘 설명에도 마침 '무식해 보여도 사실은 최고의 방법일 때가 있지요.' 라고 되어있다. 브루트 포스는 정말 특별한 접근법 없이 무식하게 모든 경우를 탐색하면 된다. 이 알고리즘의 장단점에 대해 설명하자면, 장점 : 다른 알고리즘에 비해 머리를 많이 쓰지 않아도 된다. 단점 : 모든 경우를 탐색하는 방법이다보니 시간복잡도가 크다. 브루트 포스 문제에서는 데이터 범위를 크게 주지 않는 편이다. 브루트 포스에서는 간단한 반복문만 써도 되는 경우도 있지만, 순열이나 조합을 써서 모든 경우를 탐색해야 하는 경우도 많다. 본인이 순열, 조합에 대해 정리한 포스팅 링크를 남겨두었으니 참고하면 좋을 것이다. 순열.. 2020. 9. 24.
[완전탐색, 난이도 하] 프로그래머즈, 모의고사 세 학생의 문제를 찍는 주기를 파악해야 하는 문제이다. 1번 수포자는 (1,2,3,4,5) 를 반복하여 찍고, 2번 수포자는 (2,1,2,3,2,4,2,5) 를 반복하여 찍고, 3번 수포자는 (3,3,1,1,2,2,4,4,5,5) 를 반복하여 찍는다. 주기는 각각 5,8,10 이다. 시험은 총 answers.size() 문제가 있고, %(나머지 연산자)를 이용하여 주기 사이클을 돌려가며 답과 비교하면 된다. 테스트 케이스 14개 모두 통과 #include using namespace std; int maxi(int a,int b){ if(a>b) return a; else return b; } int select_group1[5] = {1,2,3,4,5}; int select_group2[8] = {2,.. 2020. 9. 24.
next_permutation을 이용한 조합 구현 #include #include #include using namespace std; vector arr; vector check; void set_check(int n, int r){ for(int i=0;i 2020. 9. 23.
[완전탐색, 난이도 중] 프로그래머즈, 소수 찾기 종이 조각을 조합할 수 있는 모든 경우의 수를 탐색해야 하는 브루트포스 문제이다. prime_check 함수는 소수 여부를 판단하는 함수이다. 각 자릿수는 0~9로 이루어져 있으니 문자열 numbers를 문자 단위로 쪼개서 arr 벡터에 넣고 계산을 수행했다. 순열을 이용하여 arr 벡터의 요소들을 조합하여 자료형만 문자열인 정수를 만들어낸뒤, stoi 함수를 이용하여 자료형을 string에서 int로 변환해주었다. permutation이 순열 함수이고 매개변수는 (총 요소의 수, 고를 요소의 수, 재귀함수 깊이) 이다. 순열 알고리즘에 대해 다룬 포스팅 링크이다. kimcoder.tistory.com/115 재귀를 이용한 간단한 순열 알고리즘 이 소스코드는 중복 요소도 허용한다. 중복 요소를 지우고 싶.. 2020. 9. 22.