- 셀 높이 (1≤N≤100) 및 10 셀 너비
- 각 셀은 비어 있거나 (0으로 표시) 9 가지 색상 중 하나 (문자 1..9로 표시)의 건초입니다. 중력으로 인해 건초 더미가 아래로 떨어 지므로 건초 더미 아래에 0 셀이 없습니다.
- 두 셀이 가로 또는 세로로 직접 인접하고 0이 아닌 동일한 색상을 갖는 경우 동일한 연결된 영역에 속합니다. 최소한으로 연결된 지역이 존재할 때에 K세포, 건초 더미가 모두 사라지고 0으로 변합니다. 이러한 연결된 영역이 동시에 여러 개 있으면 모두 동시에 사라집니다. 그 후 중력으로 인해 건초 더미가 아래로 떨어져 0이 된 결과 K세포 중 일부를 채울 수 있습니다. 결과 구성에서 다시 적어도 크기의 연결된 영역이있을 수 있습니다. K세포. 만약 그렇다면, 그것들도 사라지고 (동시에, 그러한 영역이 여러 개인 경우), 중력은 나머지 세포를 아래쪽으로 당기고, 적어도 크기의 연결된 영역이 없을 때까지 프로세스가 반복됩니다. K에 있다.
- Mooyo Mooyo 보드의 상태를 감안할 때 이러한 작업이 발생한 후 보드의 최종 사진을 출력하십시오.
- point. 함수 나눠서 풀기 / Flood Fill / dfs사용하기 / 갯수세기, 지우기, 내리기로 나눠서 코드 작성
- 반복해서 풀어보기
def new_array(N):
return [[False for i in range(10)] for _ in range(N)]
N, K = map(int, input().split())
M = [list(input()) for _ in range(N)]
ck = new_array(N)
ck2 = new_array(N)
dx, dy = [0,1,0,-1], [1,0,-1,0] #방향벡터 설정
def dfs(x,y): # 갯수세기
ck[x][y] = True # 그룹에 포함되어 있는가
ret = 1
for i in range(4): # 4방향 검사
xx,yy = x+dx[i], y+dy[i]
if xx<0 or xx>=N or yy<0 or yy>=10: # 구간 내에 있는지 확인
continue
if ck[xx][yy] or M[x][y] != M[xx][yy]: # 체크가 되어 있거나 연결이 안되거나
continue
ret += dfs(xx,yy)
return ret
def dfs2(x,y, val): # 지우기
ck2[x][y] = True # 지워도 되는가
M[x][y] = '0' # 0으로 바꿔줌
for i in range(4):
xx, yy = x + dx[i], y + dy[i]
if xx < 0 or xx >= N or yy < 0 or yy >= 10: # 구간 내에 있는지 확인
continue
if ck2[xx][yy] or M[xx][yy] != val:
continue
dfs2(xx,yy,val)
def down(): #내리기
for i in range(10): # 세로줄부터 확인하기
tmp = []
for j in range(N):
if M[j][i] != '0': #0이 아닌 수들 저장
tmp.append(M[j][i])
for j in range(N-len(tmp)): #0이 아닌 수의 갯수 빼고 0 채우고
M[j][i] = '0'
for j in range(N-len(tmp),N): #나머지 수 채워넣기
M[j][i] = tmp[j- (N -len(tmp))]
while True:
exist = False
ck = new_array(N)
ck2 = new_array(N)
for i in range(N):
for j in range(10):
if M[i][j] == '0' or ck[i][j]: # 0이거나 이미 체크했으면 넘어가기
continue
res = dfs(i,j) # 개수 세기
if res >= K: # 개수가 K보다 같거나 크면
dfs2(i,j, M[i][j]) # 지우기
exist = True
if not exist:
break
down() # 내리기
for i in M:
print(''.join(i))
단계별풀기 - 브루트 포스
# 2798 블랙잭 (브론즈2)
- N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.
n,m = map(int, input().split())
n_list = list(map(int, input().split()))
sum_list = []
for i in range(n):
for j in range(i+1,n):
for k in range(j+1,n):
nsum = n_list[i] + n_list[j] + n_list[k]
if nsum <= m:
sum_list.append(nsum)
print(max(sum_list))
# 2231 분해합 (브론즈2)
- 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
- 첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
- 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
- point. 숫자 각자리 더하기 list(map(int, str())) 사용
1) 틀린 답 -> 생성자가 없는 경우 0을 출력해야함을 간과함
n = int(input())
for i in range(1,n+1):
div_num = list(map(int, str(i)))
sum_num = i +sum(div_num)
if sum_num == n:
print(i)
break
2) 정답
N = int(input())
print_num = 0
for i in range(1, N+1):
div_num = list(map(int, str(i)))
sum_num = i + sum(div_num)
if(sum_num == N):
print_num = i
break
print(print_num)
반응형
'알고리즘 > baekjoon' 카테고리의 다른 글
20210201_코테공부 (0) | 2021.02.01 |
---|---|
20210129_코테공부 (0) | 2021.01.29 |
20210127_코테공부 (0) | 2021.01.27 |
20210126_코테공부 (0) | 2021.01.26 |
20210125_코테공부 (0) | 2021.01.25 |