Q1. 총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.
입력 : 첫째 줄에 정수의 개수 N이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.
출력 : 첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.
✅ 백준 10807번 바로가기
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int arr[] = new int[N];
int count = 0;
for(int i=0; i<arr.length; i++){
arr[i] = sc.nextInt();
} // end of for i
int v = sc.nextInt();
for(int i=0; i<arr.length; i++){
if(v==arr[i]){
count++;
}
} // end of for i
sc.close();
System.out.println(count);
}
}
정수 N에 배열 arr의 길이를 입력받아와 저장한다. 배열 arr을 초기화 할 때 배열의 길이를 N으로 설정해서 사용자가 입력한 길이만큼 설정되도록 한다. for문으로 배열 arr에 입력을 받아오고, 정수 v에 찾고자 하는 수를 입력받아와 저장한다. 그리고 v와 배열arr을 비교해서 찾고자 하는 숫자가 있으면 count를 1씩 증가시킨다.
Q2. 정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 N과 X가 주어진다. 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
출력 : X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
✅ 백준 10871번 바로가기
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int X = sc.nextInt();
int A[] = new int[N];
for(int i=0; i<A.length; i++){
A[i] = sc.nextInt();
} // end of for i
for(int i=0; i<A.length; i++){
if(X>A[i]){
System.out.print(A[i]+" ");
}
} // end of for i
sc.close();
}
}
정수 N에 배열 A의 길이를 입력받아와 저장한다. 배열 A을 초기화 할 때 배열의 길이를 N으로 설정해서 사용자가 입력한 길이만큼 설정되도록 한다. 정수 X에 비교 할 숫자를 입력받아와 저장한다. for문을 이용해서 배열 A에 수열을 입력하고 다음 for문을 이용해서 X와 배열 A의 숫자와 비교하여 출력한다.
Q3. N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
입력 : 첫째 줄에 정수의 개수 N이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
출력 : 첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
✅ 백준 10818번 바로가기
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int arr[] = new int[N];
for(int i=0; i<arr.length; i++){
arr[i] = sc.nextInt();
} // end of for i
int max = arr[0];
int min = arr[0];
for(int i=0; i<arr.length; i++){
if(arr[i]>max){
max = arr[i];
} else if (arr[i]<min){
min = arr[i];
}
} // end of for i
sc.close();
System.out.print(min+" "+max);
}
}
정수 N에 배열 arr의 길이를 입력받아와 저장한다. 배열 arr을 초기화 할 때 배열의 길이를 N으로 설정해서 사용자가 입력한 길이만큼 설정되도록 한다. for문을 이용해서 배열 arr에 정수를 입력한다. 배열의 첫 번째 요소 'arr[0]'의 값으로 최대값과 최소값을 의미하는 max,min 변수를 초기화 하였다. 그 다음 for문을 통해서 배열의 첫 번째 요소 'arr[0]'부터 max와 비교한다. 만약 max보다 크면 그 값을 max에 저장한다. 최소값도 마찬가지로 구해서 출력한다.
Q4. 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
입력 : 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
출력 : 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
✅ 백준 2562번 바로가기
import java.util.*;
public class Main {
public static void main(String[] args){
final int SIZE = 9;
int arr[] = new int[SIZE];
Scanner sc = new Scanner(System.in);
int index = 0;
for(int i=0; i<SIZE; i++){
arr[i] = sc.nextInt();
} // end of for i
int max = arr[0];
for(int i=0; i<SIZE; i++){
if(arr[i]>max){
max = arr[i];
index = i+1;
}
} // end of for i
sc.close();
System.out.println(max);
System.out.println(index);
}
}
위의 최대값, 최소값 구하는 비슷한 문제이다. 최댓값 출력하는 건 위에 문제에서 설명했으니 넘어가고, 최댓값이 몇 번째 수인지를 출력해야하므로 index변수에 i+1값을 저장해서 출력해주면 된다. +1을 하는 이유는 배열의 인덱스는 0부터 시작하기 때문이다.
Q5. 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다. 도현이는 앞으로 M번 공을 넣으려고 한다. 도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 공을 넣는 바구니는 연속되어 있어야 한다. 공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.
입력 : 첫째 줄에 N이 주어진다. 둘때 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다는 뜻이다. 예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는 뜻이다. 도현이는 입력으로 주어진 순서대로 공을 넣는다.
출력 : 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.
✅ 백준 10810번 바로가기
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int arr[] = new int[N];
for(int i=0; i<M; i++){
int I = sc.nextInt();
int J = sc.nextInt();
int K = sc.nextInt();
for(int j=I-1; j<J; j++){
arr[j] = K;
} // end of for j
} // end of for i
sc.close();
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
}
}
N은 배열의 길이, M은 공을 넣을 횟수 (입력 라인)이다. 그래서 첫번째 반복문에서 조건식의 범위를 i<M으로 설정한 것이다. 문제에서 i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다고 했으므로 변수 I,J,K를 선언한다. 그 이중 for문을 보면 int j=I-1로 했는데, 배열의 인덱스가 0부터 시작하기 때문에 -1을 해준 것이다. 조건식의 범위는 i번부터 j번 바구니까지라고 했으므로 j<J로 한다. 바구니에 k번 번호가 적혀있는 공을 넣는다고 했으므로 arr[j]에 입력받은 번호의 공(K)를 저장한다.
Q6. 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다. 도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다. 공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.
입력 : 첫째 줄에 정수의 개수 N이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다.
출력 : 도현이는 입력으로 주어진 순서대로 공을 교환한다.
✅ 백준 10813번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int arr[] = new int[N];
for (int i=0; i<arr.length; i++){
arr[i] = i+1;
} // end of for i
for(int i=0; i<M; i++){
int I = sc.nextInt()-1;
int J = sc.nextInt()-1;
int tmp = arr[I];
arr[I] = arr[J];
arr[J] = tmp;
} // end of for i
sc.close();
for(int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
} // end of for i
}
}
문제는 길지만 생각보다 간단한 문제이다. 일단 도현이가 가지고 있는 바구니의 개수 N, 앞으로 공을 바꿀 횟수 M을 초기화 한다. 문제에서 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다고 했으므로 첫번째 반복문을 통해 배열 arr에 1부터 N까지의 숫자를 저장한다. 그 다음 공을 바꿀 횟수 M만큼 반복문을 실행해서 tmp를 이용해 배열의 값을 서로 바꿔주기만 하면 된다. I,J에 -1을 해준 이유는 배열의 인덱스는 0부터 시작하기 때문이다.
Q7. X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
입력 : 입력은 총 28줄로 각 제출자(학생)의 출석번호 n가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.
출력 : 출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.
✅ 백준 5597번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int arr[] = new int[31];
for(int i=1; i<29; i++){
int a = sc.nextInt();
arr[a] = 1;
} // end of for i
for(int i=1; i<arr.length; i++){
if(arr[i]!=1){
System.out.println(i);
}
} // end of for i
sc.close();
}
}
1번부터 30번까지의 번호가 있다고 했으므로 배열 arr의 길이는 31로 설정한다. 출석번호를 입력 받아야 하는데 총 28명의 출석을 입력 받는다 했으므로 첫번째 조건문에서 조건식의 범위를 i=0부터 i=29로 설정한다. arr[a]=1로 저장하는 이유는 출석을 한 학생은 1을 저장하고, 출석을 하지 않은 학생은 0을 저장하기 위함이다. 배열은 값이 초기화 되지 않으면 기본값이 0이므로 출석하지 않은 학생은 자동으로 0이 저장될 것이다. 만약 3번인 학생이 출석을 했다면 arr[3]=1이 된다. 그 후 다음 반복문에서 1번부터 30번(arr[1]~arr[30])까지 배열에 저장된 값이 1이 아닌 배열을 찾아서 출력한다.
Q8. 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
출력 : 첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
✅ 백준 3052번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int arr[] = new int[10];
HashSet<Integer> hs = new HashSet<Integer>();
for(int i=0; i<arr.length; i++){
int a = sc.nextInt();
hs.add(a%42);
} // end of for i
sc.close();
System.out.print(hs.size());
}
}
HashSet()은 Set 인터페이스의 구현 클래스이다. 그렇기에 Set의 성질을 그대로 상속 받는데, Set은 객체를 중복해서 저장할 수 없고 하나의 null값만 저장할 수 있다. 또 저장 순서가 유지되지 않는다. Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점이다. HashSet()은 객체를 저장하기 전에 먼저 객체의 HashCode()메소드를 호출해서 해시 코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals()메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복을 저장하지 않는다.
✅HashSet 선언
HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();
HashSet<Integer> iHs = new HashSet<Integer>();
HashSet<String> sHs = new HashSet<String>();
✅HashSet 값 추가
HashSet변수명.add(value)
iHs.add(4);
iHs.add(5);
sHs.add("yeo");
sHs.add("seongil");
shs.add("a");
✔️추가되는 값은 HashSet<데이터타입>에 맞는 데이터만 추가한다.
✅HashSet 값 삭제
HashSet변수명.remove(value);
iHs.remove(4);
sHs.remove("yeo");
ihs.clear(); // 모두 삭제
✔️ 모두 삭제하고 싶은 경우 clear() 메소드를 사용한다.
✅HashSet의 크기 구하기
HashSet변수명.size();
System.out.println("sHs의 크기 : " +sHs.size()); // sHs의 크기 : 3
Q9. 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니 ,..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다. 도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다. 바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 N과 M이 주어진다. 둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. 도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.
출력 : 모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.
✅ 백준 10811번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int arr[] = new int[N];
for(int i=0; i<arr.length; i++){
arr[i] = i+1;
} // end of for i
for(int i=0; i<M; i++){
int I = sc.nextInt()-1;
int J = sc.nextInt()-1;
for(int j = I; j<=(J-I)/2+I; j++){
int tmp = 0;
tmp = arr[j];
arr[j] = arr[J-j+I];
arr[J-j+I] = tmp;
} // end of for j
} // end of for i
sc.close();
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
} // end of for i
}
}
역순으로 정렬하는 문제이다. 만약 1, 2, 3, 4, 5를 역순으로 정렬할 때, 1과 5를 바꾸고, 2와 4를 바꾸고 3은 3과 (그대로) 바꾸면 된다. 또 1, 2, 3, 4를 역순으로 정렬할 때 1과 4를 바꾸고, 2와 3을 바꾸면 된다. 즉, I와 J를 바꾸고, I+1과 J-1를 바꾸면 된다. 역순으로 정렬하는 반복문의 조건식을 I부터 (J-I)/2+I로 설정한 것이다.
Q10. 세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다. 예를 들어, 세준이의 최고점이 70점이고, 수학점수가 50점이었으면 수학점수는 50/70*100이 되어 71.43점이 된다. 세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력 : 첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력 : 첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대 오차 또는 상대오차가 10의 -2제곱 이하이면 정답이다.
✅ 백준 1546번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int arr[] = new int[N];
float avg = 0.0f;
int scoreMax = arr[0];
for(int i=0; i<arr.length; i++){
arr[i] = sc.nextInt();
if(arr[i]>scoreMax){
scoreMax=arr[i];
}
} // end of for i
sc.close();
for(int i=0; i<arr.length; i++){
avg += ((float)arr[i]/scoreMax*100)/N;
} // end of for i
System.out.print(avg);
}
}
문제에서 평균 구하는 식을 점수/최고점*100이라고 했다. 예를 들어 10, 20, 30을 입력 했으면 평균은 avg = ((10/30*100) + (20/30*100) + (30/30*100)) / 3이 된다. 최대값 구하는 방법은 위에서 다루었으니 넘어가고, 평균은 점수가 들어있는 배열 arr을 순차적으로 돌면서 계산하면 된다. 평균 값은 실수이므로 (float)으로 형변환 해주어서 계산 한다.
'백준 문제풀이 > 단계별 문제 풀이 (Basic-Java)' 카테고리의 다른 글
05. 문자열 (0) | 2023.03.06 |
---|---|
03. 반복문 (0) | 2023.02.25 |
02. 조건문 (0) | 2023.02.15 |
01. 입출력과 사칙연산 (0) | 2023.02.13 |