코딩테스트

[3주차] 코딩테스트 풀이 (2022.04.11~2022.04.15)

Jinyiji 2022. 4. 16. 13:23

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주 차 완료!!!