본문 바로가기

알고리즘/백준

[Python] 백준 파이썬 2477 참외밭

https://www.acmicpc.net/problem/2477

 

2477번: 참외밭

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

www.acmicpc.net

  • 첫 시도(틀림)
# 백준 2477 참외밭

cham_per_1 = int(input())

n_s = []
e_w = []
for _ in range(6):
  a = list(map(int, input().split()))
  if a[0] == 3 or a[0] == 4:
    n_s.append(a)
  else:
    e_w.append(a)

h = max(n_s, key = lambda x : x[1])
w = max(e_w, key = lambda x : x[1])

n_s.remove(h)
e_w.remove(w)

mini_h = n_s[1][1]
mini_w = e_w[0][1]

# 넓이
width = h[1] * w[1] - mini_h * mini_w

# 참외 개수
cham_num = width * cham_per_1
print(cham_num)

처음에 푼 풀이는 첫 시작으로 북쪽으로 가거나 서쪽으로 가는 방향의 길이가 제일 큰 가로변일 때만 성립하는 풀이였습니다...ㅎㅎ

 

그래서 결국 다른 분의 풀이를 참고했습니다.. ㅜ.ㅜ

https://my-coding-notes.tistory.com/555

 

[🥈4 / 백준 2477 / 파이썬] 참외밭

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

my-coding-notes.tistory.com

  • 다른 분 풀이 
import sys
input = sys.stdin.readline

n = int(input())
arr = []
maxx = [(0,0),(0,0)]
# 큰 사각형의 변을 구한다
for i in range(6):
    d,w = map(int,input().split())
    d = 0 if d<=2 else 1
    if w > maxx[d][1]:
        maxx[d] = (i,w)
    arr.append((d,w))
    
# 인접한 변들을 체크해준다.
ans = maxx[0][1]*maxx[1][1]
check = [False]*6
for idx,_ in maxx:
    for i in idx,(idx+1)%6,idx-1:
        check[i] = True

# 체크되지 않은 남은 변을 찾아 넓이를 빼 준다.
min_square = 1
for i in range(6):
    if not check[i]:
        min_square *= arr[i][1]
print((ans-min_square)*n)

다른 것도 좋았지만 

 

인접하지 않은 변을 찾을 때 마스킹을 해서 찾는 방법이 인상적이었습니다.

 

문제를 풀면 풀수록 쉽지가 않네요...