서론
이번에는 기하: 직사각형과 삼각형을 풀어보았다.
난이도가 낮아서 어렵지 않게 풀어볼 수 있었다.
27323 : 직사각형
문제
https://www.acmicpc.net/problem/27323
27323번: 직사각형
정수 A, B 가 주어진다. 세로 길이가 A cm, 가로 길이가 B cm 인 아래와 같은 직사각형의 넓이를 cm2 단위로 구하시오.
www.acmicpc.net
이 문제는 가로, 세로를 받아 사각형의 넓이를 구하는 문제이다
해설
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));
int h = Integer.parseInt(br.readLine());
int w = Integer.parseInt(br.readLine());
bw.write(String.valueOf(h*w));
bw.flush();
bw.close();
}
}
아주 간단해서 설명할 것도 없다!
1085 : 직사각형에서 탈출
문제
https://www.acmicpc.net/problem/1085
1085번: 직사각형에서 탈출
한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램
www.acmicpc.net
해설
import java.io.*;
import java.util.StringTokenizer;
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int distances[] = {x, y, h-y, w-x};
int dist = 1000;
for (int i = 0; i < 4; i++) {
dist = dist >= distances[i] ? distances[i] : dist;
}
bw.write(String.valueOf(dist));
bw.flush();
bw.close();
}
}
현재 위치 x,y에서 경계선까지 가는 거리를 구하기 위해서는 경계선 4개까지의 거리를 구하고 이 중 가장 최소값을 구하면 된다고 생각했다.
그렇다면 각 경계선까지의 거리를 구하면
왼쪽 경계면 : x, 오른쪽 경계면 w-x, 아래쪽 경계면 : y ,위쪽 경계면 h-y이다.
이 4개의 경계면까지의 거리 중 최소를 구하여 출력하면 되는 문제이다.
3009 : 네 번째 점
문제
https://www.acmicpc.net/problem/3009
3009번: 네 번째 점
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.
www.acmicpc.net
이 문제는 3개의 좌표를 받고, 직사각형을 만들기 위한 4번째 점을 구하는 문제이다.
해설
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
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));
int X[] = {0, 0, 0};
int Y[] = {0, 0, 0};
for (int i = 0; i < 3; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
X[i] = Integer.parseInt(st.nextToken());
Y[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(X);
Arrays.sort(Y);
int x = X[0] == X[1] ? X[2] : X[0];
int y = Y[0] == Y[1] ? Y[2] : Y[0];
StringBuilder sb = new StringBuilder();
sb.append(x).append(" ").append(y);
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
먼저 이 문제를 풀때는 그런 생각이 없었지만, 이제와서 보니 내가 푼 방식으로 풀게되면 안되는 사각형의 모양이 있다는 것을 알아차렸다. 하지만 문제의 의도에는 해당 사각형이 없었던 듯 ㅎ
아무튼 해설해보자면, 사각형이 아래의 이미지 중 왼쪽 사각형임을 가정하고 문제를 풀었는데, 3개의 점 중 결국 x좌표가 같은 좌표 2개, y좌표가 같은 좌표 2개가 존재해야 직사각형이 만들어진다.
그렇기 때문에 3개의 점을 입력받아 정렬하면, x1,x1,x2와 y1,y2,y2 등 이런 식으로 정렬될 것이기 때문에,
맨 앞 인덱스 2개가 같다면, 나머지 1개의 좌표의 값과 같은 값이 필요하므로, 3항 연산자를 이용하여 추가될 좌표의 x,y값을 저장합니다.
하지만, 이렇게 풀면 왼쪽의 경우는 구할 수 있는데, 오른쪽의 경우에는 x,y좌표가 모두 각각 다를 수 있기 때문에 못구한닷..ㅎ
15894 : 수학은 체육과목 입니다.
문제
https://www.acmicpc.net/problem/15894
15894번: 수학은 체육과목 입니다
성원이는 수학을 정말 못 하는 고등학생이다. 수학을 못하는 대신 근성과 팔 힘이 뛰어난 성원이는 수학 시험에서 수학 지식을 사용하지 않고 근성과 체력을 사용해 문제를 푼다. 지난 시험에서
www.acmicpc.net
이 문제는 정사각형 n개를 계속 붙여 나갔을 때 겉의 둘레를 구하는 문제이다.
해설
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
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));
BigInteger n = new BigInteger(br.readLine());
BigInteger four = new BigInteger("4");
bw.write(String.valueOf(n.multiply(four)));
bw.flush();
bw.close();
}
}
이 문제를 풀기 위해서 머리속에 도형을 그려가며, 둘레를 계산해보니 그냥 n * 4를 하면 된다는 것을 알게되었다.
하지만, 입력값의 범위가 10^9라는 것을 확인하지 못하여 틀렸었다..
그래서 큰 수를 사용해야 했는데, long을 사용해도 되지만, BigInteger 사용법을 다시 익혀보고자 이를 사용하여 해결해보았다.
9063 : 대지
문제
https://www.acmicpc.net/problem/9063
9063번: 대지
첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다.
www.acmicpc.net
이 문제는 N개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 구하는 문제이다.
해설
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
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));
int N = Integer.parseInt(br.readLine());
int x[] = new int[N];
int y[] = new int[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
x[i] = Integer.parseInt(st.nextToken());
y[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(x);
Arrays.sort(y);
int result = (x[N-1] - x[0]) * (y[N-1] - y[0]);
bw.write(String.valueOf(result));
bw.flush();
bw.close();
}
}
N개의 점을 둘러싸는 직사각형의 넓이를 구하는 문제이므로,
입력받은 좌표들 중 x좌표 중 가장 큰 값 - 가장 작은 값을 하면 직사각형의 밑변의 길이를 구할 수 있고,
y좌표도 동일하게 계산하면 직사각형의 높이를 구할 수 있으므로, 이 둘을 곱하면 넓이를 구할 수 있다.
10101 : 삼각형 외우기
문제
https://www.acmicpc.net/problem/10101
10101번: 삼각형 외우기
문제의 설명에 따라 Equilateral, Isosceles, Scalene, Error 중 하나를 출력한다.
www.acmicpc.net
이 문제는 각을 통해 간단하게 삼각형이 어떤 삼각형인지 판별하는 문제이다.
해설
import java.io.*;
import java.util.Arrays;
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));
int A = Integer.parseInt(br.readLine());
int B = Integer.parseInt(br.readLine());
int C = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
if(A == 60 && B == 60 && C == 60){
sb.append("Equilateral");
}
else if(A+B+C == 180 && (A == B || B == C || A == C)){
sb.append("Isosceles");
}
else if(A+B+C == 180 && (A != B && B != C && A != C)){
sb.append("Scalene");
}
else{
sb.append("Error");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
이 문제는 간단하게 if문을 통해 판별하고 출력해보았다.
5073 : 삼각형과 세 변
문제
https://www.acmicpc.net/problem/5073
5073번: 삼각형과 세 변
각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.
www.acmicpc.net
이 문제는 위 문제와 다르게 각도 대신 길이를 이용하여 삼각형을 판별한다.
해설
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
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));
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int len[] = new int[3];
len[0] = Integer.parseInt(st.nextToken());
len[1] = Integer.parseInt(st.nextToken());
len[2] = Integer.parseInt(st.nextToken());
if(len[0] == 0 && len[0] == 0 && len[0] == 0){
break;
}
Arrays.sort(len);
if(len[0] + len[1] <= len[2]){
bw.write("Invalid");
}
else if(Arrays.stream(len).max().getAsInt() ==
Arrays.stream(len).min().getAsInt()){
bw.write("Equilateral");
}
else if(len[0] == len[1] || len[1] == len[2] || len[2] == len[1]){
bw.write("Isosceles");
}
else{
bw.write("Scalene");
}
bw.write("\n");
}
bw.flush();
bw.close();
}
}
이 문제는 길이를 배열에 저장하고 이를 통해 판별하도록 하였다.
이때, 정삼각형일 경우, 배열에 저장된 가장 큰 값과, 가장 작은 값이 같다면, 모두 같은 값이므로,
Arrays.stream(len).max().getAsInt()를 사용하였다.
이를 처음 사용해보았는데, getAsInt를 사용하지 않으면 Optional 객체로 반환되어 그 안의 값이 같더라도
동일하다고 나오지 않는 것을 알아볼 수 있었고, 차근차근 프로젝트에서 처럼 Optinal을 해당 자료형으로 변환하기 위한 과정을 수행해주어야 한다는 것을 다시 생각해볼 수 있었다!.
14215 : 세 막대
문제
https://www.acmicpc.net/problem/14215
14215번: 세 막대
첫째 줄에 a, b, c (1 ≤ a, b, c ≤ 100)가 주어진다.
www.acmicpc.net
이 문제는 막대 3개를 사용하여 최대 둘레를 가진 삼각형을 만드는 문제로, 막대의 길이는 마음대로 줄일 수 있다.
해설
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int len[] = new int[3];
len[0] = Integer.parseInt(st.nextToken());
len[1] = Integer.parseInt(st.nextToken());
len[2] = Integer.parseInt(st.nextToken());
Arrays.sort(len);
if(len[0] + len[1] <= len[2]){
len[2] = len[0] + len[1] - 1;
}
bw.write(String.valueOf(len[0]+len[1]+len[2]));
bw.flush();
bw.close();
}
}
삼각형의 조건 중 가장 큰 길이 < 나머지 두 길이의 합 인 조건을 만족시키지 못하면 삼각형이 될 수 없다.
만약 이 조건을 만족하는 상태에서는 모든 막대의 길이를 더하여도 되지만,
삼각형의 조건을 만족하지 못한다면, 가장 긴 막대의 길이를 나머지 두 길이의 합보다 작게 만들어야 한다.
이때, 가장 긴 막대의 길이가 두 길이의 합 - 1이라면, 삼각형의 조건도 만족하며, 만들어질 수 있는 삼각형의 최대 둘레를 가지게 될 것이다!.
결론
간단하게 생각해서 풀 수 있는 문제들이 많았다.
모든 문제가 이렇게 간단하게 풀렸으면 너무 좋게따..
'CodingTest > 백준' 카테고리의 다른 글
[백준] 브루트포스 (0) | 2023.07.23 |
---|---|
[백준] 시간복잡도 (0) | 2023.07.20 |
[백준] 약수, 배수와 소수 (0) | 2023.07.13 |
[백준] 일반 수학 1 (0) | 2023.07.05 |
[백준] 1차원 배열, 문자열 (0) | 2023.06.30 |