18575. 풍선팡 보너스 게임

2023. 8. 28. 09:01·swea

틈틈이 풍선게임을 하던 김싸피는 새로운 보너스 스테이지에 도달했다. 보너스 스테이지의 규칙은 다음과 같다.

숫자가 써진 풍선이 NxN 격자의 각 칸에 고정되어 있다.

어떤 풍선을 터트리면 같은 행과 열의 풍선이 모두 터진다.

같은 풍선 배치가 두 번 주어지며, 각각 풍선을 하나씩 터트려 얻는 점수의 차이가 보너스 스테이지의 점수가 된다.

 

예를 들어, <그림 1>과 같은 스테이지에서, <그림 2>처럼 2가 써진 풍선을 터트리면 같은 행과 열의 풍선이 모두 터지고, 이때 터진 풍선에 있던 숫자의 합은 8이다. 다시 같은 배치에서 <그림 3>처럼 1인 풍선을 골라 터트리면, 같은 행과 열의 풍선이 터졌을 때의 합은 7이 되고, 이 스테이지의 점수는 8-7=1인 1점이 된다.




                                    <그림 1>                                      <그림 2>                                            <그림 3>

 

두 풍선을 잘 골라 터트리면 최대 점수를 얻을 수 있다. 보너스 스테이지가 주어지면 얻을 수 있는 최대 점수를 출력하라.

 

[입력]

첫 줄에 스테이지의 개수 T가 주어진다. 다음 줄부터 각 스테이지 별로, 첫 줄에 격자의 크기 N, 다음 줄부터 N개씩의 숫자가 N줄에 걸쳐 주어진다.

( 4 <= N <= 20, 1 <= Ai j<= min(N, 9))

 

[출력]

각 스테이지 별로 한 줄에 #과 스테이지 번호, 빈칸과 최대 점수를 출력한다.
입력
 
3
4
1 1 1 1
1 2 1 1
1 1 1 1
1 1 1 1
5
3 3 2 2 3
2 4 5 2 3
4 2 1 2 4
1 3 5 3 3
1 4 5 2 3
5
1 3 5 2 3
2 2 5 5 5
3 4 2 1 1
1 5 2 5 4
5 2 3 4 1
 
출력
 
#1 1
#2 10
#3 13
di = [1,-1,0,0]  # 델타값 설정하기(하,상,우,좌 순으로 탐색)
dj = [0,0,1,-1]
 
T = int(input())
for tc in range(1,T+1):
    N = int(input())
    arr = [list(map(int,input().split())) for _ in range(N)]
    max_score = 0
    min_score = 10000
 
    for i in range(N):  # N*N 크기의 격자
        for j in range(N):
            sum_score = arr[i][j]  # 자기자신 포함이므로 자기자신이 초기값
            for k in range(1, N):
                for h in range(4):  # 하상우좌 4방향 탐색
                    ni, nj = i+di[h]*k, j+dj[h]*k
                    if 0 <= ni < N and 0 <= nj < N:  # 유효한 인덱스 범위내에서
                        sum_score += arr[ni][nj]  # 그 값을 모두 더한다
            if max_score < sum_score:  # 최댓값 갱신
                max_score = sum_score
 
            # 위와 동일한 방식으로 최솟값 구하기
            sum_score = arr[i][j]
            for k in range(1, N):
                for h in range(4):
                    ni, nj = i+di[h]*k, j+dj[h]*k
                    if 0 <= ni < N and 0 <= nj < N:
                        sum_score += arr[ni][nj]
            if min_score > sum_score:  # 최솟값 갱신
                min_score = sum_score
 
    print(f'#{tc} {max_score-min_score}')  # 얻을 수 있는 (최댓값-최솟값)이 보너스 점수의 최댓값이므로
저작자표시 (새창열림)

'swea' 카테고리의 다른 글

12733. 기지국  (0) 2023.08.28
13732. 정사각형 판정  (0) 2023.08.28
1873. 상호의 배틀필드  (0) 2023.08.27
2805. 농작물 수확하기  (0) 2023.08.27
1926. 간단한 369게임  (0) 2023.08.27
'swea' 카테고리의 다른 글
  • 12733. 기지국
  • 13732. 정사각형 판정
  • 1873. 상호의 배틀필드
  • 2805. 농작물 수확하기
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (381)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (1)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    Til
    코딩테스트준비
    개발자취업
    99클럽
    항해99
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
18575. 풍선팡 보너스 게임
상단으로

티스토리툴바