백준

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

CD가참둥그렇다 2023. 9. 19. 15:00

1단계 개수 세기

  • 첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.
  • 첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.
import java.util.Iterator;
import java.util.Scanner;

public class Step_1 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int length = scan.nextInt();
		int[] Array1 = new int[length];
		
		for (int i=0; i<length; i++) {
			
			Array1[i] = scan.nextInt();
			
		}
		
		int a =0, b=scan.nextInt();
		
		for (int i = 0; i<length; i++) {
			if (Array1[i]==b) {
				a++;
			}
		}
		
		System.out.println(a);
		
		
	}
}

A.

  • int length를 선언하고 첫 int로 초기화한다.
  • int[] Array1 = new int [length]를 이용해 길이가 지정된 기본 값의 배열을 생성해준다.
  • for문을 이용해 배열에 각 int를 대입해준다.
  • int a와 b를 선언하고 a에는 0, b에는 입력된 int를 부여하고 초기화한다.
  • for문을 만들고 b와 Array1[i]가 같은 경우 a에 1을 더해주는 증감자를 적용하는 반복문을 만든다.
  • 반복문을 완료한 뒤 a를 출력하면 주어진 정수 v와 같은 배열의 내용물의 개수를 출력할 수 있다.

2단계 X보다 작은 수

  • 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
  • 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
  • X보다 작은 수를 입력 받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
import java.util.Scanner;

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

		int length = scan.nextInt();
		int a = scan.nextInt();
		int[] Array1 = new int[length];

		for (int i = 0; i < length; i++) {

			Array1[i] = scan.nextInt();

		}

		for (int i = 0; i < length; i++) {
			if (Array1[i] < a) {
				System.out.print(Array1[i] + " ");
			}
		}

	}
}

A.

  • int length를 선언하고 첫 int로 초기화한다.
  • int a를 선언하고 비교할 정수 X를 받아준다.
  • int[] Array1 = new int [length]를 이용해 길이가 지정된 기본 값의 배열을 생성해준다.
  • for문을 이용해 배열에 각 int를 대입해준다.
  • for문을 만들고 Array1[i]가 a보다 작은 경우 Array[i]와 빈칸을 출력하도록 한다.

3단계 최소, 최대

  • 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
  • 첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
import java.util.Scanner;

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

		int length = scan.nextInt();
		int[] Array1 = new int[length];

		for (int i = 0; i < length; i++) {

			Array1[i] = scan.nextInt();

		}
		int a = Array1[0];
		for (int i = 0; i < length; i++) {
			if (Array1[i] < a) {
				a = Array1[i];
			}
		}
		int b = Array1[0];
		for (int i = 0; i < length; i++) {
			if (Array1[i] > b) {
				b = Array1[i];
			}
		}
		System.out.print(a + " " + b);

	}
}

A.

  • int length를 선언하고 첫 int로 초기화한다.
  • int[] Array1 = new int [length]를 이용해 길이가 지정된 기본 값의 배열을 생성해준다.
  • for문을 이용해 배열에 각 int를 대입해준다.
  • int a를 선언하고 배열의 첫 int를 대입한다.
  • for문을 만들고 Array1[i]가 a보다 작은 경우 a에 Array1[i]를 대입하는 반복문을 만든다
  • int b를 선언하고 배열의 첫 int를 대입한다.
  • for문을 만들고 Array1[i]가 a보다 큰 경우 a에 Array1[i]를 대입하는 반복문을 만든다
  • print (a + “ ” + b)로 결과를 출력한다.

4단계 최댓값

  • 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
  • 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수 인지를 출력한다.
import java.util.Scanner;

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

		int[] Array1 = new int[9];

		for (int i = 0; i < 9; i++) {

			Array1[i] = scan.nextInt();

		}
		
		int a, b;
		a = Array1[0];
		b = 1;
		for (int i = 0; i < 9; i++) {
			if (Array1[i] > a) {
				a = Array1[i];
				b = i+1;
			}
		}
		System.out.println(a);
		System.out.println(b);

	}
}

A.

  • 배열을 선언하고 길이가 9인 기본 값의 배열로 초기화 시킨다.
  • Array1[]에 각각 int를 대입한다.
  • int a, b를 선언한다. a에는 배열의 첫 int로, b에는 1로 초기화 시킨다.
  • for문을 만들어주고 9번 반복하도록 만든다.
  • Array1[i]와 a를 비교하고, Array[i]가 a보다 크다면 a는 Array[i], b는 i+1로 대입한다. i는 0부터 세기 때문에 1을 더해야 우리가 세는 방식이 된다.
  • a와 b를 출력한다.

