앞서 살펴본 브루트 포스 알고리즘의 중급 사용 방법을 제시한다. 일반적으로 브루트 포스 문제에서 가장 문제가 되는 것은 시간 이므로, 이부분을 효율적으로 조절할 수 있는 방법을 알아본다.
브루트 포스를 푸는 방법
for 문
순열 사용
재귀사용
비트마스크 사용
리모컨 (1107번 문제)
+ 와 - 버튼은 모든 숫자를 누르고 나서 실행된다는 것을 알 수 있다. 또한 같은 숫자(장소)를 중복적으로 방문하는 경우에는 절대 최소가 될 수 없다. 따라서 + 나 - 버튼은 한가지 종류만 사용해야 한다.
이동하려는 채널은 0~500000 까지이다. 따라서 우리가 누르는 채널 C는 0~1000000의 범위에 있다고 생각하면 된다. 왜냐면 50만까지 + 만 눌러서 이동한경우 50만번이 나오게 된다. 반대로 정답보다 큰곳에서 작은곳으로 갈 수 있는 최대 값은 -50만이기 때문에 100만의 범위가 나오게 된다.
이동할 채널을 정한다
이동할 채널에 고장난 버튼이 있는지 확인하고
+ 나 - 버튼을 몇개 눌러야 할 지 정해본다.
코드 설명
카잉 달력 (6064번 문제)
M,N 과 x,y의 규칙을 먼저 찾아야만 한다.
// M=10,N=12
년 M N
1 1 1
2 2 2
...
10 10 10
11 1 11
12 2 12
13 3 1
위와 같이 보면 (if 년%M==0 ? M : x=년도%M ), (if 년%N==0 ? N : y=년도%N ) 로 나타난다. 문제는 M,N,x,y 를 가지고 년도를 구하는 문제이다.
근데 그냥 브루트포스를 돌려버리면, 가지수가 16억 가지로 구할수가 없다.(시간제한에 걸린다)
위에서 구한 규칙을 보면, x 는 년도를 M으로 나눈 나머지라는 것을 알 수 있다. 단 까다로운 것은, 나머지가 0이 되어야 할 때 그대로 M이 나온다는 것만 다르다. 그럼 반대로 말해서 년도를 구하려면 x 를 기준으로 M년씩 늘려가면서 해당하는 y 값이 나타나는지를 보면 된다!
Comments