[백준] 15894. 수학은 체육과목 입니다 / 9063. 대지

진예·2023년 10월 4일
0

Baekjoon : JAVA

목록 보기
14/76
post-thumbnail

📌 문제 : 수학은 체육과목 입니다

[15984] 수학은 체육과목 입니다

성원이는 수학을 정말 못 하는 고등학생이다. 수학을 못하는 대신 근성과 팔 힘이 뛰어난 성원이는 수학 시험에서 수학 지식을 사용하지 않고 근성과 체력을 사용해 문제를 푼다. 지난 시험에서는 아래 사진에 나와있는 문제를 근성과 체력을 사용해 열심히 풀었지만 사진에서 볼 수 있듯이 틀려버리고 말았다!

결국 이 문제는 틀려버렸지만 성원이는 여전히 자신의 체력에 강한 자신감을 갖고 있다. 어떤 어려운 문제가 나와도 이런 식으로 근성과 체력을 사용하면 다 풀 수 있으니 이 방법은 최고의 방법이라고 생각하고 있다.

성원이의 친구 형석이는 근성과 체력으로 수학 문제를 푸는 것은 굉장히 무식한 방법이라고 생각한다. 형석이는 수학을 공부하면 문제를 훨씬 빨리 풀 수 있다는 것을 알려주기 위해 위 사진에 나와있는 문제를 갖고 성원이와 퀴즈 내기를 하기로 했다. 위 사진의 문제를 다시 정리하면 아래와 같다.

"한 변의 길이가 1정사각형을 아래 그림과 같이 겹치지 않게 빈틈없이 계속 붙여 나간다. 가장 아랫부분의 정사각형n개가 되었을 때, 실선으로 이루어진 도형의 둘레의 길이를 구하시오."

가장 아랫부분의 정사각형 개수가 주어지면 그에 해당하는 답을 출력하는 프로그램을 만들어 형석이를 도와주자!

⬇️ 입력

첫 번째 줄에 가장 아랫부분의 정사각형 개수 n이 주어진다. (1 ≤ n ≤ 10^9)

⬆️ 출력

첫 번째 줄에 형석이가 말해야 하는 답을 출력한다.

💡 코드 : 수학은 체육과목 입니다


✅ 오늘도 역시 노가다로 해결하기,, 몇 번 그려보니 규칙이 n * 4 로 굉장히 간단했다! 주의할 점은 n의 범위가 10의 9승이므로 long 타입을 사용해야 한다.

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		long n = Long.parseLong(br.readLine());
		bw.write((n * 4) + "");
		
		br.close();
		bw.close();
	}
}


📌 문제 : 대지

[9063] 대지

임씨는 1950 년 한국전쟁으로 많은 손해를 본 사람들 중 하나다. 전쟁 통에 손해보지 않은 사람이 어디 있을까 만은 그는 6.25 가 일어나기 전만 해도 충청도 지방에 넓은 대지를 소유한 큰 부자였다. 전쟁이 나자 임씨는 땅문서와 값 나가는 것들만 챙겨서 일본으로 피난을 가지만 피난 중에 그만 땅문서를 잃어버리고 만다. 전쟁이 끝난 후에 임씨의 땅은 이미 다른 사람들의 논밭이 되어 있었고, 임씨는 땅을 되찾으려 했지만 문서가 없으니 생떼 쓰는 것과 다를 바 없었다. 이러다가 임씨는 길바닥에 나앉게 생겼다.

이때, 임씨에게 좋은 생각이 떠올랐으니 바로 자신이 습관처럼 땅 깊숙이 뭔가 표식을 해놓았던 사실이다. 임씨는 한적할 때마다 자신의 논밭을 거닐다가 땅속 깊은 곳에 자신의 이름이 씌어진 옥구슬을 묻어놓았던 것이다. 즉, 어떤 지점에서 그의 이름이 적힌 옥구슬이 나온다면 그 지점은 예전에 임씨의 땅이었다는 것을 증명하는 것이다.

임씨는 즉시 민사소송을 통해 자신의 땅을 찾고자 했고 논리적인 근거를 들어 옥구슬이 나오는 지점이 원래 자신의 땅의 한 지점이었다는 것을 주장하여 결국 담당판사를 설득하는 데에 성공하였다. 담당판사는 다음과 같은 판결을 내렸다. “ 6.25 이전의 개인소유 대지들은 99%가 남북, 동서 방향으로 평행한 직사각형 모양이었으므로, 임씨의 이름이 새겨진 옥구슬이 나오는 모든 지점을 포함하는 가장 작은 남북, 동서 방향으로 평행한 변을 갖는 직사각형의 대지를 임씨의 소유로 인정한다.” 임씨는 많은 손해를 보는 셈이지만 더 이상을 요구할 만한 근거가 없었기 때문에 이 판결을 따르기로 했다.

임씨의 이름이 새겨진 옥구슬의 위치 N개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오. 단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며, x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다.

예를 들어 위와 같이 (2, 1), (3, 2), (5, 2), (3, 4) 네 점에서 옥구슬을 발견하였다면, 임씨에게 돌아갈 대지는 (2, 1), (5, 1), (2, 4), (5, 4)를 네 꼭짓점으로 하는 직사각형이며, 넓이는 (5 - 2) × (4 - 1) = 9 가 된다.

⬇️ 입력

첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다.

⬆️ 출력

첫째 줄에 N 개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 출력하시오.

💡 코드 : 대지

✅ 문제가 겁나 길지만,, 결국 핵심을 추려보면 주어진 점들을 이용하여 직사각형을 만들어 넓이를 구하는 문제이다! 직사각형의 세로y 최댓값 - y 최솟값, 가로x 최댓값 - x 최솟값 을 통해 구할 수 있다. 가로, 세로를 구하는 과정에서 같은 연산을 반복하므로 메서드를 따로 빼서 호출하는 방식으로 풀어봤다.

  • max(num, max) : 최댓값을 구하는 메서드
  • min(num, min) : 최솟값을 구하는 메서드

  • groud(max, min) : 가로/세로 길이를 구하는 메서드
    ➡️ 좌표가 음수인 경우를 고려하여, 두 좌표의 부호가 다른 경우에는 Math(Math.abs(max) + Math.abs(min)), 같은 경우에는 Math.abs(max - min) 수행
import java.io.*;
import java.util.StringTokenizer;
public class Main {
	
	static int max(int num, int max) { // 최댓값
		return (num > max) ? num : max;
	}
	
	static int min(int num, int min) { // 최솟값
		return (num < min) ? num : min;
	}
	
	static int ground(int max, int min) { // 넓이
		if((max < 0  && min > 0) || (max > 0 && min < 0)) 
			return Math.abs(max) + Math.abs(min);
		else return Math.abs(max - min);
	}
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int Xmax = -10001; int Xmin = 10001;
		int Ymax = -10001; int Ymin = 10001;
		int x, y;
		
		for(int i=0;i<n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			x = Integer.parseInt(st.nextToken());
			y = Integer.parseInt(st.nextToken());
			Xmax = max(x, Xmax); Xmin = min(x, Xmin);
			Ymax = max(y, Ymax); Ymin = min(y, Ymin);
		}
		
		x= ground(Xmax, Xmin);
		y= ground(Ymax, Ymin);
		bw.write((x * y) + "");
		
		br.close();
		bw.close();
	}
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글