[JAVA] 백준 1041 (주사위)

2024. 4. 5. 00:32·BOJ, Programmers

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

 

1041번: 주사위

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수

www.acmicpc.net

 

 

 

 

어떻게 풀까 매우 고민했었다. 정육면체의 한면의 최솟값을 구하고 x6을 할까 생각을 했었다.

하지만 정육면체중 한면, 두면, 세면만 보이는 작은 정육면체의 갯수를 구하고 그 합들을 더하기로 했다.

​

먼저 한면만 보이는 정육면체이다.

먼저 내가 생각한 로직은 맨 위 한줄과 그 밑의 정육면체의 갯수를 구하고 그 한줄을 뺀 나머지 밑에 있는 정육면체의 갯수를 구한뒤 더하자고 생각했다

그래서 맨위 한줄의 정육면체중 한면만 보이는 사각형의 갯수는 (n-2) * (n-2)이라는 공식을 알게됐다.

그리고 그 밑줄에만 있는 사각형들은 한면에 총 (n-2) * (n-1)개이다. 하지만 총 4면이 있으니 x4를 하게 됐다.

​

​

두면이 보이는 정육면체의 갯수를 구한다.

한면만 보이는 정육면체의 로직과 같이 맨위에 한줄, 그 밑에있는 정육면체들의 갯수를 구하기로 했다.

맨 위에 있는 정육면체들은 각 꼭지점에 있는 정육면체를 제외하고는 모두 두면이 보이는 정육면체이므로 한줄에

(n-2)개가 있다. 총 4줄이 있으니 4*(n-2)개를 한뒤

그 밑에 있는 정육면체들은 그림에도 알 수 있듯이 맨위에 있는 정육면체를 제외하고 (n-1)*4개 이다.

이것합쳐서 총 4*(n-2) + (n-1)*4 개이다.

마지막으로 세면이 보이는 정육면체이다.

n이 어느수든 무조건 4개밖에 없으므로 크기는 4로 고정했다.

이렇게 1,2,3면이 보이는 갯수를 구해 다 더하기로 했다.

​

밑에는 정답코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		long n = Integer.parseInt(br.readLine());
		
		long scene[] = new long[3];
		
		scene[0] =  (n-2)*(n-2) + ( 4*(n-2)*(n-1) ) ; // 한면만 보이는 갯수
		scene[1] = ( 4*(n-2) ) + ( 4*(n-1) ); // 두면만 보이는 갯수 
		scene[2] = 4; // 세면만 보이는 갯수

		int arr[] = new int[6];
		long num = 0;
		long sum = 0;
		long min;
		String s[] = br.readLine().split(" ");
		for (int i = 0; i < 6; i++) {
			arr[i] = Integer.parseInt(s[i]);
		} // for
		
		
		if (n==1) {
			Arrays.sort(arr);
			min = arr[0];
			for (int i = 0; i < arr.length-1; i++) {
				sum += arr[i];
			} //for
		} else {
			min = arr[0];
			//한면만 보이는 총 합 
			for (int i = 0; i < arr.length; i++) {
				min = Math.min(min, arr[i]);
			} //for
			
			sum += min*scene[0]; //한면만 보이는 총 합 
			
			// 두면이 보이는 총합
			min = Long.MAX_VALUE;
			
			for (int i = 0; i < arr.length; i++) {
				
				for (int j = i+1; j < arr.length; j++) {
					
					if (i+j != 5) {
						min = Math.min(min, arr[i]+arr[j]);
					} //if
					
				} // for
			} // for
			
			sum+= min*scene[1]; // 두면이 보이는 총합
			
			for (int i = 0; i < 3; i++) {
				num += Math.min(arr[i], arr[5-i]);
			} // for
			
			sum+= num*scene[2];
			
			
		}// if else
		
		System.out.println(sum);
	} // main
} // class

'BOJ, Programmers' 카테고리의 다른 글

[Java] 프로그래머스 (이중우선 순위 큐 )  (0) 2024.04.05
[Java] 백준 2822 (점수 계산)  (0) 2024.04.05
[Java] 백준 1500 (최대곱)  (0) 2024.04.03
[Java] 백준 1010번 (다리놓기)  (0) 2024.03.30
[Java] 백준 1012번 (유기농 배추)  (0) 2024.03.30
'BOJ, Programmers' 카테고리의 다른 글
  • [Java] 프로그래머스 (이중우선 순위 큐 )
  • [Java] 백준 2822 (점수 계산)
  • [Java] 백준 1500 (최대곱)
  • [Java] 백준 1010번 (다리놓기)
Economy98
Economy98
공부하고 기록하기
  • Economy98
    Economy_Dev
    Economy98
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • Spring Framework (12)
      • BOJ, Programmers (22)
      • Java (6)
      • JDBC (6)
      • JPA (9)
      • Spring Transaction (3)
      • Algorithm (1)
      • Web (5)
      • Projects (2)
        • 쇼핑몰 프로젝트 (0)
        • 열람실 & 도서관 프로젝트 (2)
      • Network (2)
      • 나의 공부방 (5)
      • 끄적끄적 (1)
      • Error Log (3)
      • CS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    브루트포스 알고리즘
    백준
    Spring
    JPA
    자바 문제
    정렬
    스프링부트
    백준 자바 풀이
    restful api
    백준 풀이
    그리디 알고리즘
    java
    트랜잭션
    다이나믹 프로그래밍
    예외 처리
    propagation
    스프링
    자바
    jdbc
    자바 문제 풀이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Economy98
[JAVA] 백준 1041 (주사위)
상단으로

티스토리툴바