5단계 공 넣기

  • 첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
  • 둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다는 뜻이다.
  • 도현이는 입력으로 주어진 순서대로 공을 넣는다.
  • 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.
import java.util.Scanner;

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

		int length = scan.nextInt();
		int ball = scan.nextInt();
		int[] Array1 = new int[length];

		for (int i = 0; i < ball; i++) {

			int a, b, c;
			a = scan.nextInt()-1;
			b = scan.nextInt()-1;
			c = scan.nextInt();
			for (int j = a; j<=b; j++) {
				Array1[j] = c;

		}

		}
		for (int i = 0; i < length; i++) {
		System.out.print(Array1[i]);
		}

	}
}

A.

  • int length와 ball을 선언하고 각각 nextint 로 초기화 한다.
  • 배열 Array1을 선언하고 길이가 length인 기본 값인 배열로 초기화한다.
  • for문을 열고 ball만큼 반복되는 반복문을 작성한다.
  • int a, b, c를 선언하고 각각 nextint로 초기화한다.
  • a, b의 값은 바구니의 번호인데 배열에서의 바구니는 Array1[실제 바구니 번호-1]에 담기있기 때문에 a, b에 -1을 추가한다. 또는 이하 for문에서 Array[j-1]로 작성한다.
  • for문을 만들고 a~b까지 b를 포함하도록 반복문을 만들고, Array1[j]에 c를 대입한다.
  • for문을 만들어 배열의 각 int를 출력하는 반복문을 작성한다.

6단계 공 바꾸기

  • 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.
  • 도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.
  • 둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
  • 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.
import java.util.Scanner;

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

		int length = scan.nextInt();
		int ball = scan.nextInt();
		int[] Array1 = new int[length];
		
		for (int i=0; i<length; i++) {
			Array1[i] = i+1;
		}
		
		for (int i = 0; i < ball; i++) {

			int a, b, c;
			a = scan.nextInt()-1;
			b = scan.nextInt()-1;
			c = Array1[a];
			Array1[a] = Array1[b];
			Array1[b] = c;
		}
		
		for (int i = 0; i < length; i++) {
		System.out.print(Array1[i]+" ");
		}

	}
}

A.

  • int length와 ball을 선언하고 각각 nextint 로 초기화 한다.
  • 배열 Array1을 선언하고 길이가 length인 기본 값인 배열로 초기화한다.
  • for문을 작성하고 각 배열에 1~length의 값을 대입한다.
  • for문을 열고 ball만큼 반복되는 반복문을 작성한다.
  • int a, b, c를 선언하고 a, b를 nextint로 초기화한다.
  • a, b의 값은 바구니의 번호인데 배열에서의 바구니는 Array1[실제 바구니 번호-1]에 담겨있기 때문에 a, b에 -1을 추가한다.
  • c는 배열 내용물 교환을 위한 Array1[a]의 값을 임시로 담아둔다.
  • Array1[a] = Array1[b]로 Array1[a]를 바꾸고 Array1[b]는 c의 값을 부여한다.
  • for문을 만들어 배열의 각 int를 출력하는 반복문을 작성한다.

7단계 과제 안 내신 분..?

  • 입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.
  • 출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.
import java.util.Scanner;

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

		int[] Array1 = new int[30];

		for (int i = 0; i < 28; i++) {
			Array1[scan.nextInt()-1] = 1;
		}
		int a=0, b=0;
		for (int i = 0; i < 30; i++) {
			if (Array1[i] == 0&&a==0) {
				a = i+1;
			} 
			if (Array1[i]==0&&a!=0) {
				b= i+1;
			}
		}
		if (a < b) {
			System.out.println(a);
			System.out.println(b);
		} else {
			System.out.println(b);
			System.out.println(a);
		}

	}
}

A.

  • Array1 배열은 선언하고 길이가 30인 기본 값의 배열로 초기화한다.
  • for문을 만들고 Array[scan.nextInt()-1] = 1로 대입하는 반복문을 만들고 28번 반복한다.
  • int a, b를 선언하고 0으로 초기화한다.
  • 반복문을 만들고 조건문을 내부에 만든다. Array1[i]가 0이고 a가 0인 경우 a에 i+1을 붙여넣는다.
  • Array1[i]가 0이고 a가 0이 아닌 경우 b에 i+1을 붙여넣는다.
  • a와 b의 크기를 비교해 작은 숫자를 우선적으로 출력하는 조건문을 만든다.

8단계 나머지

  • 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
  • 첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
