본문 바로가기
코딩테스트

BRUTE FORCE

by 임지혁코딩 2023. 12. 31.

모든 경우의 수를 하나하나 찾는 것이다 . (알고리즘 시간에 배운것을 기억하자! )

 

1018번. 굉장히 어려웠다. .

아하, 한 행 별로 비교하는 것이 아니고, 맨 왼쪽위 배열의 형태를 보고, 이에 맞춰 ROW+COL이 W나 B임에 따라 다른 것을 찾는 코드로 하는 방법이 더 현명하다.

 

*bruteforce != 써진 그대로 코드 작성임에 주의하자

 

n, m = map(int,input().split(" "))


arr = []
for _ in range(n):
    arr.append(list(map(str, input())))


best_update = -1

# N X M 보드 전체검사
for N in range(n-7):
    for M in range(m-7):

        white_first = 0
        black_first = 0
        example_update = 0
       
        # 임의의 8 X 8 보드 검사
        for row in range(N, N+8, +1):
            for col in range(M, M+8, +1):
               
                # 흰 & 검 시작 2가지 상태, 검사
                if((row + 1) % 2 != 0):
                    #만약에 행이 0이 아니라면 .
                    if((col + 1) % 2 != 0):
                        #맞다면
                        if(arr[row][col] != "W"):
                            white_first += 1
                        else:
                            black_first += 1
                    else:
                        if(arr[row][col] != "B"):
                            white_first += 1
                        else:
                            black_first += 1
                else:
                    if((col + 1) % 2 != 0):
                        if(arr[row][col] != "B"):
                            white_first += 1
                        else:
                            black_first += 1
                    else:
                        if(arr[row][col] != "W"):
                            white_first += 1
                        else:
                            black_first += 1

        # 임의의 보드 검사 완료
        if (white_first > black_first):
            example_update = black_first
        else:
            example_update = white_first
               
        # 임의의 보드 최소갯수와 기록된 최소 갯수 비교
        if (best_update == -1 or best_update > example_update):
            best_update = example_update
       
        # print(best_update, end =", ")

print(best_update)

 

백준 1463 : 

 

2개의 어려웠던 이유

1. 내가 직접 숫자를 받아서 그거를 계산할 생각을했다 (또 멍청하게 풀려했다)

정답은 0부터 하나씩 올려서 666이 나올때 풀어내는 것이다

if "666" in str(num):

 

이게 2번. 6606도 해당 조건을 만족함을 몰랐다 .

 

in 은 sql에서도 부분적으로 있기만 하면, 아주 온화한 함수였다.

이도 같다. in은 아주 온화하게, 666이더라도 6606에서 직접적으로 666은 등장하지 않지만, in의 작동과정이

A in B에서 a의 앞을보고 찾고, 그다음 b를 찾다 a에서 못한게 나오면 성립한다.

 

즉, for '666' in str(num)에서! num이 6606이어도 성립한다. 

 

++ For보다 while의 속도가 좋다. 그러므로 while을 활용할 수 있는경우에는 while을 사용하자. 

 

brute force 식 방법은. 

모든 case를 다 생각해내고 그것 마다 구현을 해주는 방식의 풀이라고 이해하는 것이 맞는 것 같다. 

 

2839 - 01knapsack의 일종인거 같으나, weight가 없다.

이럴때는 한 방향으로 일정하게 정렬해주는게 굉장히 중요하다.

 

들어온 n이 5로 나눠질땐 바로 그 값을, 

그렇지 않을땐 3씩 줄이고, 그 줄인 결과가 5로 나눠지면 그때의 cnt를

그 줄인 결과가 0이라면(3으로 나눠진다는 뜻) -> 만약에 18과 같이 둘다 가능한 경우면
n이 15에서 정리된다.

n==1 or n==2라면 -1을 출력한다. 

 

Brute Force로 풀어야겠다 마음먹으면,

for문의 사용을 최소화하고. 모든 case에 대해서 if절을 활용하여 문제를 풀자

(그 과정에서 어떻게 진행할지를 고민하자 ) 

'코딩테스트' 카테고리의 다른 글

SET, MAP  (0) 2024.01.07
정렬  (1) 2024.01.01
일반 식의 알고리즘  (0) 2023.12.30
코딩테스트 2 -> 문자열 부터  (0) 2023.12.25
백준 코딩테스트 - 알고리즘 전까지  (1) 2023.12.21