Programmers #22

이강용·2023년 6월 22일
0

Programmers

목록 보기
21/58

나누어 떨어지는 숫자 배열

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


제한 사항

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

입출력 예

arrdivisorreturn
[5, 9, 7, 10]5[5,10]
[2, 36, 1, 3]1[1,2,3,36]
[3,2,6]10[-1]

입출력 예 설명

  • arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

  • arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

  • 3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.


나의 풀이

package programmers;

import java.util.ArrayList;
import java.util.Collections;

public class DivisibleArrayOfNumbers {
	
	public static int[] solution(int[] arr, int divisor) {
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int number : arr) {
        	if(number % divisor == 0) {
        		list.add(number);
        	}
        }
        if(list.isEmpty()) {
        	 return new int[] {-1};
        }
       
        Collections.sort(list);
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
        	answer[i] = list.get(i);
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		int[] arr = new int[] {3,2,6};
		solution(arr , 10);
	}

}


나의 생각

이번 문제의 핵심은 list를 어떻게 오름차순으로 정렬시킬것인가? 를 중점적으로 생각하여 문제해결에 노력하였다. Collections.sort 메서드는 리스트를 정렬시킬수 있기때문에 이를 활용하면 되겠다는 생각을 하였다.


음양 더하기

📑 문2) 어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.


제한 사항

  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

입출력 예

absolutessignsresult
[4,7,12][true,false,true]9
[1,2,3][false,false,true] 0

입출력 예 설명

  • signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
    따라서 세 수의 합인 9를 return 해야 합니다.

  • signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
    따라서 세 수의 합인 0을 return 해야 합니다.


나의 풀이

#1

package programmers;

public class NegativePlusPositive {
	
	public static int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for(int i = 0; i < absolutes.length; i++) {
        	boolean isFlag = (signs[i] == false) ? true : false;
        	
        	if(isFlag) {
        		answer -= absolutes[i];
        	}else {
        		answer += absolutes[i];
        	}
        }
     
        return answer;
    }
	
	public static void main(String[] args) {
		solution(new int[] {4,7,12}, new boolean[] {true,false,true});
	}

}

#2

package programmers;

public class NegativePlusPositive {
	
	public static int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for (int i = 0; i < absolutes.length; i++) {
            answer += signs[i] ? absolutes[i] : -absolutes[i];
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		solution(new int[] {4,7,12}, new boolean[] {true,false,true});
	}

}

핸드폰 번호 가리기

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


제한 조건

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

입출력 예

phone_numberreturn
"01033334444""*******4444"
"027778888""*****8888"

나의 풀이

package programmers;

public class HidePhoneNumber {
	
	public static String solution(String phone_number) {
        
        
        String[] number = phone_number.split("");
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < phone_number.length(); i++) {
        	if(i < number.length - 4) {
        		sb.append(number[i].replaceAll(number[i], "*")) ;
        	}else {
        		sb.append(number[i]);
        	}
        }
        
        return sb.toString();
        
    }
	
	public static void main(String[] args) {
		solution("027778888");
	}

}

나의 생각

매개변수로 주어진 phone_number를 문자열에 한 글자씩 짤라 넣는다. StringBuilder 클래스는 문자열을 쉽게 다룰수 있기 때문에 이를 활용하였다.

if(i < number.length - 4) 인 즉, number.length - 4 은 끝자리 index 4개 까지 i를 증가 시켜, 모든 문자를 "*"로 변환시킨다는 의미이다. 그리고, 끝 4자리는 문자 그대로 출력하여 최종적으로는 *****8888 이라는 문자가 마스킹되어 출력된다.


없는 숫자 더하기

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


제한사항

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

입출력 예

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

입출력 예 설명

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

나의 풀이

package programmers;

import java.util.HashSet;
import java.util.Set;

public class AddMissingNumber {
	
	
	public static int solution(int[] numbers) {
        int answer = 0;
        Set<Integer>numSet = new HashSet<>();
        for(int i = 0; i < 10; i++) {
        	numSet.add(i);
        }
        
        
        for(int i = 0; i < numbers.length; i++) {
        	numSet.remove(numbers[i]);        	
        }
        
        for(Integer num : numSet) {
        	answer +=num;
        }
        
        System.out.println(answer);
        return answer;
    }
	
	public static void main(String[] args) {
		int[] numbers = new int[]{1,2,3,4,6,7,8,0};
		solution(numbers);
	}

}

나의 풀이

먼저, 비교할 대상이 0~9 까지의 숫자가 제한되어 있기때문에, 이를 Set 인터페이스에 먼저 담았다. 그리고, set 인터페이스에 매개변수로 주어진 numbers값이 들어 있으면 제거 하는 방법으로 없는 숫자를 선별하였다. 그리고 없는 숫자를 더하기 위해 for문을 한번 더 돌려 int형 answer에 담아 리턴하였다.


뒤통수를 얻어 맞은것 같은 풀이

class Solution {
    public int solution(int[] numbers) {
        int sum = 45;
        for (int i : numbers) {
            sum -= i;
        }
        return sum;
    }
}

뒤통수 맞은 풀이

0~9 까지의 합을 초기값으로 설정하여, sum에서 numbers에 있는 숫자들을 하나씩 빼는 방법을 사용하여 numbers에 없는 숫자들만이 sum에 남게 된다. 이 방법은 모든 숫자를 한 번씩만 확인하면 되므로 시간 복잡도가 O(n)라는 점이다.


제일 작은 수 제거하기

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


제한 사항

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

입출력 예

arrresult
[4,3,2,1][4,3,2]
[10][-1]

나의 풀이

package programmers;

public class RemoveTheSmallestNumber {
	
	 public static int[] solution(int[] arr) {
	        
		 
		 	if(arr.length <= 1) {
		 		return new int[] {-1};
		 	}
		 
		 
	        int smalltestNumber = arr[0];
	        
	        for(int i = 1; i < arr.length; i++) {
	        	smalltestNumber = Math.min(smalltestNumber, arr[i]);
	        }
	        
	        int[] newArr = new int[arr.length-1];
	        int index = 0; 
	        for(int i = 0; i < arr.length ; i++) {
	        	if(arr[i] != smalltestNumber) {
	        		newArr[index++] = arr[i];
	        	}
	        }
	        
	        return newArr;
	    }
	 
	 public static void main(String[] args) {
		int[] arr = {10};
		 solution(arr);
	}

}

나의 풀이

먼저, arr의 길이가 1이라는 것은 int[] 안에 하나의 원소만 존재한다는 것으로, 해당 배열에 존재하는 값을 빼면 빈 배열만 남게 되기때문에, 바로 return new int[] {-1}을 해도 무방하다. 그리고 최소값을 smallestNumber 이라고 선언함과 동시에, 초기값으로 arr[0] 값을 주어, arr[] 안에 있는 모든 수를 비교하여 최소값을 찾는다. 한번 선언한 배열의 크기는 변경이 안되기 때문에, 새로운 배열 newArr를 선언 및 배열의 크기를 할당하는데, 기존의 배열 arr에서 -1 한것이 크기가 된다.

int[] newArr = new int[arr.length-1];
int index = 0; 
for(int i = 0; i < arr.length ; i++) {
	if(arr[i] != smalltestNumber) {
    	newArr[index++] = arr[i];
    }
}

해당 로직에서, arr[i] != smallestNumber은 arr배열에 든 원소가 smallestNumber와 같지않으면, newArr[index++] = arr[i] 즉, 가장 작은 수를 제외한 나머지 수를 새로운 배열에 담는다는 의미이다.


profile
HW + SW = 1

0개의 댓글