JAVA로 코딩테스트 Level.1 문제 풀기 3주 차
2022년 4월 11일 월요일 / 소수 만들기
- 주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다.
- 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
nums | result |
[1,2,3,4] | 1 |
[1,2,7,6,4] | 4 |
입출력 예 설명
- 입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.
- 입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.
문제 풀이 및 주석
class Solution {
int answer;
int arr[];
public int solution(int[] nums) {
answer = 0;
arr = new int[3];
dfs(nums, nums.length, 0, 0, 0); // 숫자 3개의 합이 짝수라면 return
return answer;
}
public void dfs(int[] nums, int len, int cnt, int sum,int start) {
if(cnt == 3) {
if(sum%2 == 0) return;
for(int i = 2; i * i <= sum; i++) { // i*i<sum 조건을 사용하여 소수 판별
if(sum % i == 0) return;
}
answer++;
return ;
}
for(int i = start; i < len; i++) {
arr[cnt] = nums[i];
dfs(nums, len, cnt+1, sum+nums[i], i+1);
}
}
}
dfs를 사용해 숫자 3개를 선택하였고 숫자 3개의 합이 짝수라면 다음 조합으로, 홀수라면 소수를 판별하게 됩니다. 소수 판별 조건으로 i*i <=sum를 사용하였고 if문과 for문을 사용하여 소수가 되는 경우의 개수를 구하였다. 구글링을 하였지만 역시 어려웠다.
2022년 4월 12일 화요일 / 자연수 뒤집어 배열로 만들기
- 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한 조건
- n은 10,000,000,000이하인 자연수입니다.
입출력 예
n | return |
12345 | [5,4,3,2,1] |
문제 풀이 및 주석
class Solution {
public int[] solution(long n) { // 10,000,000,000이하의 자연수라면 길수도 있기 때문에 long
char[] arr = new StringBuilder(Long.toString(n)).reverse().toString().toCharArray();
int[] answer = new int[arr.length];
for(int i = 0; i < answer.length; i++){
answer[i] = Character.getNumericValue(arr[i]);
// 숫자 형식의 유니코드 문자를 배정밀도 부동 소수점 숫자로 변환하는 메소드
} return answer;
}
}
숫자 형식의 유니코드 문자를 배정밀도 부동 소수점 숫자로 변환하는 getNumericValue메서드를 사용하였다.
2022년 4월 13일 / 하샤드 수
문제 설명
- 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한 조건
- x는 1 이상, 10000 이하인 정수입니다.
입출력 예
arr | return |
10 | true |
12 | true |
11 | false |
13 | false |
입출력 예 설명
- 입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다. - 입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다. - 입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다. - 입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.
문제 풀이 및 주석
class Solution {
public boolean solution(int x) {
String str = x + ""; // ""를 더해주어 String형으로 바꿨다.
int sum = 0;
for (int i = 0; i < str.length(); i++){
sum += str.charAt(i) - '0'; // int형으로 만들어주기위해 char형을 아스키코드가 아닌 '0'을 빼주었다.
}
return x % sum == 0;
}
}
포인트는 숫자의 길이를 알기 위해 ""를 더해주어 String형으로 바꾸었다.
char형 까지 키코드가 아닌 int형으로 만들어주기 위해 '0'을 빼주었다.
2022년 4월 14일 목요일 / 약수의 합
문제 설명
- 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제한 사항
- n은 0 이상 3000이하인 정수입니다.
입출력 예
n | return |
12 | 28 |
5 | 6 |
입출력 예 설명
- 입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다. - 입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
문제 풀이 및 주석
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0)
answer += i;
}
return answer;
}
}
n의 약수를 모두 더하여 리턴해야 하기 때문에 for문을 사용하여 약수의 합을 구해주었다.
2022년 4월 15일 금요일 / 모의고사
문제 설명
- 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5,...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5,...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5,...
- 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한 조건
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
입출력 예
answers | return |
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
입출력 예 설명
입출력 예 #1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
- 모든 사람이 2문제씩을 맞췄습니다.
문제 풀이 및 주석
package progarmmers;
import java.util.*;
class 모의고사 {
public static void main(String[] args) {
// 정답 배열
// int[] answers = {1,2,3,4,5}; // 결과 : 1
// int[] answers = {1, 3, 2, 4, 2}; // 결과 : 1, 2, 3
int[] answers = {4,5,3,2,1,2,4,1,3,4,4,1,5,5,2,3,1,2,4}; // 결과 : 3
// 최고 점수 수포자 배열 찾기
int[] answer = solution(answers);
// 최고 점수 수포자 출력
System.out.print("최고 점수 수포자 : ");
for (int i=0; i<answer.length; i++) {
if (i>0) System.out.print(", ");
System.out.print(answer[i]);
}
}
// 최고 점수 수포자 배열에 넣기
public static int[] solution(int[] answers) {
int[] person1 = {1, 2, 3, 4, 5};
int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] cnt = new int[3]; // 정답의 개수(사람별 배열)
for(int i=0; i<answers.length; i++){
if(answers[i] == person1[i%5]) cnt[0]++; // 수포자1 정답수(점수)
if(answers[i] == person2[i%8]) cnt[1]++; // 수포자2 정답수(점수)
if(answers[i] == person3[i%10]) cnt[2]++; // 수포자3 정답수(점수)
}
// 가장 높은 점수
int max = Math.max(cnt[0], Math.max(cnt[1], cnt[2]));
// 최고 점수인 사람(1~3)
List<Integer> list = new ArrayList<>();
// 가장 높은 점수를 받은 사람을 찾는 것
if(max == cnt[0])
list.add(1);
if(max == cnt[1])
list.add(2);
if(max == cnt[2])
list.add(3);
// 최고 점수인 사람(1~3) 배열
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
이번 문제는 직접 실행시키는 코드도 짜 보았다. 주석을 많이 달아서 이상의 설명은 줄이겠다...
JAVA로 코딩테스트 Level.1 문제 풀기 3주 차 완료!!!
'코딩테스트' 카테고리의 다른 글
[6주차] 코딩테스트 풀이 (2022.05.16~2022.05.20) (0) | 2022.05.21 |
---|---|
[5주차] 코딩테스트 풀이 (2022.05.09~2022.05.13) (0) | 2022.05.15 |
[4주차] 코딩테스트 풀이 (2022.04.18~2022.04.22) (3) | 2022.04.23 |
[2주차] 코딩테스트 풀이 (2022.04.04~2022.04.08) (7) | 2022.04.10 |
[1주차] 코딩테스트 풀이 (2022.03.28~2022.04.01) (1) | 2022.04.03 |