본문 바로가기
BOJ/[BOJ] Python

백준 2477번 풀이

by Lv. 35 라이츄 2022. 8. 19.

문제

 

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

최근댓글

최근글

skin by © 2024 ttutta