import java.util.Scanner;

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

		int[] Arr1 = new int[10];

		for (int i = 0; i < 10; i++) {
			Arr1[i] = scan.nextInt()%42;
		}
		
		int[] Arr2 = Arr1;
		for (int i = 0; i<10; i++) {
			for (int j = 0; j < i; j++) {
				if (Arr1[i] == Arr1[j]) {
					Arr2[i]=42;
				}
			}
		}
		int a=0;
		for (int i = 0; i<10; i++) {
			if (Arr2[i] == 42) {
				a++;
			}
		}
		System.out.println(10-a);

	}
}

A.

  • Arr1 배열은 선언하고 길이가 10인 기본 값의 배열로 초기화한다.
  • for문을 만들고 Arr1에 입력 받은 값을 42로 나눈 나머지를 대입한다.
  • Arr2[] 배열을 선언하고 Arr1의 값을 대입한ㄷ.
  • for문을 2개 겹쳐서 Arr1[i]와 Arr1[j]를 비교하여 같다면 Arr2에 42의 값을 대입한다.
  • int a를 선언하고 0으로 초기화한다.
  • Arr2의 값 중 42와 같은 값을 찾으면 a에 증감자를 적용하는 반복문을 적용한다.
  • 중복된 배열이 a개 있기 때문에 10-a만큼의 중복되지 않은 배열이 있음을 출력한다.

9단계 바구니 뒤집기

  • 첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
  • 둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)
  • 모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.
import java.util.Scanner;

public class Step_9 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int length, test;
		length=scan.nextInt();
		test=scan.nextInt();
		int[] Arr1 = new int[length];

		for (int i = 0; i < length; i++) {
			Arr1[i] = i+1;
		}
		int a, b;

		
		for (int i = 0; i<test; i++) {
			a=scan.nextInt()-1;
			b=scan.nextInt()-1;
			int[] Arr2 = new int[length];
			for (int j = a; j<=b; j++) {
				Arr2[j] = Arr1[b-j+a];
			}
			for (int j = a; j<=b; j++) {
				Arr1[j] = Arr2[j];
			}
		}
		
		for (int i=0; i<length; i++) {
			System.out.print(Arr1[i]+" ");
		}

	}
}

A.

  • int length, test로 선언하고 첫 줄의 정수로 초기화한다.
  • 배열 Arr1을 선언하고 for문을 통해 각 배열에 번호를 넣어준다.
  • 서로 바꿀 범위에 해당하는 정수를 받기 위해 int a, b를 선언한다.
  • 테스트 회수 만큼의 반복문을 만든다.
  • 서로 바꿀 범위를 받고 배열에 투입하기 위해 -1을 한 상태로 a, b에 대입하여 초기화한다.
  • 임시로 사용할 배열 Arr2를 선언하고 기본 값으로 초기화한다.
  • Arr1의 a~b까지의 배열을 Arr2의 b~a까지에 대입하는 반복문을 작성한다.
  • Arr2에 a~b까지의 배열을 Arr1의 a~b까지에 대입하는 반복문을 작성한다.
  • 배열의 각 항목을 출력하는 반복문을 만든다.

10단계 평균

  • 세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
  • 세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
  • 첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
import java.util.Scanner;

public class Step_10 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int length;
		length=scan.nextInt();
		double[] Arr1 = new double[length];

		for (int i = 0; i < length; i++) {
			Arr1[i] = scan.nextInt();
		}
		
		double max = 0;
		for (int i = 0; i < length; i++) {
			if (Arr1[i] > max) 	{
				max = Arr1[i];
			}
		}
		
		
		for (int i = 0; i < length; i++) {
			Arr1[i] = Arr1[i]*100/max;
		}
		
		double sum =0;
		for (int i = 0; i < length; i++) {
			sum += Arr1[i];
		}

		System.out.println(sum/length);
		
	}
}

A.

  • int length를 선언하고 첫 입력을 받아온다.
  • 평균의 오차 범위가 소수점이기 때문에 double 배열을 선언하고 기본 값으로 초기화한다.
  • for문을 만들고 배열에 입력 값을 대입한다.
  • 최대 값을 담아둘 double max를 선언하고 0으로 초기화한다.
  • for문을 통해 max에 최대 값을 대입하는 반복문을 만든다.
  • for문을 만들고 배열의 각 값을 *100/max 상태로 대입하는 반복문을 만든다.
  • 점수 합을 담을 double sum을 선언하고 0으로 초기화한다.
  • for문을 만들고 sum에 각 배열의 값을 더해주는 반복문을 만든다.
  • 합을 과목 수로 나누어 출력한다.