Algorithm/inflearn
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 2. Array(2)
_dear
2024. 2. 19. 16:46
4. 피보나치 수열
<나의 풀이>
- fibo 배열에 피보나치수열 값을 저장
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[] fibo;
static int fibonacci(int num) {
if(num==0||num==1)
fibo[num]=1;
else
fibo[num]=fibo[num-2]+fibo[num-1];
return fibo[num];
}
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
fibo = new int[n];
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(fibonacci(i)+" ");
}
System.out.println(sb.toString().trim());
}
}
<해설>
- 배열을 반환해서 출력
import java.util.*;
public class Main {
public int[] solution(int n){
int[] answer=new int[n];
answer[0]=1;
answer[1]=1;
for(int i=2; i<n; i++){
answer[i]=answer[i-2]+answer[i-1];
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
for(int x :T.solution(n)) System.out.print(x+" ");
}
}
5. 소수(에라토스테네스 체)
<나의 풀이>
- isSoSu(num): num이 소수인지 확인 후, 소수이면 true, 아니면 false 반환
간단히 2부터 num까지 돌면서 하나라도 나눠지는지 확인
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static boolean isSosu(int num) {
boolean answer=true;
if(num==1) return false;
else if(num==2) return true;
for(int i=2;i<=Math.sqrt(num);i++) {
if(num%i==0) {
answer=false;
break;
}
}
return answer;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int cnt=0;
for(int i=1;i<n+1;i++) {
if(isSosu(i)) cnt++;
}
System.out.println(cnt);
}
}
<해설>
- ch[i] 배열: i가 소수이면 1, 아니면 0으로 표시
- 2부터 i 를 소수인지 체크 한 후, i가 소수이면 i의 배수들도 모두 소수로 표시
import java.util.*;
public class Main {
public int solution(int n){
int cnt=0;
int[] ch = new int[n+1];
for(int i=2; i<=n; i++){
if(ch[i]==0){
cnt++;
for(int j=i; j<=n; j=j+i) ch[j]=1;
}
}
return cnt;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
System.out.println(T.solution(n));
}
}
6. 뒤집은 소수
<나의 풀이>
- StringBuilder 활용하여 간단히 문자열 reverse
- Integer.parseInt(문자열) 로 간단히 문자열을 숫자(정수)로 변환
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static boolean isSosu(int num) {
boolean answer=true;
if(num==1) return false;
else if(num==2) return true;
for(int i=2;i<=Math.sqrt(num);i++) {
if(num%i==0) {
answer=false;
break;
}
}
return answer;
}
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String s = br.readLine();
StringTokenizer st = new StringTokenizer(s);
StringBuilder sb= new StringBuilder();
StringBuilder answer= new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(st.nextToken()).reverse();
int num=Integer.parseInt(sb.toString());
answer.append(isSosu(num)?num+" ":"");
sb= new StringBuilder();
}
System.out.println(answer.toString().trim());
}
}
<해설>
- isPrime(num): num이 소수인지 확인 후, 소수이면 true 아니면 false 반환
- solution(int n, int[] arr): arr배열에 있는 수들을 하나씩 reverse한 후 int배열로 반환
ex) int tmp=3210
res=0
while(tmp가 0보다 클 동안){
int t= tmp%10 //t=0 -> t=1 -> t=2 -> t=3
res=res*10+t //res=0 -> res=1 -> res=12 -> res=123
tmp=tmp/10 //tmp=321 -> tmp=32 -> tmp=3 -> tmp=0
}
if(isFrime(123)) //123이 소수이면
answer에 123추가
import java.util.*;
public class Main {
public boolean isPrime(int num){
if(num==1) return false;
for(int i=2; i<num; i++){
if(num%i==0) return false;
}
return true;
}
public ArrayList<Integer> solution(int n, int[] arr){
ArrayList<Integer> answer = new ArrayList<>();
for(int i=0; i<n; i++){
int tmp=arr[i];
int res=0;
while(tmp>0){
int t=tmp%10;
res=res*10+t;
tmp=tmp/10;
}
if(isPrime(res)) answer.add(res);
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
int[] arr=new int[n];
for(int i=0; i<n; i++){
arr[i]=kb.nextInt();
}
for(int x : T.solution(n, arr)){
System.out.print(x+" ");
}
}
}