일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Baekjoon
- python
- 정치학
- 자료구조
- 알고리즘
- EBS
- 당신이 몰랐던 진화론
- Hacker Rank
- 맛집
- 데이터분석전문가
- K-MOOC
- ADP
- MySQL
- Joseph Samuel Nye Jr.
- 코테
- 미분적분학
- Progate
- 조지프 나이
- 누가 진정한 리더인가
- 공부정리
- 데이터분석전문가가이드
- ADsP
- CNN10
- 백준
- KMOOC
- Udemy
- Great Minds
- 후기
- 위대한 수업
- 빅데이터
- Today
- Total
ㅇ
[BAEKJOON] 12단계_브루트 포스 본문
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)
'IT > 코테문제' 카테고리의 다른 글
[BAEKJOON] 11단계_시간 복잡도 (1) | 2023.11.01 |
---|---|
[BAEKJOON] 10단계_기하: 직사각형과 삼각형 (0) | 2023.10.31 |
[BAEKJOON] 9단계_약수, 배수와 소수 (0) | 2023.10.30 |
[BAEKJOON] 8단계_일반 수학1 (0) | 2023.10.27 |
[BAEKJOON] 7단계_ 2차원 배열 (1) | 2023.10.26 |