난이도 : D4
문제번호 : 1258
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
유엔 화학 무기 조사단이 대량 살상 화학 무기를 만들기 위해 화학 물질들이 저장된 창고를 조사하게 되었다. 창고에는 화학 물질 용기 n^2개가 n x n으로 배열되어 있었다. 유엔 조사단은 각 용기를 조사하여 2차원 배열에 그 정보를 저장하였다. 빈 용기에 해당하는 원소는 ‘0’으로 저장하고, 화학 물질이 들어 있는 용기에 해당하는 용기는 화학 물질의 종류에 따라 ‘1’에서 ‘9’사이의 정수를 저장하였다. 다음 그림은 창고의 화학 물질 현황을 9x9 배열에 저장한 예를 보여준다. 유엔 조사단은 화학 물질이 담긴 용기들로부터 3가지 사항을 발견하였다. 1. 화학 물질이 담긴 용기들이 사각형을 이루고 있다. 또한, 사각형 내부에는 빈 용기가 없다. 예를 들어, 위의 그림에는 3개의 화학 물질이 담긴 용기들로 이루어진 사각형 A, B, C가 있다. 2. 화학 물질이 담긴 용기들로 이루어진 사각형들은 각각 차원(가로의 용기 수 x 세로의 용기 수)이 다르다. 예를 들어, 위의 그림에서 A는 3x4, B는 2x3, C는 4x5이다. 3. 2개의 화학 물질이 담긴 용기들로 이루어진 사각형들 사이에는 빈 용기들이 있다. 예를 들어, 위의 그림에서 A와 B 사이와 B와 C 사이를 보면, 빈 용기를 나타내는 ‘0’ 원소들이 2개의 사각형 사이에 있는 것을 알 수 있다. 단, A와 C의 경우와 같이 대각선 상으로는 빈 용기가 없을 수도 있다. 유엔 조사단은 창고의 용기들에 대한 2차원 배열에서 행렬(화학 물질이 든 용기들로 이루어진 사각형)들을 찾아내고 정보를 수집하고자 한다. 찾아낸 행렬들의 정보를 출력하는 프로그램을 작성하시오. |
제약사항
n은 100 이하이다. |
입력
맨 첫 줄에는 테스트 케이스의 개수가 주어진다. 그리고 테스트 케이스가 각 라인에 주어진다. 각 테스트 케이스는 (n+1) 줄로 구성되며, 첫 줄에는 양의 정수인 n이 주어지고, 다음 n줄에는 n x n 행렬이 (각 행이 한 줄에) 주어진다. |
출력
각 테스트 케이스 각각에 대한 답을 출력한다. |
예시
입력 | 출력 |
10 9 1 1 3 2 0 0 0 0 0 3 2 5 2 0 0 0 0 0 2 3 3 1 0 0 0 0 0 0 0 0 0 4 5 5 3 1 1 2 5 0 3 6 4 2 1 2 3 6 0 2 1 1 4 2 0 0 0 0 4 2 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 2 0 0 0 0 0 0 9 4 2 0 1 7 3 0 … |
#1 3 2 3 3 4 4 5 #2 2 1 2 2 3 … |
2. 문제풀이
간단하게 접근해서 풀었다. |
3. 소스코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#D4 1258 행렬찾기
#옆으로 어디까지 갈수있나 길이체크
def width(i, j):
count = 1
dx = j
while True:
dx += 1
if dx >= N: break
if map_list[i][dx]: count+=1
else: break
return count
#아래로 얼마까지 갈수있나 길이체크
def height(i, j):
count = 1
dy = i
while True:
dy += 1
if dy >= N: break
if map_list[dy][j]: count+=1
else: break
return count
#이미 체크한 영역은 다시검사하지 않기위해 0으로 바꿈
def change(s_y, s_x, e_y, e_x):
for i in range(s_y, e_y):
for j in range(s_x, e_x):
map_list[i][j] = 0
T = int(input())
for t in range(1, T+1):
N = int(input())
#리스트 내포기능으로 반복해서 입력받음
map_list = [list(map(int, input().split())) for _ in range(N)]
answer_list = []
for i in range(N):
for j in range(N):
#값이 있다면
if map_list[i][j]:
#가로길이 받아오고
w = width(i, j)
#세로길이 받아와서
h = height(i, j)
#리스트 내용바꿔주고
change(i, j, i+h, j+w)
#행열 크기 넣어주고 곱한값 넣어주고
answer_list.append([h, w, h*w])
#출력해야 하니까 정렬해야 하는데 곱한값 기준으로 오름차순, 다음은 행렬 크기로 오름차순
answer_list = sorted(answer_list, key=lambda x: (x[2], x[0]))
#이 밑에는 출력하기
print('#{} {}'.format(t, len(answer_list)), end= ' ')
for r, c, _ in answer_list:
print('{} {}'.format(r, c), end=' ')
print()
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
동철이의 일 분배 Python(SW Expert Academy, SWEA) (0) | 2020.06.12 |
---|---|
정사각형 방 Python(SW Expert Academy, SWEA) (0) | 2020.06.11 |
Contact Python(SW Expert Academy, SWEA) (0) | 2020.06.09 |
미로1 Python(SW Expert Academy, SWEA) (0) | 2020.06.08 |
계산기3 Python(SW Expert Academy, SWEA) (0) | 2020.06.07 |
댓글