티스토리 뷰

1️⃣ 나누어 떨어지는 숫자 배열

 

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

입출력 예

arr divisor answer
[5,9,7,10] 5 [5,10]
[2,36,1,3] 1 [1,2,3,36]
[3,2,6] 10 [-1]

 

 

💻 나의 풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        
        int count = 0;   // 갯수
        int idx = 0;     // answer의 인덱스
        
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] % divisor == 0) {
                count++;   // 갯수 증가
            }
        }
        
        if(count == 0) {
            int[] answer = {-1};
            return answer;    // 로컬 변수이기 때문에 여기서 리턴
        }
        
        int[] answer = new int[count];  // count 크기만큼 answer 배열 생성
        
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] % divisor == 0) {
                answer[idx] = arr[i];
                idx++;
            }
        }
        
        Arrays.sort(answer);
        
        return answer;
    }
}

 

먼저 arr 배열에서 divisor로 나누어 떨어지는 값이 존재하냐, 하나도 없냐 즉, 갯수를 판별해야 하기 때문에 count 변수를 생성해 0으로 초기화 시켜줍니다.

그리고 answer 배열의 인덱스를 나타내주는 변수 idx도 생성해줬습니다.

 

첫 번째 반복문에서는 arr배열을 순회하면서 각 요소가 divisor로 나누어 떨어지는지 확인한 후, 참인 경우 count 값을 증가시켜줍니다. 이렇게 함으로써 나중에 생성할 answer 배열의 크기를 결정합니다.

 

만약 나누어 떨어지는 수가 없다면 배열에 -1을 담아 반환해야 하므로 -1만을 포함한 배열을 생성하고 반환해줍니다. 여기서 주의할 점은 int[] answer = {-1}; 은 로컬 변수이므로 이후에 answer 배열에 대한 접근이 불가능합니다. 따라서 바로 반환해줍니다.

 

두 번째 반복문에서는 아까 만들어뒀던 count의 크기 만큼의 answer 배열을 생성해줍니다.

다시 arr 배열을 순회하면서 divisor로 나누어 떨어지는 수만을 answer 배열에 추가해주는데 idx++ 를 해주면서 0번째 인덱스부터 차곡차곡 담아줍니다.

 

반환하기 전에 Arrays.sort() 메소드를 사용해 오름차순으로 정렬하면 됩니다.

 

더 간단하게 푸는 방법이 없나 고민해봤는데 이게 최선이었습니다..! 😂

 

 

 

🔍 다른 사람의 풀이

class Solution {
    public boolean solution(int x) {
        int sum = 0;
        int n = x;
        
        while (n != 0) {
            sum += n % 10;   // 각 자릿수 구해서 sum 에 더하기
            n /= 10;   // 다음 자릿수로 넘어가기
        }
        
        return x % sum == 0? true : false;
    }
}

 

 


 

2️⃣ 없는 숫자 더하기

 

문제 설명

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

 

 

💻 나의 풀이

class Solution {
    public int solution(int[] numbers) {
        int sum = 45;    // 0~9까지 모두 더한 값
        for(int i : numbers) {
            sum -= i; 
        }
        return sum;
    }
}

 

아싸리 0부터 9까지 모두 더한 값에서 numbers에 있는 값들의 합을 빼주면 원하는 답이 나오겠다는 로직을 금방 생각해냈습니다.

그런데 numbers 원소들의 합 = 그냥 numbers의 인덱스로 생각해 sum -= i; 를 해주면 된다는 사실은 좀 늦게 알아챈 것 같네요.

아무튼 쉬운 문제였습니다!

 


 

3️⃣ 핸드폰 번호 가리기

 

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한사항

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

 

입출력 예

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

 

 

 

💻 나의 풀이

class Solution {
    public String solution(String phone_number) {
        char[] ch = phone_number.toCharArray();
        
        for(int i = 0; i < ch.length-4; i++) {
            ch[i] = '*';
        }       
        return String.valueOf(ch);
    }
}

 

먼저, 문자열을 문자 단위로 접근하기 위해  toCharArray() 메소드를 사용해 문자열 phone_number를 문자 배열 char[] 으로 변환해주었습니다.

문자 배열의 마지막 4자리 전까지의 모든 문자를 '*'로 바꿔줍니다.

그리고 마지막으로 수정된 문자 배열 ch을 String.valueOf() 메소드를 통해 다시 문자열로 변환하여 리턴해주면 됩니다.

 

사소하지만 주의할 점은

문자열을 표현할 때는 쌍따옴표" "를 사용하고, 단일 문자를 표현할 때는 작은따옴표' '를 사용하므로 조심해야 합니다!

 

 

 

🔍 다른 사람의 풀이

public class Solution {
    public String solution(String phone_number) {
        StringBuilder sb = new StringBuilder(phone_number); // 주어진 문자열로 StringBuilder 초기화

        // 문자열의 길이에서 마지막 4자리 전까지 '*'로 대체
        for (int i = 0; i < sb.length() - 4; i++) {
            sb.setCharAt(i, '*');
        }

        return sb.toString(); // StringBuilder를 다시 문자열로 변환하여 반환
    }
}

 

StringBuilder를 사용한 방법

 

class Solution {
  public String solution(String phone_number) {
    return phone_number.replaceAll(".(?=.{4})", "*");
  }
}

 

