Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 카프카
- DB
- 데이터베이스
- 개인프로젝트
- emqx
- JWT
- visualvm
- AWS
- 스파르타코딩클럽
- 시큐리티
- 남궁성과 끝까지 간다
- 스웨거
- 쇼트유알엘
- WEB SOCKET
- Spring
- 스프링의 정석
- EC2
- JavaScript
- 생성자 주입
- 항해99
- Spring Security
- java
- MYSQL
- 웹개발
- 프로그래머스
- Kafka
- docker
- CentOS
- 패스트캠퍼스
- @jsonproperty
Archives
- Today
- Total
Nellie's Blog
[항해99 10기] 알고리즘 모의고사 - 3번. 소수의 개수와 덧셈 본문
728x90
3번. 소수의 개수와 덧셈 (상)
문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.
제한사항
- s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
- 문자열에는 소수가 한개 이상 섞여 있습니다.
- 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.
- 음수는 없습니다.
답안포맷
public class Main {
public String solution(String s) {
String answer = "";
return answer;
}
public static void main(String[] args) {
Main method = new Main();
String s = "97 75 88 99 95 92 73";
System.out.println(method.solution(s));
}
}
- 내 풀이
public class Main0 {
public static String solution(String s) {
String answer = "";
List<Integer> primes = new ArrayList<>(); //소수 - 최댓값 97
List<Integer> notPrimes = new ArrayList<>(); // 소수아님 -최솟값 75
List<Integer> temp = new ArrayList<>();
String[] str = s.split(" "); //문자열을 리스트로 (str -> temp)
for (String s1 : str) {
int i = Integer.parseInt(s1);
temp.add(i);
}
for (int i = 0; i < temp.size(); i++) { //temp리스트를 반복문으로 돌리기 97 75 88 99 95 92 73
for (int j = 2; j < temp.get(i); j++) {
if (temp.get(i) % j == 0) { //소수가 아닌경우 -- 75, 88, 99, 95, 92
notPrimes.add(i);
break;
}
}
// <- 여기에 어떻게 넣어야 하지???,,,,
}
Collections.sort(primes, Collections.reverseOrder()); //내림차순
Collections.sort(notPrimes); // 오름차순
int ans1 = primes.get(0);
int ans2 = notPrimes.get(0);
return ans2 + " " + ans1;
}
public static void main(String[] args) {
String s = "97 75 88 99 95 92 73";
System.out.println(solution(s));
}
}
다른 풀이 1
public class Main2 {
public static String solution(String s) {
String answer = "";
List<Integer> temp = new ArrayList<>();
ArrayList<Integer> primes = new ArrayList<>();
ArrayList<Integer> notPrimes = new ArrayList<>();
/******** String → Integer ********/
String[] str = s.split(" ");
for (String s1 : str) {
int i = Integer.parseInt(s1);
temp.add(i);
}
/**********************************/
// 소수 판별
for(int i : temp) { //temp리스트를 반복문으로 돌리기
if(isPrime(i)) {
primes.add(i);
} else {
notPrimes.add(i);
}
}
Collections.sort(primes, Collections.reverseOrder());
Collections.sort(notPrimes);
int ans1 = primes.get(0);
int ans2 = notPrimes.get(0);
return ans2 + " " + ans1;
}
public static 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 static void main(String[] args) {
String str = "97 75 88 99 95 92 73";
System.out.println(solution(str));
}
}
다른 풀이 2
package org.example;
public class Main1 {
public static String solution(String s){
String[] box = s.split(" "); // 문자열을 배열로 쪼개서 box배열에 넣기 97 75 88 99 95 92 73
long max = -1; // 소수 아닌 수의 최소값
long min = -1; // 소수의 최대값
for(String numStr : box){ //String타입배열 box의 요소를 하나씩 빼서 numStr에 넣기
boolean isPrimeNum = true; //boolean타입의 isPrimeNum변수를 설정하고 true로 초기화
long numV = Long.valueOf(numStr); //box에 있는 String배열을 Long타입인 numV로 전환!!
int i = 2;
//--------소수 판별 함수 (boolean값인 isPrimeNum 함수로 판별)-----------------------
while(i <= Math.sqrt(numV)){ //numV의 제곱근으로 나누어 소수인지 판별
if(numV % i == 0){ //제곱근을 '2~ 제곱근까지'로 나누었을 때 나누어 떨어지면 소수가 아니다.
isPrimeNum = false; // 소수가 아니니까 isPrimeNum 값을 false로 준다. (자동으로 나머지는 true가 됨)
break;
}
i++;
}
//-------- 소수아닌 수의 최소값(min) & 소수의 최대값(min) 바로 구하기--------------------
if(!isPrimeNum){ // 소수가 아니라면 min 값을 구해주기
if(min == -1 || numV < min){ // numV가 min보다 작으면, min값에 넣어주는 식으로 min구하기
min = numV;
}
}else{ // 소수가 맞다면 max 값을 구해주기
if(max == -1 || numV > max){
max = numV;
}
}
}
String answer = String.valueOf(min) + " " + String.valueOf(max);
return answer;
}
public static void main(String[] args) {
String s = "2 3 4 5";
System.out.println(solution(s));
System.out.println(Math.sqrt(6));
}
}
내가 다시 푼 풀이
package org.example;
import java.util.*;
public class Main0 {
public static String solution(String s) {
String answer = "";
List<Integer> primes = new ArrayList<>(); //소수 : 73, 97 - 최댓값 97
List<Integer> notPrimes = new ArrayList<>(); // 소수아님 : 75, 88, 99, 95, 92 - 최솟값 75
List<Integer> temp = new ArrayList<>();
String[] str = s.split(" "); //문자열을 리스트로 (str -> temp)
for (String s1 : str) {
int i = Integer.parseInt(s1);
temp.add(i);
}
for (int i = 0; i < temp.size(); i++) { //temp리스트를 반복문으로 돌리기 97 75 88 99 95 92 73
int cnt = 0;
for (int j = 2; j < temp.get(i); j++) {
if (temp.get(i) % j == 0) { //소수가 아닌경우 -- 75, 88, 99, 95, 92
cnt++;
}
}
if (cnt > 0) {
notPrimes.add(temp.get(i));
}else if(cnt == 0){
primes.add(temp.get(i));
}
}
Collections.sort(primes, Collections.reverseOrder()); //내림차순
Collections.sort(notPrimes); // 오름차순
int ans1 = primes.get(0);
int ans2 = notPrimes.get(0);
return ans2 + " " + ans1;
}
public static void main(String[] args) {
String s = "97 75 88 99 95 92 73";
System.out.println(solution(s));
}
}
이중 for문이 어려워서 그냥 cnt를 구해서 cnt가 0이면 소수라고 판단하는 로직을 짰다.....
'회고록 > 항해99' 카테고리의 다른 글
[항해99][과제] Spring 입문주차 - 스프링 부트로 로그인 기능이 없는 블로그 백엔드 서버 만들기 (0) | 2022.12.04 |
---|---|
[항해99] Spring 입문주차 1주차 정리 - JPA기초, 메모장 만들기 (0) | 2022.11.30 |
[항해99 10기] 알고리즘 모의고사 - 신대륙 발견 (0) | 2022.11.22 |
Git GUI 소스트리(SourceTree) 사용법 (0) | 2022.11.15 |
[flask] JWT를 사용한 회원가입/로그인 기능 구현하기 (0) | 2022.11.15 |