📑 문1) array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한 사항
입출력 예
arr | divisor | return |
---|---|---|
[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 함수를 완성해주세요.
제한 사항
signs[i]
가 참이면 absolutes[i]
의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.입출력 예
absolutes | signs | result |
---|---|---|
[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 | return |
---|---|
"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 함수를 완성해주세요.
제한사항
numbers
의 길이 ≤ 9numbers
의 모든 원소 ≤ 9numbers
의 모든 원소는 서로 다릅니다.입출력 예
numbers | result |
---|---|
[1,2,3,4,6,7,8,0] | 14 |
[5,8,4,0,6,7,9] | 6 |
입출력 예 설명
나의 풀이
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 | result |
---|---|
[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]
즉, 가장 작은 수를 제외한 나머지 수를 새로운 배열에 담는다는 의미이다.