입력된 배열 안의 정수 중 입력받은 다른 정수로 나누어 떨어지는 요소만 저장된 배열을 오름차순으로 출력하는 문제이다.
import java.util.*;
class Solution {
public int[] solution(int[] arr, int divisor) {
PriorityQueue<Integer> ans = new PriorityQueue<>();
for (int a: arr) {
if (a % divisor == 0)
ans.add(a);
}
if(ans.isEmpty())
ans.add(-1);
int[] answer = new int[ans.size()];
int i = 0;
while(!ans.isEmpty()){
answer[i] = ans.poll();
i++;
}
return answer;
}
}
오름차순으로 출력하는 조건도 있고, 출력할 배열의 크기는 계산이 끝나야 알 수 있기에 수를 정해진 우선 순위대로 정렬하는 우선순위 큐를 활용해 나누어 떨어지는 요소를 저장한 후, 큐와 동일한 크기의 배열을 선언, 큐의 요소를 하나씩 배열에 순차적으로 입력해 주었다.
정수 배열에는 정수의 절댓값이, boolean 배열에는 해당 정수의 부호가 +일 때 참, -일 때 거짓 형태로 저장되어 있다. 이처럼 저장되어 있는 정수를 모두 더하는 문제이다.
class Solution {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
for(int i = 0; i<signs.length;i++){
if (signs[i])
answer+=absolutes[i];
else
answer-=absolutes[i];
}
return answer;
}
}
절댓값과 부호가 동일하므로 부호가 참일 때 정수 배열의 동일 인덱스에서 값을 꺼내 더하고, 거짓일 때 빼는 형식으로 반복해 문제를 해결하였다. 다른 사람의 코드에서는 삼항연산자를 활용해서 구현한 코드들도 종종 보였다.
String 타입의 전화번호를 입력받아 이를 뒷 4자리를 제외하고 출력하는 문제이다.
class Solution {
public String solution(String phone_number) {
int n = phone_number.length();
String answer = "";
answer="*".repeat(n-4);
for (int i = n-4;i<n;i++)
answer +=phone_number.charAt(i);
return answer;
}
}
길이가 4 미만인 입력은 없다는 조건이 문제에 있어 입력받은 문자열의 길이에서 4를 뺀 후, 그 수만큼 * 문자열을 repeat 메소드로 반복해 입력하고, 번호 끝 4자리를 이후에 더해주었다.
0부터 9까지의 수 중 일부가 저장되어 있는 배열에서 없는 숫자를 골라 더한 수를 출력하는 문제이다.
import java.util.*;
class Solution {
public int solution(int[] numbers) {
String str = Arrays.toString(numbers);
int answer = 0;
for(int i=0;i<10;i++){
if (!str.contains(Integer.toString(i)))
answer+=i;
}
return answer;
}
}
배열을 String으로 변경한 후, 0부터 9의 숫자를 contains 메소드로 배열 안에 숫자가 있는지 여부를 확인하고 없다면 이를 더해주는 형태를 취했다. 다른 사람 풀이에는 중복되는 수가 없다는 사실을 이용해, 배열 안의 수를 stream과 sum을 활용해 모두 더한 후, 45에서 빼는 풀이를 보였었다. 조건을 역으로 이용해 계산한 것이 새로웠다.
배열 중 가장 작은 수를 제거하고 남은 배열을 출력하는 문제이다.
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
int min = Arrays.stream(arr).boxed().min(Integer::compare).get();
int[] answer = Arrays.stream(arr).filter((x)-> x!=min).toArray();
if(answer.length==0){
int[] newans = {-1};
return newans;
}
return answer;
}
}
이전 문제에서 다른 사람들이 stream()을 많이 사용하여 한번 활용해 보고자 하는 생각이 들어 사용해 보았다.
arr을 우선 stream 타입으로 변경 후, 요소를 Integer 타입 기준으로 비교한 후, 이를 변수에 저장하였다. 그 후 steam 타입으로 변경한 후, filter 메소드를 활용해 배열 중 이전에 저장했던 최솟값을 제외한 요소만 골라 저장한 후, 다시 배열로 되돌려 저장하였다. 그렇게 만들어진 배열의 길이가 0일 경우에는 -1을 요소로 하는 배열을 출력해야 하는데, 이 때 직전 과정에서 저장하게 되는 배열의 크기는 0이기 때문에 -1을 담을 수 없기에 새로운 배열을 선언해 -1을 담은 후 이를 출력하였다.
입력받은 문자열의 길이가 홀수라면 가장 가운데 1글자를, 짝수일 경우 2글자를 출력하는 문제이다.
class Solution {
public String solution(String s) {
int odd = s.length()%2;
int len = s.length()/2;
return odd==1?Character.toString(s.charAt(len))
:Character.toString(s.charAt(len-1))+Character.toString(s.charAt(len));
}
}
문자열의 길이가 홀수라면 문자열의 절반에 해당하는 인덱스의 문자를, 짝수라면 절반과 그보다 1 작은 위치의 문자를 합쳐 출력하였다.
수박을 반복한 문자열을 정해진 정수만큼 자른 문자열을 출력하는 문제이다.
class Solution {
public String solution(int n) {
return ("수박".repeat(n/2))+("수".repeat(n%2));
}
}
짝수일 경우 수박으로, 홀수일 경우 수로 끝나기 때문에 몫만큼 수박을, 나머지만큼 수를 반복해서 간단히 문제를 풀어보았다. 다른 사람의 정답에서 입력 조건인 1만번을 이용해 수박을 엄청 반복한 문자열(repeat을 활용한 것도 아니고 직접 입력하였다!)을 만들고, 이를 잘라내는 형태로 문제를 푼 코드를 발견했는데, 고등학교 수학 문제 중 n번째를 찾는 문제를 손으로 모두 써서 푸는 방식이 생각나는 코드였다.