본문 바로가기

백준

백준 닷컴 단계 별로 풀어보기 10단계

1단계 직사각형

  • 세로 길이가 A cm, 가로 길이가 B cm인 직사각형의 넓이를 cm2 단위로 구하고, 단위 (cm2)를 생략하여 출력한다.
import java.util.Scanner;

public class Step_1 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int a = scan.nextInt();
		int b = scan.nextInt();
		System.out.println(a*b);
	}
}

A.

  • 가로와 세로의 곱으로 넓이 구한다.

2단계 직사각형에서 탈출

  • 한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.
import java.util.Scanner;

public class Step_2 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int x = scan.nextInt();
		int y = scan.nextInt();
		int w = scan.nextInt();
		int h = scan.nextInt();

		int[] arr = { x, y, (w - x), (h - y) };
		int low = arr[0];
		for (int i=0; i<4; i++) {
			if(arr[i]<low) {
				low=arr[i];
			}
		}
		System.out.println(low);
	}
}

A.

  • 최소 거리를 구하기 위해서 x, y 값과 w-x, h-y의 값 중 가장 작은 값을 구해준다.

3단계 네 번째 점

  • 세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.
  • 직사각형의 네 번째 점의 좌표를 출력한다.
import java.util.Scanner;

public class Step_3 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int[][] arr = new int[2][3];
		for(int i=0; i<3; i++) {
			for (int j=0; j<2; j++) {
				arr[j][i]=scan.nextInt();
			}
		}
		for(int i=0; i<3; i++) {
			for (int j=0; j<3; j++) {
				if(arr[0][i]==arr[0][j]&&i!=j) {
					arr[0][i]=0;
					arr[0][j]=0;
				}
			}
		}
		for(int i=0; i<3; i++) {
			for (int j=0; j<3; j++) {
				if(arr[1][i]==arr[1][j]&&i!=j) {
					arr[1][i]=0;
					arr[1][j]=0;
				}
			}
		}
		for(int i=0; i<2; i++) {
			for (int j=0; j<3; j++) {
				if (arr[i][j]!=0) {
					System.out.print(arr[i][j]);
				}
			}
			if (i==0) {
				System.out.print(" ");
			}
		}
		
	}
}

A.

  • int 배열을 [2][3]으로 만들고, 각 1차원 배열에 x,y 좌표를 넣는 반복문을 만든다.
  • 4번째 좌표는 x, y좌표 중 하나만 나온 좌표들의 집합이므로 반복문을 통해 각 좌표에서 중복되는 값을 0으로 처리한다.
  • 각 좌표에서 0이 아닌 값을 출력한다.

4단계 수학은 체육과목 입니다

  • "한 변의 길이가 1인 정사각형을 아래 그림과 같이 겹치지 않게 빈틈없이 계속 붙여 나간다. 가장 아랫부분의 정사각형이 n개가 되었을 때, 실선으로 이루어진 도형의 둘레의 길이를 구하시오.”
  • 첫 번째 줄에 가장 아랫부분의 정사각형 개수 n이 주어진다. (1 ≤ n ≤ 109)
import java.util.Scanner;

public class Step_4 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		Long a = scan.nextLong();
		System.out.println(4*a);
	}
}

A.

  • 답은 정사각형 개수의 4배 만큼이 된다.
  • int 범위를 넘어가는 값이 나오기 때문에 long으로 변수 설정을 한다.

5단계 대지

  • 첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다.
  • 첫째 줄에 N 개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 출력하시오.
import java.util.Scanner;

public class Step_4 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int test = scan.nextInt();
		
		int[][] arr = new int[2][test];
		for (int i=0; i<test; i++) {
			for (int j=0; j<2; j++) {
				arr[j][i]=scan.nextInt();
			}
		}
		
		int xMax=arr[0][0], xMin=arr[0][0], yMax=arr[1][0], yMin=arr[1][0];
		
		for (int i=0; i<test; i++) {
			if (arr[0][i]>xMax) {
				xMax=arr[0][i];
			}
			if (arr[0][i]<xMin) {
				xMin=arr[0][i];
			}
		}
		for (int i=0; i<test; i++) {
			if (arr[1][i]>yMax) {
				yMax=arr[1][i];
			}
			if (arr[1][i]<yMin) {
				yMin=arr[1][i];
			}
		}
		System.out.println((xMax-xMin)*(yMax-yMin));
		
	}
}

