[BAEKJOON] 12단계_브루트 포스 본문

IT/코테문제

[BAEKJOON] 12단계_브루트 포스

호랑구야 2023. 11. 2. 09:00

 

julia319 정보

시도했지만 맞지 못한 문제

www.acmicpc.net

 

2231번  분해합

분해합은 생성자 + 생성자의 각 자릿수 숫자 로 이루어졌다. 따라서 생성자는 입력값에서 자릿수 * 9 한 값을 뺀 수부터 시작할 수 있는데, 만약 이때 이 값이 0보다 작은 경우 1부터 시작하게 했다.

map 함수를 이용하여 입력된 숫자를 문자로 만들어 분해하여 다시 int로 바꾼 후 sum함수로 더해주었다.

# 분해합 = 생성자 + 각 자릿수 합
# N = abc + a + b + c

N = int(input())
# 입력값 자릿수 구하기
N_digit = len(str(N))

# 생성자는 입력값 N - (a + b + c)라고 볼 수 있는데, a, b, c에 각각 최대 9까지 들어갈 수 있으므로
# 생성자가 될 수 있는 숫자는 최소 {입력값 - 자릿수 * 9가 된다.}
# for문 돌 최소 숫자
start = N - N_digit * 9
# 만약 입력값보다 자릿값 * 9가 더 클 수도 있으므로
if start < 0:
    start = 1

# 생성자가 없을 경우 0 출력
ans = 0

for i in range(start, N+1):
    # 숫자 i를 문자열로 만들고, map 함수를 이용해
    # 분해해 int로 바꾸고, sum 함수로 더해줌
    tmp = sum(map(int, str(i)))
    # 숫자 i와 분해된 각 자릿수 합을 더해줌
    Sum = i + tmp
    
    if Sum == N:
        ans = i
        break
print(ans)

 

1018번 체스판 다시 칠하기

잘 칠해진 체스판에는 두 가지 케이스가 존재한다. 각 케이스에 해당하는 경우를 나누어 잘못될 때마다 cnt에 하나씩 더해준다. 이때 케이스따라 cnt 변수는 두 개이지만, 결과적으로 어떤 케이스인지 묻지 않고 가장 적은 수를 물어보므로 cnt들의 모음에서는 구별할 필요가 없다.

# case 1         # case2
# WBWBWBWB       # BWBWBWBW
# BWBWBWBW       # WBWBWBWB
# WBWBWBWB       # BWBWBWBW
# BWBWBWBW       # WBWBWBWB
# WBWBWBWB       # BWBWBWBW
# BWBWBWBW       # WBWBWBWB
# WBWBWBWB       # BWBWBWBW
# BWBWBWBW       # WBWBWBWB


N, M = map(int, input().split())
Boards = []
result = []

for _ in range(N):
    Boards.append(input())

# 세로 시작점
for n in range(N-7):
    # 가로 시작점
    for m in range(M-7):
        # W자리에 B가 있을 때 더해줌
        cnt1 = 0
        # B자리에 W가 있을 때 더해줌
        cnt2 = 0
        # 세로 8개
        for i in range(n, n+8):
            # 가로 8개
            for j in range(m, m+8):
                # i번째줄 j번째 칸일 때, i와 j를 더한 값이 0 혹은 짝수이면
                if (i + j) % 2 == 0:
                    # 검은색일 때
                    # case1
                    if Boards[i][j] == 'B':
                        cnt1 += 1
                    # 흰색일 때
                    # case2
                    else:
                        cnt2 += 1
                # i번째줄 j번째 칸일 때, i와 j를 더한 값이 홀수이면
                else:
                    # 흰색일 때
                    # case1
                    if Boards[i][j] == 'W':
                        cnt1 += 1
                    # 검은색일 때
                    # case2
                    else:
                        cnt2 += 1
        # 각 결과를 리스트에 추가함
        result.append(cnt1)
        result.append(cnt2)
# 바꿔야 하는 결과값들 중 가장 작은 값을 ans로 선택
ans = min(result)
print(ans)

 

 

1436번 영화감독 숌

연속된 숫자가 존재하는지 확인할 때는 str함수를 이용하여 문자열 비교하는 방법이 수월하다. 시작 숫자를 666으로 하고선 그것을 문자열로 변환하여 666이 들어간 경우 종말의 수라는 의미이므로 종말의 수 카운트를 늘린다. 이때 종말의 수 카운트와 입력값이 같으면  N번째 종말의 수라는 의미이므로 반복문을 break하고 결과값을 출력한다. 아니라면 비교할 숫자를 하나씩 늘린다.

# 종말의 수: ~~ 666 ~~~ 과같이 숫자 내부에 666이 연속적으로 들어가는 것
# N번째 종말의 수를 찾는 중
N = int(input())

# 비교할 숫자, 문자열로 비교하면 더 편함
endNum = '666'
# 종말의 숫자를 발견할 때 마다 하나씩 늘어남
# 최솟값인 666을 만나면 1개 늘어남
cnt = 0
# 0부터 비교해도 상관없지만, 어차피 종말의 수 최솟값이 666이므로 이때부터 비교함
ans = 666

while(True):
    
    # 만약 결과값에 666이 존재하는지 확인
    # 숫자보다는 문자열일 때 확인이 편함
    if endNum in str(ans):
        cnt += 1
    # 만약 입력값과 cnt가 동일하면 반복문 종료
    if cnt == N:
        break
    
    # 비교값 하나 늘린다.
    ans +=1
    
print(ans)

 

2839번 설탕 배달

더 많이 담을 수 있는 바구니에 더 많이 담을수록 바구니의 전체 숫자가 줄어든다. 5kg 바구니에 다 담을 수 있는지 5로 나누 것의 나머지가 0인지를 확인하고, 그렇지 않다면 3kg짜리에 하나씩 넣어보고 다시 5kg 바구니들로 나머지를 넣을 수 있는지 확인한다. 이때 만약 남은 설탕이 0이 된 경우, 3kg짜리로만 이루어지게 된 것임을 확인할 수 있다.

N = int(input())

# 바구나가 딱 떨어지지 않을 때의 값
ans = -1
# 바구니 갯수
cnt = 0

# 바구니에 들어가지 않은 설탕이 있는 동안에는 돌아가야 한다
while(N >= 0):
    # 5kg 바구니에 더 많이 들어갈수록 바구니 갯수가 적어진다
    if (N % 5) == 0:
        cnt += (N // 5)
        ans = cnt
        break
    # 3kg은 적을수록 좋으므로 1개씩 가져간다
    N -= 3
    cnt += 1
    
    # 3kg으로만 이루어졌을 경우 수행된다
    if N == 0:
        ans = cnt
        break
    
print(ans)
반응형
Comments