지구정복

[구현] 백준 - 겉넓이 구하기 본문

데이터 엔지니어링 정복/Algorithm

[구현] 백준 - 겉넓이 구하기

nooh._.jl 2021. 7. 20. 16:15
728x90
반응형

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

 

16931번: 겉넓이 구하기

크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다. 이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다. 종이의 각 칸에 놓인 정육면체의 개수가 주어

www.acmicpc.net

 

-문제해설

3x3일 경우 종이 하나에 쌓이는 도형의 겉넓이를 구한다. (1, 1)종이 위에 한 개의 정육면체가 쌓이면 겉넓이는 6

(1,2) 종이 위에 두 개의 정육면체가 쌓이면 겉넓이는 2+2*4=10

이렇게해서 각 종이위에 쌓이는 정육면체의 겉넓이를 모두 구한다.

그리고 겹치는 겉넓이를 모두 빼주면 된다. 

아래 그림 참고

 

 

-자바

package implementation;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class BJ16931 {
	private static BufferedWriter bw = 
			new BufferedWriter( new OutputStreamWriter(System.out));
	private static int n, m, sum;
	private static int[][] arr;
	private static StringTokenizer st;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		st = new StringTokenizer( br.readLine() );
		n = Integer.parseInt( st.nextToken() );
		m = Integer.parseInt( st.nextToken() );
		arr = new int[n+1][m+1];
		
		//각 종이 위에 있는 각각의 도형값을 입력받음과 동시에 겉넓이를 구한다.
		for( int i=1; i<=n; i++ ) {
			st = new StringTokenizer( br.readLine() );
			for( int j=1; j<=m; j++ ) {
				arr[i][j] = Integer.parseInt( st.nextToken() );
				sum += 2 + arr[i][j]*4;
			}
		}
		
		//각각의 도형들의 겉넓이에서 겹쳐진 도형의 겉넓이를 빼준다.
		//먼저 행에 대해서 겹치는 부분을 빼준다.
		for( int i=1; i<=n; i++ ) {
			for( int j=1; j<m; j++ ) {
				sum -= Math.min( arr[i][j], arr[i][j+1] ) * 2;
			}
		}
		//다음으로 열에 대해서 겹치는 부분을 빼준다.
		for( int i=1; i<=m; i++ ) {
			for( int j=1; j<n; j++ ) {
				sum -= Math.min( arr[j][i], arr[j+1][i] ) * 2;
			}
		}
		
		bw.write( sum + "\n" );
		bw.flush();
		bw.close();
		br.close();
	}
}

 

-파이썬

n, m = map(int, input().split())
arr = [ [0,0,0,0] ]

for i in range( 1, n+1 ):
    arr.append( [0] + list( map( int, input().split() ) ) )

sum = 0
for i in range( 1, n+1 ):
    for j in range( 1, m+1 ):
        sum += 2 + arr[i][j]*4

for i in range( 1, n+1 ):
    for j in range( 1, m ):
        sum -= min( arr[i][j], arr[i][j+1] ) * 2
        
for i in range( 1, m+1 ):
    for j in range( 1, n ):
        sum -= min( arr[j][i], arr[j+1][i] ) * 2
        
print( sum )
728x90
반응형
Comments