A.

  • 대지의 좌표는 x값의 최소값과 최대값/ y값의 최소값과 최대값을 이용하여 구할 수 있다.

6단계 삼각형 외우기

  • 삼각형의 세 각을 입력받은 다음,
  • 세 각의 크기가 모두 60이면, Equilateral
  • 세 각의 합이 180이고, 두 각이 같은 경우에는 Isosceles
  • 세 각의 합이 180이고, 같은 각이 없는 경우에는 Scalene
  • 세 각의 합이 180이 아닌 경우에는 Error
  • 를 출력하는 프로그램을 작성하시오.
import java.util.Scanner;

public class Step_6 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int a = scan.nextInt();
		int b = scan.nextInt();
		int c = scan.nextInt();
		
		boolean x = a==b, y = b==c, z = a==c;
		if (a+b+c!=180) {
			System.out.println("Error");
		} else if (a==b&&b==c) {
			System.out.println("Equilateral");
		} else if (x||y||z) {
			System.out.println("Isosceles");
		} else {
			System.out.println("Scalene");
		}
		
	}
}

A.

  • a b c의 합을 먼저 조건으로 걸고 에러 출력, else if로 정사각형을 거르고, else if로 이등변 삼각형을 거르고 나머지를 일반 삼각형으로 취급한다.

7단계 삼각형과 세 변

  • 각 줄에는 1,000을 넘지 않는 양의 정수 3개가 입력된다. 마지막 줄은 0 0 0이며 이 줄은 계산하지 않는다.
  • 각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.
import java.util.Scanner;

public class Step_7 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		String str = "";
		while (true) {
			int a = scan.nextInt();
			int b = scan.nextInt();
			int c = scan.nextInt();
			if (a==0&&b==0&&c==0) {
				break;
			}
			boolean x= a==b, y= a==c, z= b==c;
			boolean i= a>=b+c, j= b>=a+c, k= c>=a+b;
			if (a==b&&b==c) {
				str+="E";
			} else if (i||j||k) {
				str+="x";
			} else if (x||y||z) {
				str+="I";
			} else {
				str+="S";
			}
		}
		for (int i=0; i<str.length(); i++) {
			if(str.charAt(i)=='E') {
				System.out.println("Equilateral");
			}
			if(str.charAt(i)=='I') {
				System.out.println("Isosceles");
			}
			if(str.charAt(i)=='S') {
				System.out.println("Scalene");
			}
			if(str.charAt(i)=='x') {
				System.out.println("Invalid");
			}
		}
	}
}

A.

  • 삼각형의 성립 여부를 가장 먼저 체크(정사각형이 먼저 와도 됨)
  • 이등변 삼각형-일반 삼각형 순으로 체크 후 출력

8단계 세 막대

  • 영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.
    • 각 막대의 길이는 양의 정수이다
    • 세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
    • 삼각형의 둘레를 최대로 해야 한다.
  • a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오.
import java.util.Scanner;

public class Step_7 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int a = scan.nextInt();
		int b = scan.nextInt();
		int c = scan.nextInt();
		
		if (a>=b+c) {
			System.out.println(2*(b+c)-1);
		} else if (b>=a+c) {
			System.out.println(2*(a+c)-1);
		} else if (c>=a+b) {
			System.out.println(2*(a+b)-1);
		} else {
			System.out.println(a+b+c);
		}
		
	}
}

A.

  • 각 변의 길이 중 가장 긴 변의 길이가 다른 두 변의 길이 이상일 경우 삼각형이 되지 않는 점을 이용한다.
  • 가장 긴 변의 길이가 나머지 두 변의 길이의 합-1으로 계산하여 둘레를 결정한다.
  • 가장 긴 변의 길이가 나머지 두 변의 길이보다 작을 경우 세 변의 길이를 출력한다.