πŸ“ algorithm

[λ°±μ€€] 2477 μ°Έμ™Έλ°­ Java 풀이

c0zi 2024. 2. 7. 17:00

문제 링크

βœ” λΆ„λ₯˜

κΈ°ν•˜ν•™, κ΅¬ν˜„, μˆ˜ν•™

 

πŸ“‘ 문제 μ„€λͺ…

μ‹œκ³¨μ— μžˆλŠ” νƒœμ–‘μ΄μ˜ μ‚Όμ΄Œ λŒμ—λŠ” μ»€λ‹€λž€ 참외밭이 μžˆλ‹€. 문득 νƒœμ–‘μ΄λŠ” 이 λ°­μ—μ„œ μžλΌλŠ” μ°Έμ™Έκ°€ λ„λŒ€μ²΄ λͺ‡ κ°œλ‚˜ λ˜λŠ”μ§€ κΆκΈˆν•΄μ‘Œλ‹€. μ–΄λ–»κ²Œ μ•Œμ•„λ‚Ό 수 μžˆλŠ”μ§€ 골똘히 μƒκ°ν•˜λ‹€κ°€ λ“œλ””μ–΄ 쒋은 아이디어가 λ– μ˜¬λžλ‹€. 유레카! 1m2의 넓이에 μžλΌλŠ” μ°Έμ™Έ 개수λ₯Ό ν—€μ•„λ¦° λ‹€μŒ, μ°Έμ™Έλ°­μ˜ 넓이λ₯Ό κ΅¬ν•˜λ©΄ 비둀식을 μ΄μš©ν•˜μ—¬ μ°Έμ™Έμ˜ 총개수λ₯Ό ꡬ할 수 μžˆλ‹€.

1m2의 넓이에 μžλΌλŠ” μ°Έμ™Έμ˜ κ°œμˆ˜λŠ” ν—€μ•„λ Έκ³ , 이제 μ°Έμ™Έλ°­μ˜ λ„“μ΄λ§Œ κ΅¬ν•˜λ©΄ λœλ‹€. 참외밭은 γ„±-자 λͺ¨μ–‘μ΄κ±°λ‚˜ γ„±-자λ₯Ό 90도, 180도, 270도 νšŒμ „ν•œ λͺ¨μ–‘(┏, β”—, β”› λͺ¨μ–‘)의 μœ‘κ°ν˜•μ΄λ‹€. λ‹€ν–‰νžˆλ„ 밭의 경계(μœ‘κ°ν˜•μ˜ λ³€)λŠ” λͺ¨λ‘ λ™μ„œ λ°©ν–₯μ΄κ±°λ‚˜ 남뢁 λ°©ν–₯μ΄μ—ˆλ‹€. 밭의 ν•œ λͺ¨ν‰μ΄μ—μ„œ μΆœλ°œν•˜μ—¬ 밭의 λ‘˜λ ˆλ₯Ό λŒλ©΄μ„œ 밭경계 길이λ₯Ό λͺ¨λ‘ μΈ‘μ •ν•˜μ˜€λ‹€.

예λ₯Ό λ“€μ–΄ 참외밭이 μœ„ κ·Έλ¦Όκ³Ό 같은 λͺ¨μ–‘이라고 ν•˜μž. κ·Έλ¦Όμ—μ„œ 였λ₯Έμͺ½μ€ 동μͺ½, μ™Όμͺ½μ€ μ„œμͺ½, μ•„λž˜μͺ½μ€ 남μͺ½, μœ„μͺ½μ€ 뢁μͺ½μ΄λ‹€. 이 그림의 μ™Όμͺ½μœ„ κΌ­μ§“μ μ—μ„œ μΆœλ°œν•˜μ—¬, λ°˜μ‹œκ³„λ°©ν–₯으둜 남μͺ½μœΌλ‘œ 30m, 동μͺ½μœΌλ‘œ 60m, 남μͺ½μœΌλ‘œ 20m, 동μͺ½μœΌλ‘œ 100m, 뢁μͺ½μœΌλ‘œ 50m, μ„œμͺ½μœΌλ‘œ 160m μ΄λ™ν•˜λ©΄ λ‹€μ‹œ 좜발점으둜 λ˜λŒμ•„κ°€κ²Œ λœλ‹€.

μœ„ 그림의 μ°Έμ™Έλ°­ 면적은 6800m2이닀. λ§Œμ•½ 1m2의 넓이에 μžλΌλŠ” μ°Έμ™Έμ˜ κ°œμˆ˜κ°€ 7이라면, 이 λ°­μ—μ„œ μžλΌλŠ” μ°Έμ™Έμ˜ κ°œμˆ˜λŠ” 47600으둜 κ³„μ‚°λœλ‹€.

1m2의 넓이에 μžλΌλŠ” μ°Έμ™Έμ˜ κ°œμˆ˜μ™€, 참외밭을 μ΄λ£¨λŠ” μœ‘κ°ν˜•μ˜ μž„μ˜μ˜ ν•œ κΌ­μ§“μ μ—μ„œ μΆœλ°œν•˜μ—¬ λ°˜μ‹œκ³„λ°©ν–₯으둜 λ‘˜λ ˆλ₯Ό λŒλ©΄μ„œ μ§€λ‚˜λŠ” λ³€μ˜ λ°©ν–₯κ³Ό 길이가 μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. 이 μ°Έμ™Έλ°­μ—μ„œ μžλΌλŠ” μ°Έμ™Έμ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

