• Home
  • About
    • back
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • back
    • All Posts
    • All Tags
  • Projects

[1015] (파이썬) CODE TREE_Lv.2 Intermediate Low: 최고의 33위치

15 Jan 2020

Reading time ~2 minutes

Table of Contents
  • 문제
    • 입력 형식
    • 출력 형식
    • 입출력 예제
  • 풀이과정
    • 1) 변수 선언, 입력값
    • 2) 주어진 그리드를 3* 3 단위로 탐색하는 함수 생성
    • 3) 3* 3 그리드 안의 1을 계산하는 메서드 생성
    • 4)출력
  • 구현
  • 결과

문제

[최고의 33위치]
풀러 가기

N * N 크기의 격자 정보가 주어집니다.
이때 해당 위치에 동전이 있다면 1, 없다면 0이 주어집니다.
N * N 격자를 벗어나지 않도록 3 * 3 크기의 격자를 적절하게 잘 잡아서 해당 범위 안에 들어있는 동전의 개수를 최대로 하는 프로그램을 작성해보세요.

입력 형식

첫 번째 줄에는 격자의 크기를 나타내는 N이 주어집니다.

두 번째 줄부터는 N개의 줄에 걸쳐 격자에 대한 정보가 주어집니다.
각 줄에는 각각의 행에 대한 정보가 주어지며, 이 정보는 0또는 1로 이루어진 N개의 숫자로 나타내어지며 공백을 사이에 두고 주어집니다.

  • 2 ≤ n ≤ 100

출력 형식

N * N 격자를 벗어나지 않으면서, 3 * 3 크기 격자 내에 들어올 수 있는 최대 동전의 수를 출력해주세요.

Constraints:
시간 제한: 1000ms
메모리 제한: 80MB

입출력 예제

입력:
3
1 0 1
0 1 0
0 1 0

출력: 
4
입력:
5
0 0 0 1 1
1 0 1 1 1
0 1 0 1 0
0 1 0 1 0
0 0 0 1 1

출력: 
6

풀이과정

1) 변수 선언, 입력값
2) 주어진 그리드를 3* 3 단위로 탐색하는 함수 생성
3) 3* 3 그리드 안의 1을 계산하는 메서드 생성

  • 2)와 3)의 자리 바꾸기 ➡ 2)에서 3)을 호출하기 때문

4) 출력

1) 변수 선언, 입력값

이렇게 만들어 준다

n = int(input())
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

image

2) 주어진 그리드를 3* 3 단위로 탐색하는 함수 생성

3* 3 그리드의 왼쪽 위 셀을 기준으로 탐색

max_gold = 0
for row in range(0,n-2):
    for col in range(0,n-2):
        num_of_gold = get_num_of_gold(row, col, row + 2, col + 2)
            
        # 최대 금의 개수를 저장합니다.
        max_gold = max(max_gold, num_of_gold)

image image image

image image image

image image image

3) 3* 3 그리드 안의 1을 계산하는 메서드 생성

3* 3 그리드의 왼쪽 위 셀을 기준으로 탐색 그런에 이 메서드는 위 단계에서 불리니 위 단계보다 앞에

def get_num(row_s, col_s, row_e, col_e):
    return sum([
        grid[i][j]
        for i in range(row_s, row_e + 1)
        for j in range(col_s, col_e + 1)
    ])

위의 탐색 중 하나의 예만 들어보자면, image

4)출력

2)의 max_gold = max(max_gold, num_of_gold) 에서 의미하는 것이 각 그리드의 3) 값들의 최댓값을 의미
그러니 max_gold를 출력하면 됨

print(max_gold)

구현

# 1)
n = int(input())
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]


# 3)
def get_num(row_s, col_s, row_e, col_e):
    return sum([
        grid[i][j]
        for i in range(row_s, row_e + 1)
        for j in range(col_s, col_e + 1)
    ])


max_gold = 0

# 2)
for row in range(0,n-2):
    for col in range(0,n-2):
        num_of_gold = get_num(row, col, row + 2, col + 2)
            
        # 최대 금의 개수를 저장합니다.
        max_gold = max(max_gold, num_of_gold)

# 4)
print(max_gold)

결과

image 쨔쨘



Coding test Share Tweet +1