20151020


*이문제는 + 연산자와 - 연사자를 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.





블럭 색칠하기/paintblock




프로그램 명: paintblock

제한시간: 1 초


크기가 1*1*1 인 정육면체를 가지고 가로 A 세로 B 높이 C 인 직육면체를 만든 후 A×B×C (2≤A,B,C≤120)의 블록 겉면에 페인트를 칠하였다.

아래의 그림은 3x3x3 인 경우의 보기이다.

이 때 2 개의 면만 페인트가 칠해진 블록의 개수를 구하는게 문제이다. (블록은 직육면체이다)

입력

A , B , C 가 차례대로 입력된다. A 는 가로, B 는 세로, C 는 높이이다.

출력

2개의 면만 페인트가 칠해진 블록의 개수를 첫째 줄에 출력한다.

입출력 예

입력 

3 3 3 

출력 

12
출처:tncks0121(박수찬) 





제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int a, b, c;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		a = sc.nextInt();   //가로
		b = sc.nextInt(); 	//세료
		c= sc.nextInt();    //높이
	}
	void result(){
		a = a-2;
		b = b-2;
		c = c-2;
		p.println((a+b+c)*4);
	}
}





*짧게 코딩하는것도 좋지만 저는 함수와 객체 지향개념을 쓰고 싶어서 이렇게 코딩 했습니다.


2개의 면만 페인트가 칠해진 블록을 먼저 이해하셔야 합니다.

그림을 그려보면 쉽게 이해가 되는데요.



빨간색 부분중에서 큐브의 각 꼭지점은 3면에 페인트가 칠해지기 때문에 총 8개의 꼭지점은 제외 됩니다. 그리고 각각의 면을 보면 블록 테두리 가운데 정사각형 부분을 보면 이 면은 1개의 면만 칠해지기 때문에 제외됩니다.

결국 2개의 면에 페인트가 칠해지는건 그림에서 가장자리 부분인 흰색 블록이죠.

그럼 흰색 블록을 구하려면 각각의 x축 y축 z축 에서 양끝에 있는 블록 1개씩 총 2개를 제외하면 블록의 개수를 알 수 있습니다.
그리고 각 축 마다 4개의 흰색 부분 블록이 있습니다. 가로 x축, 세로 y축, 높이 z축이 있으니깐 각각 4배수를 구해줘야 하죠


그럼 이제 코딩을 해보면


우선 3개의 정수 값을 입력 받기 위해서 a, b, c 변수 3개를 선언을 하고 그 변수에 입력값을 받습니다.


그 다음 result()함수에서

각 축의 개수에서 양끝 블록 총 2개를 빼줍니다. 그리고 각 축마다 4개의 같은 형식의 블록이 있기 때문에 4배수를 해주면 됩니다. 


큐브를 이해하는게 중요했던 문제입니다.



+ Recent posts