4주차 문제풀이

주완·2022년 4월 24일
0

CodingTest

목록 보기
4/4
2022.04.18

1. 제일 작은 수 제거하기

문제

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

🔎 기본제공
class Solution {
    public int[] solution(int[] arr) {
        int[] answer = {};
        return answer;
    }
}

풀이

📃 제출코드

class Solution {
    public int[] solution(int[] arr) {
        if(arr.length==1){
            int[] answer = {-1};
            return answer;
        }

        int[] answer = new int[arr.length-1];
        int min = arr[0];
        for(int i=1; i<arr.length; i++)
            if(min>arr[i]) min = arr[i];
        int j=0;
        for(int i=0; i< arr.length; i++){
            if(arr[i]==min) continue;
            answer[j] = arr[i];
            j++;
        }

        return answer;
    }
}

💡 전체코드

package programmers;

import java.util.Arrays;
import java.util.Scanner;

public class Solution {
    public static int[] solution(int[] arr) {
        if(arr.length==1){
            int[] answer = {-1};
            return answer;
        }

        int[] answer = new int[arr.length-1];
        int min = arr[0];
        for(int i=1; i<arr.length; i++)
            if(min>arr[i]) min = arr[i];
        int j=0;
        for(int i=0; i< arr.length; i++){
            if(arr[i]==min) continue;
            answer[j] = arr[i];
            j++;
        }

        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] arr = new int[num];
        for(int i=0; i< arr.length; i++)
            arr[i] = sc.nextInt();
        System.out.println(Arrays.toString(solution(arr)));
    }
}

📌 풀이설명

배열의 길이가 한개, 즉, return 배열값이 없으면 -1을 return하기 위해서 if문을 사용하였다. 배열값이 있을 때는 최소값을 제외하고 return해야 하므로 for문을 통해 최소값을 찾았다. 그 후 배열에 넣는 for문을 돌리고, 최소값일 때 continue 시켰다.
출력할 때는 Array.toString을 사용해 int배열을 [1, 2, 3] 이러한 형식으로 출력되게 하였다.

2022.04.19

2. 없는 숫자 더하기

문제

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

🔎 기본제공
class Solution {
    public int solution(int[] numbers) {
        int answer = -1;
        return answer;
    }
}

풀이

📃 제출코드

class Solution {
    public int solution(int[] numbers) {
        int answer = 0;
        boolean[] cnt = new boolean[10];
        for(int a:numbers)
            cnt[a] = true;
        for(int i=0; i<cnt.length; i++) {
            if(cnt[i]==false) answer += i;
        }
        return answer;
    }
}

💡 전체코드

package programmers;

import java.util.Scanner;

public class Solution {
    public static int solution(int[] numbers) {
        int answer = 0;
        boolean[] cnt = new boolean[10];
        for(int a:numbers)
            cnt[a] = true;
        for(int i=0; i<cnt.length; i++) {
            if(cnt[i]==false) answer += i;
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] numbers = new int[num];
        for(int i=0; i<numbers.length; i++)
            numbers[i] = sc.nextInt();
        System.out.println(solution(numbers));
    }
}

📌 풀이설명

for(:)을 사용해 a에 numbers 값을 대입해 사용하고, 입력된 숫자일 경우 true를 넣어주었다. 그 후 입력되지 않은 즉,false일 경우에만 return값에 더하였다.

2022.04.20

3. 약수의 개수와 덧셈

문제

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

🔎 기본제공
class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        return answer;
    }
}

풀이

📃 제출코드

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        int cnt;
        for(int i=left; i<=right; i++){
            cnt=0;
            for(int j=1; j<=i; j++){
                if(i%j==0) cnt++;
            }
            if(cnt%2==0) answer+=i;
            else answer-=i;
        }
        return answer;
    }
}

💡 전체코드

package programmers;

import java.util.Scanner;