이건 정규식을 사용한 코드 입니다..😲

. 임의의 문자 한 개
 (?=.) 뒷쪽에 임의의 문자 한 개를 제외하고 선택
{숫자} 숫자 만큼의 자릿수
.(?=.{4}) 뒤쪽에서 임의의 문자 4개를 제외한 임의의 문자 한 개 선택

 


 

 

4️⃣ 제일 작은 수 제거하기

 

문제 설명

정수를 저장한 배열, 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]

 

 

💻 나의 풀이

import java.util.Arrays;

// 오름차순 정렬한 후 맨처음 인덱스 원소 삭제
class Solution {
    public int[] solution(int[] arr) {
        // 배열 길이가 1인 경우
        if (arr.length == 1) {
            int[] answer = {-1};
            return answer;
        }
        
        Arrays.sort(arr);   // arr을 오름차순 정렬
        
        int[] answer = new int[arr.length - 1];
        
        for(int i = 1; i < arr.length; i++) {
            answer[i - 1] += arr[i];
        }
        
        return answer;
    }
}

 

처음 생각했던 실패한 로직입니다.

오름차순 정렬을 한 후에 맨처음 인덱스의 원소를 삭제하면 가장 작은 수를 제거할 수 있겠다. 라는 생각이었는데...

이후 다시 원래대로 원소를 정렬해놓아야 하다보니 더욱 복잡해지는거 같아 다른 방법을 찾아보기로 했습니다. 

 

class Solution {
    public int[] solution(int[] arr) {
        // 배열 길이가 1인 경우 -1로 반환
        if (arr.length==1) {
            int[] answer = {-1};
            return answer;
        }

        // 가장 작은 수 하나 빼기 => 총 배열 길이에서 -1 한 길이가 됨
        int[] answer = new int[arr.length-1];
        
        int min = Integer.MAX_VALUE;
        for (int i=0; i<arr.length; i++){   // 배열에서 가장 작은 수 찾기
            min = Math.min(min, arr[i]);    // 현재 원소가 최솟값보다 작다면 min 갱신
        }
        
        int idx = 0;   // 가장 작은 수를 제외한 배열을 만들 인덱스 변수
        for (int j=0; j< arr.length; j++){   // 가장 작은 수 제외하고 담기
            if (arr[j]==min){    // 현재 원소가 가장 작은 수인 경우 무시하고 다음 원소로 이동
                continue;
            }
            else{   // 현재 원소가 가장 작은 수가 아닌 경우
                answer[idx++] = arr[j];   // answer에 저장하고 인덱스 증가
            }
        }
        return answer;
    }
}

 

성공한 두 번째 코드 입니다.

먼저 배열 길이가 1이라면 바로 -1을 담아 반환시킵니다.

이제 1이 아닌 경우의 로직을 짜줄건데, 가장 작은 수 1개를 제외한 나머지를 담을거니까 answer 배열의 길이는 전체 배열에서 -1 을 한 길이가 됩니다.

그 후, 배열에서 가장 작은 수를 찾기 위한 변수 'min'을 Integer의 최댓값으로 초기화합니다.

int min = Math.min(min, arr[i]) ;  :  배열을 순회하며 현재 원소가 현재까지 찾은 최솟값보다 작다면 min 값을 갱신합니다.

가장 작은 수를 찾았다면 이제 최종적인 배열을 만들어볼건데, 그 최종 배열을 만들 인덱스 변수인 idx를 초기화 시켜 줍니다.

배열을 순회하면서 현재 원소가 가장 작은 수 min인 경우 무시하고 다음 원소로 이동합니다.

현재 원소가 가장 작은 수가 아닌 경우 answer 배열에 저장하고 인덱스를 증가시킵니다.

이렇게 하면 최종적으로 가장 작은 수를 제외한 배열이 완성됩니다.

 

주의할 점

int min = Integer.MAX_VALUE;

Integer.MAX_VALUE는 Java에서 int 타입의 최댓값을 나타내는 상수입니다. int의 최댓값은 2^31 - 1입니다. 이는 32비트로 표현되는 정수 중에서 가장 큰 양의 정수값을 나타냅니다.

따라서 minInteger.MAX_VALUE로 초기화함으로써, 배열의 원소들과 비교하면서 현재까지 찾은 최솟값보다 작은 값을 만나면 해당 값을 min으로 갱신할 수 있습니다.

 

 


 

 

5️⃣ 내적

 

문제 설명

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

제한사항

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

 

입출력 예

a b result
[1,2,3,4] [-3,-1,0,2] 3
[-1,0,1] [1,0,-1] -2

 

 

💻 나의 풀이

class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 0;
        
        for(int i = 0; i < a.length; i++) {
            answer += a[i] * b[i];
        }
        return answer;
    }
}

 

어차피 a와 b의 길이는 같을거니까 둘 중 하나의 길이만큼 순회해주면서 바로 연산을 적용해주었습니다.

너무 간단해서 으잉..? 이게 맞아? 싶었는데 그냥 이게 맞네요!

 

 

 

🔍 다른 사람의 풀이

 

스트림을 이용해서 코드를 조금 짧게 줄인것 말고는 다른 사람들도 어떤 특별한 로직은 없었습니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함