문제

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net

기역자 도형의 넓이 구하기. 

 

Reference

https://kau-algorithm.tistory.com/11

 

백준 2477번 - 참외밭

www.acmicpc.net/problem/2477 2477번: 참외밭 첫 번째 줄에 1m^2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1≤K≤20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여

kau-algorithm.tistory.com

https://itcrowd2016.tistory.com/84

 

[백준] 2477. 참외밭 - python

www.acmicpc.net/problem/2477 2477번: 참외밭 첫 번째 줄에 1m^2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1≤K≤20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여

itcrowd2016.tistory.com

https://velog.io/@sjy5386/Python-2차원-배열-선언하기

 

[Python] 2차원 배열 선언하기

Python에서의 1차원 배열 선언 Python에서 1차원 배열을 선언할 때는 다음과 같이 * 연산자를 이용해 간단하게 선언할 수 있다. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 같은 방식으로 2차원 배열 선언 하지만, 2차원

velog.io

 

풀이

입력은 크게 두 가지로, 제곱미터당 자라는 참외의 수와 방향/길이이다. 방향은 1, 2, 3, 4 순으로 동-서-남-북. 예시 입력을 보자면

이런 식이다. 참 쉽죠? 그러니까 계산할 사각형을 잘 잡아야 한다. 그럼 착수해봅시다.

일단 파이썬에서 이차원 배열은

rows = 5
cols = 5
arr = [[0 for i in range(cols)] for j in range(rows)]
print(arr)

이런 식으로 만든다. 근데 왜 이차원 배열이 나와요? 아니 그거 할거니까.

arr = [list(map(int,input().split())) for _ in range(6)]
print(arr)

배열이 꼭 정사각형만 된다는 편견은 버리자.

for i in range(len(arr)):
    if arr[i][0] == 1 or arr[i][0] == 2:
        if width < arr[i][1]:
            width = arr[i][1]
            width_index = i
            print('w',width,width_index)
    elif arr[i][0] == 3 or arr[i][0] == 4:
        if height < arr[i][1]:
            height = arr[i][1]
            height_index = i
            print('h',height,height_index)

배열을 토대로 이렇게 하면 가로세로로 제일 긴 변을 뽑을 수 있다. 인덱스가 필요한 이유는 나중에 얘기해드림. 위 코드는 방향(i번째 배열 0번)이 1, 2면 가로/3, 4면 세로로 분류하고 거기서 제일 긴 변의 길이와 인덱스를 변수에 저장하는 코드다.

이 그림을 보시면 인덱스가 필요한 이유가 바로 이해가 될 것이다.

small_width = abs(arr[(width_index - 1) % 6][1] - arr[(width_index + 1) % 6][1])
small_height = abs(arr[(height_index - 1) % 6][1] - arr[(height_index + 1) % 6][1])

그래서 가장 긴 가로변의 정보가 있는 배열 앞, 뒤와 가장 긴 세로변의 정보가 있는 배열 앞, 뒤를 빼면 된다. 긴 가로변의 정보가 0번일 경우 –1(맨 뒤), 1이 되는 식. 아, 저 괄호 빼면 IndexError 뜸. 내가 봤음…

melon = int(input())
# melon
arr = [list(map(int,input().split())) for _ in range(6)]
# array(2-Dimentional)

width = 0
width_index = 0
height = 0
height_index = 0
# index format(?)

for i in range(len(arr)):
    if arr[i][0] == 1 or arr[i][0] == 2:
        if width < arr[i][1]:
            width = arr[i][1]
            width_index = i
    elif arr[i][0] == 3 or arr[i][0] == 4:
        if height < arr[i][1]:
            height = arr[i][1]
            height_index = i
#find max width, max height

small_width = abs(arr[(width_index - 1) % 6][1] - arr[(width_index + 1) % 6][1])
small_height = abs(arr[(height_index - 1) % 6][1] - arr[(height_index + 1) % 6][1])
# calculate

farm = (width * height) - (small_width * small_height)
total_melon = melon * farm
print(total_melon)
#Yeeeeeeees!!!

그래서 이게 최종 코드다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2798번 풀이  (0) 2022.08.19
백준 11729번 풀이  (0) 2022.08.19
백준 2447번 풀이  (0) 2022.08.19
백준 17478번 풀이  (0) 2022.08.19
백준 4153번 풀이  (0) 2022.08.19

Profile

Lv. 34 라이츄

요즘 날씨 솔직히 에바참치김치꽁치갈치넙치삼치날치기름치준치학꽁치임..