코딩테스트

[4주차] 코딩테스트 풀이 (2022.04.18~2022.04.22)

Jinyiji 2022. 4. 23. 02:16

JAVA로 코딩테스트 Level.1, Level.2 문제 풀기 4주 차


2022년 4월 18일 월요일 / 제일 작은 수 제거하기

 

문제 설명

 

  • 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

제한 조건

 

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

 

입출력 예

 

arr return
[4,3,2,1] [4,3,2]
[10] [-1]

 

문제 풀이 및 주석

 

package progarmmers;

public class 제일작은수제거하기 {

    public static void main(String[] args) {
        // 배열
        int[] answers = {3};    // 결과 : -1
//        int[] answers = {1,2,3,4,5};    // 결과 : 2, 3, 4, 5
//        int[] answers = {3, 2, 1, 4, 2};    // 결과 : 3, 2, 4, 2

        // 제일 작은 수 제거하기
        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[] arr) {
        int[] answer = {};

        // 배열이 한 개인 경우 -1 리턴
        if(arr.length == 1){
            answer = new int[] {-1};
            return answer;
        }

        // 최소값 제거한 배열 정의
        answer = new int[arr.length -1];
        
        // 최소값 계산
        int min = arr[0];
        for(int i = 0; i < arr.length; i++){
            if(min > arr[i]) min = arr[i];
        }

        // 최소값 제거한 배열 구하기
        int j = 0;
        for(int i = 0; i < arr.length; i++){
            if(min == arr[i]) continue;
            answer[j] = arr[i];
            j++;
        }

        return answer;
    }
}

if문을 사용하여 배열이 한 개일 경우에는 -1을 리턴해주었다. for문을 사용해 최솟값을 구하고 최솟값을 제거한 배열을 구해주었다. 


 

2022년 4월 19일 화요일 / 없는 숫자 더하기

 

문제 설명

 

  • 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항
 
  • 1 ≤ numbers의 길이 ≤ 9
    • 0 ≤ numbers의 모든 원소 ≤ 9
    • numbers의 모든 원소는 서로 다릅니다.

 

입출력 예

 

numbers result
[1,2,3,4,6,7,8,0] 14
[5,8,4,0,6,7,9] 6

입출력 예 설명

 

입출력 예 #1

  • 5, 9가 numbers에 없으므로, 5 + 9 = 14를 return 해야 합니다.

입출력 예 #2

  • 1, 2, 3이 numbers에 없으므로, 1 + 2 + 3 = 6을 return 해야 합니다.

 

문제 풀이 및 주석

 

package progarmmers;

public class 없는숫자더하기 {
    public int solution(int[] numbers) {
        // 1에서 9까지 더한 수 = 45
        int answer = 45;

        // 없는 수 더하기 = 45에서 있는 수를 계속 빼준다
        for(int num: numbers) answer -= num;
        
        return answer;
    }
}

1~9까지 숫자를 모두 더하면 45가 된다. 거기서 없는 숫자를 더하는 것이니 for문을 사용해 있는 숫자들을 빼주었다. 


 

2022년 4월 20일 수요일 / 약수의 개수와 덧셈

 

문제 설명

  • 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
  • 1 ≤ left  right ≤ 1,000

 

입출력 예
 
left right result
13 17 43
24 27 52

 


입출력 예 설명

 

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
약수 약수의 개수
13 1, 13 2
14 1, 2, 7, 14 4
15 1, 3, 5, 15 4
16 1, 2, 4, 8, 16 5
17 1, 17 2
  • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

 

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.

약수 약수의 개수
24 1, 2, 3, 4, 6, 8, 12, 24 8
25 1, 5, 25 3
26 1, 2, 13, 26 4
27 1, 3, 9, 27 4
  • 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

 

문제 풀이 및 주석

 

package progarmmers;

public class 약수의개수와덧셈 {

    public static void main(String[] args) {
        int left = 24;
        int right = 27;
        int result = solution(left, right);
        System.out.print("결과 : " + result);
    }

    public static int solution(int left, int right) {
        int answer = 0;

        // 제곱수인 경우만 약수의 개수가 홀수임
        for (int i=left; i<=right; i++) {
            int sqr = (int) Math.sqrt(i);
            if (sqr * sqr ==i)  // 제곱수이면
                answer -= i;    // 약수의 개수가 홀수인 경우는 뺀다
            else
                answer += i;    // 약수의 개수가 짝수인 경우는 더한다
        }
        return answer;
    }
}

어떤 수가 제곱수인 경우, 약수의 개수가 홀수이다. 이 점에 착안하여 풀었다.

 


 

2022년 4월 21일 목요일 / 서울에서 김서방 찾기

 

문제 설명

 

  • String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

 

제한 사항
 
  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

 

입출력 예

 

seoul return
["Jane", "Kim"] "김서방은 1에 있다"

 

문제 풀이 및 주석

 

package progarmmers;

public class 서울에서김서방찾기 {
    public static String solution(String[] seoul) {
        int answer = -1;  // 김서방 위치 초기화

        // 김서방 위치 찾기
        for (int i=0; i<seoul.length; i++) {
            if ("Kim".equals(seoul[i])) {
                answer = i;
                break;
            }
        }
        return "김서방은 " + answer + "에 있다";
    }

    public static void main(String[] args) {

        String[] seoul = {"Jane", "Kim"};

        // 김서방 위치
        String answer = solution(seoul);

        // 결과 출력
        System.out.print(answer);

    }
}

김서방은 ~에 있다 라는 문자열에 점 하나라도 생기면 틀리게 떠 프로그래머스가 가혹하다 싶었다. 

 


 

2022년 4월 22일 금요일 / 전화번호 목록

 

문제 설명

 

  • 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
    전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
  • 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

제한 사항
 
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

 

입출력 예제

 

phone_book return
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

입출력 예 설명

 

  • 입출력 예 #1
    앞에서 설명한 예와 같습니다.
  • 입출력 예 #2
    한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
  • 입출력 예 #3
    첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

 

문제 풀이 및 주석

 

package progarmmers;

import java.util.Arrays;

public class 전화번호목록 {
    public static boolean solution(String[] phone_book) {
        // 전화번호부 정렬
        Arrays.sort(phone_book);

        // 정렬된 전화번호부 확인
        for (int i=0; i<phone_book.length-1; i++) {
            // 다음 전화번호의 접두사이면 false
            if (phone_book[i+1].startsWith(phone_book[i])) return false;
        }
        return true;
    }

    public static void main(String[] args) {
//        String[] phone_book = {"119", "97674223", "1195524421"};
        String[] phone_book = {"97674223", "1195524421", "119"};
        System.out.println(solution(phone_book));
    }
}

첫 level.2 문제였다. 코드를 효율성 있게 짜는 것이 어려웠다.

 


 

JAVA로 코딩테스트 Level.1, Level.2 문제 풀기 4주 차 완료!!!