본문 바로가기
백준

[백준 2477/Java] 참외밭

by naahy 2023. 2. 16.

 



정말 풀어보려고 시도는 했는데... 너무 안 돼서 나와 같은 풀이(전체 넓이에서 오목한 부분의 넓이 빼기)를 이용한 다른 사람의 코드를 확인했다.
사실 내 코드 중 어느 부분이 틀린 지 아직 모르겠어서 일단 올려두고 나중에 좀 더 보려 한다.

 

참고

https://velog.io/@jihun333/%EB%B0%B1%EC%A4%802477-%EC%B0%B8%EC%99%B8%EB%B0%AD-%EC%9E%90%EB%B0%94

 

[백준]2477 참외밭 (자바)

[백준]2477 참외밭 (자바)

velog.io


 

풀이 1

더보기
  • 틀린 답안
  • 밭의 경계선이 꺾여들어가는 경우 기존에 나왔던 방향의 중복이 연속으로 나옴
  • 밭 경계선의 방향과 크기를 받을 때마다 해당 경계선의 앞뒤 경계선 방향 확인
    • 앞뒤 경계선의 방향이 서로 같다면 해당 경계선은 꺾여들어간 부분

 

코드

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

/*
 * 오른쪽 위 꼭지점에서 시작하는 경우 기본 방향 4 2 3 1
 * 꺾여들어가는 경우 기존에 나왔던 방향의 중복이 연속으로 나옴
 * 특정 인덱스 위치에서 앞뒤 순서의 방향이 맞는지 확인 (ex. 방향이 4인 경우를 확인할 때 앞은 1, 뒤는 2여야 함)
 */
public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int k = Integer.parseInt(br.readLine());
		
		int width = 0;
		int height = 0;
		
		// 밭에서 없앨 넓이
		int delWidth = 0;
		int delHeight = 0;
		
		int[][] field = new int[6][2];
		
		for (int i = 0; i < 6; i++) {
			st = new StringTokenizer(br.readLine());
			
			field[i][0] = Integer.parseInt(st.nextToken());	// 방향
			field[i][1] = Integer.parseInt(st.nextToken());	// 길이
		}
		
		int index = -1;
		
		for (int i = 1; i < 5; i++) {
			switch (field[i][0]) {
			case 1:
				if (field[i-1][0] == 3 && field[i+1][0] == 4)
					break;
			case 2:
				if (field[i-1][0] == 4 && field[i+1][0] == 3)
					break;
			case 3:
				if (field[i-1][0] == 2 && field[i+1][0] == 1)
					break;
			case 4:
				if (field[i-1][0] == 1 && field[i+1][0] == 2)
					break;
			default:
				if (field[i-1][0] == field[i+1][0]) {
					index = i;
					
					if (field[i][0] == 1 || field[i][0] == 2) {
						delHeight = field[i][1];
						height = (field[i][0] == 1) ? 2 : 1;
					} else {
						delWidth = field[i][1];
						width = (field[i][0] == 3) ? 4 : 3;
					}
				}
				break;
			}
		}
		
		if (delWidth == 0 && delHeight == 0) {
			delWidth = field[0][1];
			delHeight = field[5][1];
		}
		else if (delWidth == 0 || delHeight == 0) {
			if (index == 1) {
				if (delWidth == 0)
					delWidth = field[index-1][1];
				else
					delHeight = field[index-1][1];
			}
			else {
				if (delWidth == 0)
					delWidth = field[index+1][1];
				else
					delHeight = field[index+1][1];
			}
		}
		
		for (int[] dir : field) {
			if (dir[0] == width)
				width = dir[1];
			else if (dir[0] == height)
				height = dir[1];
		}
		
		System.out.println((width*height - delWidth*delHeight) * k);
	}

}

 


 

풀이2

  • 각 변의 방향과 길이를 입력 받을 때마다 가장 긴 가로/세로 길이와 비교
  • 가장 긴 가로와 세로의 위치를 구함
  • 가장 긴 가로/세로 변의 좌우 길이를 각각 확인한 후 해당 변끼리의 차를 구함
    • = 빼야할 사각형의 한 변의 길이와 같음
    • 가로와 세로의 위치 인덱스가 0 또는 5인 경우 따로 확인 필요

 

코드

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int k = Integer.parseInt(br.readLine());
		
		int[] field = new int[6];
		
		int width = 0;
		int height = 0;
		int widthIndex = -1;
		int heightIndex = -1;
		
		for (int i = 0; i < 6; i++) {
			st = new StringTokenizer(br.readLine());
			
			int direction = Integer.parseInt(st.nextToken());
			field[i] = Integer.parseInt(st.nextToken());
			
			if ((direction == 1 || direction == 2) && field[i] > height) {
				height = field[i];
				heightIndex = i;
			}
			else if ((direction == 3 || direction == 4) && field[i] > width) {
				width = field[i];
				widthIndex = i;
			}
		}
		
		int right, left;
		int minWidth, minHeight;
		
		// 가로
		if (widthIndex == 0)	right = 5;
		else					right = widthIndex - 1;
		
		if (widthIndex == 5)	left = 0;
		else					left = widthIndex + 1;
		
		minWidth = Math.abs(field[right] - field[left]);
		
		// 세로
		if (heightIndex == 0)	right = 5;
		else					right = heightIndex - 1;
		
		if (heightIndex == 5)	left = 0;
		else					left = heightIndex + 1;
		
		minHeight = Math.abs(field[right] - field[left]);
		
		
		System.out.println((width*height - minWidth*minHeight) * k);
	}

}

댓글