⌨ μž…λ ₯

첫 번째 쀄에 1m2의 넓이에 μžλΌλŠ” μ°Έμ™Έμ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ–‘μ˜ μ •μˆ˜ K (1 ≤ K ≤ 20)κ°€ μ£Όμ–΄μ§„λ‹€. 참외밭을 λ‚˜νƒ€λ‚΄λŠ” μœ‘κ°ν˜•μ˜ μž„μ˜μ˜ ν•œ κΌ­μ§“μ μ—μ„œ μΆœλ°œν•˜μ—¬ λ°˜μ‹œκ³„λ°©ν–₯으둜 λ‘˜λ ˆλ₯Ό λŒλ©΄μ„œ μ§€λ‚˜λŠ” λ³€μ˜ λ°©ν–₯κ³Ό 길이 (1 이상 500 μ΄ν•˜μ˜ μ •μˆ˜) κ°€ λ‘˜μ§Έ 쀄뢀터 일곱 번째 μ€„κΉŒμ§€ ν•œ 쀄에 ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. λ³€μ˜ λ°©ν–₯μ—μ„œ 동μͺ½μ€ 1, μ„œμͺ½μ€ 2, 남μͺ½μ€ 3, 뢁μͺ½μ€ 4둜 λ‚˜νƒ€λ‚Έλ‹€.

 

πŸ–₯ 좜λ ₯

첫째 쀄에 μž…λ ₯으둜 μ£Όμ–΄μ§„ λ°­μ—μ„œ μžλΌλŠ” μ°Έμ™Έμ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€.

 

πŸ“ 문제 풀이

 

- λ‹€μ‹œ λ³΄λ‹ˆκΉŒ μ’€ μ‹ κΈ°ν•˜κ²Œ ν‘Ό 것 κ°™λ‹€. γ…‹γ…‹γ…‹

- 전체적인 λ…Όλ¦¬λŠ” μž‘μ€ μ‚¬κ°ν˜•κ³Ό 큰 μ‚¬κ°ν˜•μ„ μ°Ύμ•„λ‚΄μ„œ 넓이λ₯Ό λΉΌμ£ΌλŠ” 것이닀.

- μž‘μ€ μ‚¬κ°ν˜•μ„ μ°ΎκΈ° μœ„ν•œ 둜직만 ꡬ할 수 μžˆλ‹€λ©΄ 금방 ν’€ 수 μžˆμ„ 것 κ°™λ‹€.

 

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int N = Integer.parseInt(br.readLine()); // 1μ œκ³±λ―Έν„° λ‹Ή μ°Έμ™Έ 개수
		
		int[] d = new int[6]; // λ°©ν–₯ λ°°μ—΄
		int[] l = new int[6]; // 길이 λ°°μ—΄
		
		int smallArea = 0; // μž‘μ€ μ‚¬κ°ν˜•
		
		int[] countClock = {2, 3, 1, 4}; // λ°˜μ‹œκ³„ λ°©ν–₯
		
		
		for(int i = 0; i < 6; i++) {
			st = new StringTokenizer(br.readLine());
			d[i] = Integer.parseInt(st.nextToken());
			l[i] = Integer.parseInt(st.nextToken());
		}
		
		int comp;
		for(int i = 0; i < 5; i++) {
			for(int j = 0; j < 4; j++) {
				if(j ==3) comp = 2; // λ°˜μ‹œκ³„ λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ 값이면, 비ꡐ값을 2둜 μ„€μ • (λͺ¨λ‘ 탐색)
				else comp = countClock[j+1]; // λ§ˆμ§€λ§‰ 값이 μ•„λ‹ˆλ©΄, λ‹€μŒκ°’μœΌλ‘œ 비ꡐ
				if(d[i] == countClock[j] && d[i+1] !=comp) { // λ°˜μ‹œκ³„λ‘œ 돌고 μžˆμ§€ μ•Šλ‹€λ©΄ ?
					smallArea = l[i] * l[i+1];
				}
			}
		}
		// λͺ¨λ‘ 탐색해도 μž‘μ€ μ‚¬κ°ν˜•μ˜ 면적이 ꡬ해지지 μ•ŠμœΌλ©΄ λ°°μ—΄μ˜ 첫 κ°’κ³Ό λκ°’μœΌλ‘œ κ΅¬ν•˜κΈ°
		if (smallArea == 0) {
			smallArea = l[0] * l[5];
		} 
		
		// 큰 μ‚¬κ°ν˜•μ˜ 면적은 λ°©ν–₯ λ°°μ—΄μ—μ„œ ν•œλ²ˆμ”© λ‚˜μ˜¨ 값을 κ³±ν•΄μ€€λ‹€.
		int bigArea = 1;
		int count[] = new int[6];
		for(int i =0; i < 6; i++) {
			count[d[i]]++;
		}
		for(int i =0; i < 6; i++) {
			if(count[d[i]] == 1) bigArea *= l[i];
		}
	
		System.out.println((bigArea - smallArea)*N);
	}
}