본문 바로가기
알고리즘/Java 코딩 테스트 준비

[Java] 뒤집은 소수

by Dev dreamer 2023. 2. 3.

 

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 소수면 소수를 출력해라

 

자연수의 개수는 (1<=n<=100)이며 크기는 100000이하이다.

 

 

입력예제

 

9

32 55 62 20 250 370 200 30 100

 

출력예제

 

23 2 73 2 3

 

 

 

💡 1. 나의 생각 및 풀이(소요시간 2시간)


 

음.. 좀 많이 해멨다. 어려웠다.

 

생각해보면 문자를 뒤집고 그걸 소수를 구하면 된다

 

놀라운건 모두다 앞에 문제에서 한번씩 해봤다는건데 이걸 이렇게 해맸던게 많이 아쉽다.

 

특히 무지성 for문으로 싸는 습관때문에 전혀 필요 없는 for문을 넣어서 많이 해맸던듯 싶다.

 

일단 문자열로 받아주기 위해서 이번엔 split 을 썼다.

 

문자열을 넘겨주고 여기서 list와 answer 둘다 arrayList로 받았는데

list 는 굳이 arrayList로 안해도 됐을것 같다. num 이라는 숫자의 크기로 존재하니까

 

answer는 소수인 개수만 반환하니까 크기를 정하지를 못해서 무조건 써야 한다.

 

🔍 1. 받은 문자열을 먼저 뒤집어 준다.

while 문을 쓰고 lt 와 rt의 인덱스를 부여해서 lt가 rt보다 작을때 까지 계속 뒤집어 준다.

한번 뒤집을 때마다 한칸씩 이동하기 위해 lt는 1씩 더해주고 rt 는 1씩 빼준다.

 

🔍 2.  받은건 문자열이므로 숫자로 형변환 시켜준다.

 

🔍 3. 그 다음 소수를 찾아준다.

이번에도 이중포문을 사용했다. list에 담아준 숫자로 형변환 한 값들을 빼고

cnt 라는 int 변수를 0으로 초기값을 주고 for문을 하나 더 열어서

1부터 조회할 숫자보다 작은 수 까지 해당 숫자를 나눠서 나머지가 0인 경우 cnt 를 추가시켰다.

 

이때 1부터 조회하므로 무조건 cnt 는 1  이상일 것이고 소수라면 1이고 아니면 cnt가 1보다 클것이다.

 

이것을 이용해서 answer에 담아줬다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {

	public ArrayList<Integer> solution(String[] a, int num) {
		ArrayList<Integer> list = new ArrayList<>();
		ArrayList<Integer> answer = new ArrayList<>();
		char temp = 'a';

		for (int i = 0; i < num; i++) {
			char[] b = new char[a[i].length()];
			b = a[i].toCharArray();
			int lt = 0;
			int rt = b.length - 1;
			while (lt < rt) {
				temp = b[lt];
				b[lt] = b[rt];
				b[rt] = temp;
				System.out.println("lt" + lt);
				System.out.println("rt" + rt);
				lt++;
				rt--;
				System.out.println("lt" + lt);
				System.out.println("rt" + rt);
			}
			System.out.println(String.valueOf(b));
			list.add(Integer.parseInt(String.valueOf(b)));
		}
		for (int j = 0; j < list.size(); j++) {
			int cnt = 0;
			for (int k = 1; k < list.get(j); k++) {
				if (list.get(j) % k == 0) {
					cnt++;
				}
			}
			if (cnt == 1) {
				answer.add(list.get(j));
			}
		}

		return answer;
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		Main T = new Main();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int num = Integer.parseInt(br.readLine());
		String str = br.readLine();
		String[] a = str.split(" ");

		for (Integer x : T.solution(a, num)) {
			System.out.print(x + " ");
		}
	}

}

 

 

 

💡 2. 강사님 풀이.


강사님은 하나의 식을 사용하셨다.

 

res라는 int 변수를 선언하고 0을 초기값을 준다.

만약 처음 들어온 자연수 1230을 뒤집는다고 생각해보자.

 

res = res * 10 + t 라는 식을 사용할 것이다.

여기서 t는 들어온 자연수 tmp=1230을 10으로 나눈 나머지이다. (t%10)

 

1230을 10을 나눈 나머지는 0이다

 

이때 구한 t를 res가 0 인 시점에 넣어주면

 

0 = 0*10 +0 이 된다.

 

그 다음 로직으로는 tmp = tmp /10

 

들어온 자연수를 10으로 나눠 몫을 구해준다(나누면 int 니까 소수점 수는 사라진다.)

 

그럼 다시 위의 로직을 반복하는 것이다.

 

res=0

123 % 10 = 3

res = res * 10 + 3 =3

tmp=tmp(123)/10=12

 

res=3

12%10=2

res=res*10+2=32

tmp=tmp(12)/10=1

 

res=32

1%10=1

res=res*10+1=321

tmp=tmp(1)/10=0 

 

이때 tmp 가 0보다 클때까지만 작동하는 조건문을 걸어주면 된다.

 

강사님은 isPrime 이라는 메서드를 생성해서 따로 소수의 유무를 구분해서 answer에 추가해줬다.

 

 

 

 

코테 관련해서 많이 걱정됐었는데 강의를 통해 푸는 방법들을 배우니 이 시간이 즐겁습니다.

진짜 기능하나하나 다양한 방법으로 잘 가르쳐주십니다.

출처 : 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 대시보드 - 인프런 | 강의 (inflearn.com)

 

'알고리즘 > Java 코딩 테스트 준비' 카테고리의 다른 글

[Java] 등수 구하기  (0) 2023.02.04
[Java] 점수 계산  (0) 2023.02.03
[Java] 피보나치 수열  (0) 2023.02.02
[Java] 가위바위보 문제  (0) 2023.02.01
[Java] 보이는 학생(키 순서대로 세우기)  (0) 2023.01.31

댓글