public class Solution {
    public static int solution(int left, int right) {
        int answer = 0;
        int cnt;
        for(int i=left; i<=right; i++){
            cnt=0;
            for(int j=1; j<=i; j++){
                if(i%j==0) cnt++;
            }
            if(cnt%2==0) answer+=i;
            else answer-=i;
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int left = sc.nextInt();
        int right = sc.nextInt();
        System.out.println(solution(left,right));
    }
}

📌 풀이설명

left부터 right사이의 수에서 약수를 구하기 위해 이중for문을 사용해 그 수 범위 약수를 찾고, 개수를 더해주었다. 약수의 개수를 구한 뒤 if문을 활용해 짝수인지 홀수인지 구하고 그에 따라 더하거나 빼주었다.

2022.04.21

4. 서울에서 김서방 찾기

문제

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

🔎 기본제공
class Solution {
    public String solution(String[] seoul) {
        String answer = "";
        return answer;
    }
}

풀이

📃 제출코드

class Solution {
    public String solution(String[] seoul) {
         String answer = "";
        for(int i=0; i<seoul.length; i++){
            if(seoul[i].equals("Kim")) answer = "김서방은 "+i+"에 있다";
        }
        return answer;
    }
}

💡 전체코드

package programmers;

import java.util.Scanner;

public class Solution {
    public static String solution(String[] seoul) {
        String answer = "";
        for(int i=0; i<seoul.length; i++){
            if(seoul[i].equals("Kim")) answer = "김서방은 "+i+"에 있다";
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String[] seoul = new String[num];
        for(int i=0; i<seoul.length; i++)
            seoul[i] = sc.next();
        System.out.println(solution(seoul));
    }
}

📌 풀이설명

문자열을 입력 받은 후 Kim의 위치를 알아야 하기때문에 Kim과 각 문자열을 비교해주었다. 문자열을 비교할 때는 equals 메소드를 활용해주었다. 그 후 Kime의 위치를 찾으면 출력문과 함께 i의 값을 return 시켰다.

2022.04.22

5. 전화번호 목록

문제

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

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

🔎 기본제공
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        return answer;
    }
}

풀이

📃 제출코드

import java.util.Arrays;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);
        for (int i = 0; i < phone_book.length - 1; i++){        
            if (phone_book[i + 1].startsWith(phone_book[i])){
                return false;
            }
        }
        return answer;
    }
}

💡 전체코드

package programmers;

import java.util.Arrays;
import java.util.Scanner;

public class Solution {
    public static boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);
        for (int i = 0; i < phone_book.length - 1; i++){
            if (phone_book[i + 1].startsWith(phone_book[i])){
                return false;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String[] phone = new String[num];
        for(int i=0; i<phone.length; i++)
            phone[i] = sc.next();
        System.out.println(solution(phone));
    }
}

📌 풀이설명

효율성을 통과하지 못해서 구글링의 도움을 받음

효율성이 없었더라면 contains, matches, indexOf 등을 활용해야 할 수 있지만, 효율성을 고려해야하기 때문에 사용하기 어려웠다. 그래서 Arrays.sort()를 활용해 먼저 오름차순 정렬을 시켜주어야 한다. 그 후 starsWith()를 활용해 대상 문자열이 특정 문자 또는 문자열로 시작하는지 for문 한개를 활용해 다음방과 비교하였다. 이를 통해 효율성 높고 정확한 코드를 짤 수 있다.

profile
배움을 기록하자

3개의 댓글

comment-user-thumbnail
2022년 4월 24일

시험기간 전인데도 이렇게 꼼꼼히 문제를 푼 모습이 very good합니다
벌써부터 효율성을 생각하는 모습이 very smart하네요

답글 달기
comment-user-thumbnail
2022년 4월 24일

boolean도 배열이 있는지 처음 알았네요!👍

답글 달기
comment-user-thumbnail
2022년 4월 25일

매번 느끼는 거지만 문제를 깔끔하게 잘 푸는 것 같네요! 효율성이 없는 문제여도 최대한 효율성을 챙기면서 푸는 습관을 들이면 좋습니다!

답글 달기