땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • I
  • D
  • E
  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 18111 마인크래프트

2022. 2. 17. 20:49

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

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net

일단 땅고르기를 위해 가장 최소의 시간을 구하기 위해서는 여러 방법이 있었다.

 

1. ground 2차원 배열에서 중간값을 찾아서 그 중간값을 기준으로 잡고 땅고르기를 하기(이분탐색)

ground의 min값 ~ max값 사이의 range를 돌면서 그때 해당하는 조건에 대해서 테스트하는것도 좋은 방법

n, m, b = list(map(int, input().split()))

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

from math import inf
res = inf
height = 0
start = min(map(min,ground))
end =  max(map(max,ground))

for h in range(start, end + 1):
    max_value = 0
    min_value = 0
    for i in range(n):
        for j in range(m):
            if ground[i][j] > h:
                max_value += (ground[i][j] - h)
            else:
                min_value += (h - ground[i][j])
    bag = max_value + b

    if bag < min_value:
        continue

    time = 2 * max_value + min_value

    if time <= res:
        res = time
        height = h
print(res, height)

 

2. 0 ~ 256의 높이를 모두 고려한다음에 가장 작은 값을 구하기(완전탐색)

from math import inf
import sys

N, M, B = map(int, input().split())
ground = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

tall = 0
ans = inf

for i in range(257):
    max = 0
    min = 0
    for j in range(N):
        for k in range(M):
            if ground[j][k] < i:
                min += (i - ground[j][k])  # 현재 높이가 블록 높이보다 높을 때 (min 만큼 인벤토리에서 꺼내서 채워야 함)
            else:
                max += (ground[j][k] - i)  # 블록 높이가 현재 높이보다 높을 때 (max 만큼 블록이 제거 후 인벤토리에 들어감)

    inventory = max + B

    if inventory < min:
        continue

    time = 2 * max + min

    if time <= ans:
        ans = time
        tall = i

print(ans, tall)

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 1780 종이의 개수  (0) 2022.03.06
백준 2667 단지번호붙이기(BFS, DFS)  (0) 2022.03.06
백준 1213 & 팰린드롬 알고리즘(Palindrome Algorithm)  (0) 2022.02.17
백준 1251 단어 나누기  (0) 2022.02.17
백준 1991 트리 순회  (0) 2022.02.17
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 1780 종이의 개수
    • 백준 2667 단지번호붙이기(BFS, DFS)
    • 백준 1213 & 팰린드롬 알고리즘(Palindrome Algorithm)
    • 백준 1251 단어 나누기
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바