목록브루트 포스 (4)
궤도
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bXARgn/btq5zFLKMT6/5cMr8i74PrdPrcvCpAVPT0/img.png)
문제 풀이 비트마스크로도 풀 수 있다는데 난 백트래킹으로 풀었다. 근데 bfs로도 풀 수 있나보다. 먼저 상하좌우에 대해 각 구슬의 새로운 위치를 찾는다. 직전에 갔던 방향으로 또 이동할 필요는 없으니 그 방향은 제외한다. 두 구슬의 위치변화가 없거나 파란구슬이 빠진 경우는 제외한다. 만약 두 구슬의 새로운 위치가 같다면 같은 칸에 구슬이 2개 있을 수는 없으니 원래의 선후관계를 따져 구슬을 이동한다. 이동 횟수가 10을 넘어가거나 현재의 최솟값을 넘어가면 더이상 탐색하지 않는다. 소스코드 #include #include #include #include using namespace std; typedef pair pp; int result = 11; vector board; pp dir[4] = {{-1..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0bY1Z/btq3mOPGeXv/XO9E3QfMNqJ7DojS1KK4J1/img.png)
문제 풀이 이 문제 덕분에 가끔은 정말 무식한 방법이 통할 때도 있단 것을 깨달았다. 원하는 채널로 가는 방법은 2가지가 있다. 1. +-버튼을 계속 누르기 2. 채널번호 입력후 +-버튼 누르기 일단 1번은 간단하다. 목표 채널과 현재 채널의 차이의 절댓값을 구하면 된다. 그리고 2번이 중요한데 난 가능한 모든 채널을 백트래킹으로 탐색해 최솟값을 갱신하려 했다. void backtracking(int pos, int digit) { if (digit == 0) //1 1 1 => 2 return; if (pos == digit) { int mul = 1, ch = 0; for (int i = 0; i < pos; i++) { int num = channel.back(); ch += (num * mul);..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/m0VES/btqKWWtrGtA/mUVjfXikQ0tdLf97sJW6Sk/img.png)
문제 문제 생각했던 것 보다 훨씬 간단한 방법으로 풀려 당황했던 문제이다. 처음엔 '666'이 등장하는 숫자의 패턴을 찾으려고 했으나, 변수가 너무 많았다. 그러다가 이 문제가 브루트 포스에 포함된다는 것을 떠올리고, 혹시나 하는 생각을 하며 코드를 짰는데 그게 맞았다. 그냥 단순하게 666부터 숫자를 늘려가며 해당 숫자를 문자열로 바꾸고 그 문자열에 '666'이라는 패턴이 있는지 확인했다. 시간초과가 날 것이라고 생각 했는데, 코드가 돌아갔다. 소스코드 #include #include #include using namespace std; int main() { //이게 되네... int N, count = 0; cin >> N; for (int i = 666;; i++) { //666부터 시작해서 st..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/W9k5y/btqK2q7qK3S/ixVHNigHc9fnbn5MZcgfrk/img.png)
문제 풀이 커다란 체스판을 8x8 체스판으로 만들 수 있는 모든 경우의 수에 대해 계산한다. 체스판을 자르고, 편의상 왼쪽 맨위칸은 흰색으로 시작한다고 가정한다. 바꿔야 할 칸의 수를 계산했다면 이게 32보다 큰지 확인해야 한다. 만약 32칸보다 많이 바꿔야 한다면, 그냥 반대로 칠하는게 더 나았던 상황인 것이다. 아무튼 이런식으로 각 부분 체스판마다 바꿔야 하는 칸 수를 세고 최솟값을 갱신하면 된다. 소스코드 #include using namespace std; int main() { int N, M, i, j, a, b, fix, min_fix = 65; cin >> N >> M; char** panel = new char* [N]; for (i = 0; i < N; i++) panel[i] = ne..