소스 코드
def search(i,j):
# 화학 물질들의 구역 길이
i_cnt = 1
j_cnt = 1
while True:
ni = i + x[0]
if ni < n and board[ni][j] != 0:
i_cnt += 1
i = ni
else:
break
while True:
nj = j + y[1]
if nj < n and board[i][nj] != 0:
j_cnt += 1
j = nj
else:
break
# [x 길이, y 길이, 곱]
res.append([i_cnt,j_cnt,i_cnt*j_cnt])
# x,y 길이 return
return [i_cnt, j_cnt]
def visit(ii,jj):
# 방문처리
for e in range(ii, ii+i_c):
for r in range(jj, jj+j_c):
visited[e][r] = 1
return
# 아래, 오른쪽 이동
x = [1,0]
y = [0,1]
T = int(input())
for tc in range(1,1+T):
n = int(input())
# 화학 물질 현황
board = [list(map(int,input().split())) for _ in range(n)]
# 방문 여부
visited = [[0 for _ in range(n)] for _ in range(n)]
# [x 길이, y 길이, 곱] 순서로 저장
res = []
for q in range(n):
for w in range(n):
# 방문한적 없고, 0이 아니면 시작점으로 인식
if board[q][w] != 0 and visited[q][w] == 0:
# 길이 저장
[i_c,j_c] = search(q,w)
# 방문 처리
visit(q,w)
# 사각형의 넓이, 행의 길이에 따라 정렬
res.sort(key=lambda x : (x[2], x[0]))
print('#{} {}'.format(tc,len(res)), end=' ')
for p_res in res:
print(p_res[0],p_res[1],end=' ')
print()
해결 방법
1. 화학물질 현황에서 0이 아닌 수(시작 위치)를 찾는다.
2. 이를 기준으로 행 열의 길이를 구한다.
3. 행열의 길이와 곱을 저장한다.
4. 하나의 구역(사각형)을 구하면, 방문처리 한다.
5. 정렬
느낀 점
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] Calkin-Wilf tree 1 - PYTHON #11688 (0) | 2021.05.01 |
---|---|
[SWEA 코딩] 나는 개구리로소이다 - PYTHON #5550 (0) | 2021.04.13 |
[SWEA 코딩] S/W 문제해결 기본 Contact - PYTHON #1238 (0) | 2021.04.10 |
[SWEA 코딩] S/W 문제해결 기본 계산기2 - PYTHON #1223 (0) | 2021.04.09 |
[SWEA 코딩] 크루즈 컨트롤 - PYTHON #11592 (0) | 2021.03.28 |