본문 바로가기

코테 문제 풀어보기

[ 수학 ] - n번째 큰수 , 소수 찾기 ,최대공약수/최소공배수 ,소수

오늘은 최대공약수와 , 최소공배수 , 소수를 알아보고 문제를 풀어봤다.

 

최대공약수 : 약수중 가장큰수 , ex) 6 , 12   일떄 6은 1,2,3,6이 약수 , 12는 1,2,3,4,6,12 가 약수이떄 이때 가장 큰 약수 6이 최대 공약수가 된다

 

최소공배수 : 배수중 공통되는 배수가 가장 작은값  ex) 4, 6  일때 4의 배수 4,8,12,16,20,24 , 6의배수 6,12,18,24.. 첫번째 겹치는 12가 최소 공배수이다

 

소수 : 약수중  몫이 1과 자기자신이 되는 수 ex) 2 ,3 ,5 7, 11, 13 ,17 ,19 ,23 ....

 

 

1. N번째 큰 수

입력받은 값은 배열에 담고 Arrays.sort를 사용하여   전체 길이 - N번째 =  작은수를 찾았다 ( 큰수를 찾으려면 reverse를 사용해야한다 ) 

 

https://www.acmicpc.net/problem/2693

 

2693번: N번째 큰 수

첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,000보

www.acmicpc.net


import java.util.*;

public class Main {

public static void main(String[] args) { 

Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int n = Integer.parseInt(input);

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

String str = sc.nextLine();
int[] arr = new int[10];
for(int j = 0 ; j<arr.length;j++) {
arr[j]=Integer.parseInt(str.split(" ")[j]);
}
Arrays.sort(arr);
System.out.println(arr[7]);
}


}
}

 

 

 

 

2. 소수찾기

주어진 값중에 소수가 몇개인지를찾는 문제이다.

주의사항은 0과 1을 소수에서 제외해야하고 , 값 N이 소수인지 찾을때 2부터 n까지 나눗셈을 하여 나머지가 0인 경우가 아닌경우만 소수로 판단한다.

 

https://www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net


import java.util.*;

public class Main {

public static void main(String[] args) { 

Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int n = Integer.parseInt(input);

String str = sc.nextLine();
int count = 0;
for(int i =0 ; i < n ;i++) {
boolean b = false;

int[] arr = new int[n];
for(int j = 0 ; j<arr.length;j++) {
arr[j]=Integer.parseInt(str.split(" ")[j]);
}

if(arr[i]==0) {
b=true;
}
if(arr[i]==1) {
b=true;
}
for(int j = 2;j<arr[i];j++) {
if(arr[i]%j==0) {
b=true;
}
}
if(!b) count++;

}
System.out.println(count);

}
}

 

 

3. 최대공약수와 최소공배수 

입력값 n과 m 둘다 만족하는 약수를 찾고 찾을때마다 해당 약수를 기억한다.

마지막에 남은 약수가 최대공약수가 되고 

n*m/ 최대공약수를 하면 최소 공배수를 구할수 있다. 

 

https://www.acmicpc.net/problem/2609

 

2609번: 최대공약수와 최소공배수

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

www.acmicpc.net

 


import java.util.*;

public class Main {

public static void main(String[] args) { 

Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int n = Integer.parseInt(input.split(" ")[0]);
int m = Integer.parseInt(input.split(" ")[1]);

int L = 0 ; //최대공약수 
for( int i=1 ; i<=n && i <=m ; i++) {
if ( n%i==0&& m%i==0) {
L=i;
}
}
int O = n*m/L;
System.out.println(L);
System.out.println(O);
}
}

 

 

 

 

 

4. 지정된 범위내의 소수를 찾아 더하고 , 가장작은 소수를 뽑아라 

소수찾기 알고리즘 공부하면서  소수의 배수는 소수가 아니라는것을 적용한 문제이다

 

수가 크다는 가정을하고 위에 소수찾기와 다르게 진행하였다

 

ex) 주어진수가 2~120이라고하면 , 2부터 120까지 하나씩 소수인지를 검사할 예정이다

첫번째 2는 소수이다.  그리고 2를 제외한 ,4,6,8,10....120) 은 소수가 아님으로 소수검사를 할필요가없다

3의 배수 3을제외한 ,6,9,12....120) 또한 소수가 아님으로 검사할 필요가없다. 이렇게되면 양이 확 줄어든다.

 

이 방식을 사용하기위해 boolean 배열을 사용하였다. 

 

 

https://www.acmicpc.net/problem/2581

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

 

package com.myproject.CodeTest;

import java.util.*;

public class Main {

public static void main(String[] args) { 

Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
int m = Integer.parseInt(a);
String b = sc.nextLine();
int n = Integer.parseInt(b);

boolean[] arr = new boolean[n+1];
ArrayList<Integer> list =new ArrayList<Integer>();
int total=0;
for( int i = m ; i <= n ; i++) {
arr[0]=true; //소수는 2부터 생기때문
arr[1]=true; //소수는 2부터 생기때문
if(!arr[i]) {  //이미 소수가 아닌애들은 계산하지 않는다 
for(int j=2;j<=Math.sqrt(i);j++) {  //루트i 이기때문에 밑에 조건이 소수가 된다. 
if(i%j==0) { //소수가 아닌경우 
arr[i]=true;  //해당 수를 true로 변경 
int k = i/j;   //해당 수 부터 종료 숫자까지 해당수의 곱셈은 다 소수가 아니다 
for ( int l = 1; l <=k ; l++) {
arr[l*j]=true;
}
}


}
}
if(arr[i]==false) {
total+=i;
list.add(i);
}
}

if(list.size()==0) {
System.out.println(-1);
}else {
System.out.println(total);
System.out.println(list.get(0));
}

}

}