세 개의 구분자
다음과 같은 문제 역시 어제 다뤘던 내용과 같이 split 에 관한 내용인데, 정규 표현식을 아직 배우지 않은 분들이라면, if 문으로 하나하나 필터링 해야하나 생각하실 수 있습니다.
하지만 자바에는 정규 표현식이라는 것이 존재합니다.
String[] result = myStr.split("[abc]"); //myStr = "baconlettucetomato";
[abc] 는 대괄호 안에 포함된 문자들 중 하나의 문자와 일치하는 경우를 의미합니다.
// result = ["", "onlettu", "etom", "to"]
우리가 이 정규 표현식을 몰라다면 너무 번거롭게 코드를 작성했을텐데, 알고 모르고의 차이가 큰 것 같습니다. 그래서 위의 문제는 아래와 같이 풀 수 있습니다.
import java.util.Arrays;
class Solution {
public String[] solution(String myStr) {
String[] result = Arrays.stream(myStr.split("[abc]"))
.filter(s -> !s.isEmpty())
.toArray(String[]::new);
return result.length == 0 ? new String[]{"EMPTY"} : result;
}
}
빈 배열에 추가, 삭제하기
이런 문제는 별다른 방법이 없습니다. 시간 복잡도가 O( i * j ) 가 나올 수 밖에 없는 문제입니다
List 를 하나 생성해서 true 면 그 안에서 for문으로 add를 수행하고, false면 remove로 제거하면 되는 간단한 문제 입니다
import java.util.ArrayList;
class Solution {
public int[] solution(int[] arr, boolean[] flag) {
ArrayList<Integer> list = new ArrayList<>();
for(int i=0; i<arr.length; i++){
if(flag[i] == true){
for(int j=0; j<arr[i]*2; j++){
list.add(arr[i]);
}
}else{
for (int j = 0; j < arr[i]; j++) {
list.remove(list.size() - 1);
}
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
배열 만들기 6
이런 지저분한 문제는 하나하나 풀어나가는 게 중요합니다.
문제에서 요구하는 것과 같이 stk라는 리스트를 만들어주고 i 도 0으로 초기화 해줍니다.
문제를 위에서 아래로 읽으면서 자연스럽게 코딩을 하면 됩니다.
이런 문제의 의도는 이 사람이 글로 작성되어 있는 내용을 코드로 구현할 수 있는 지를 본다고 생각합니다. 그럼 아래와 같은 코드가 작성됩니다
import java.util.ArrayList;
class Solution {
public int[] solution(int[] arr) {
ArrayList<Integer> stk = new ArrayList<>();
int i = 0;
while(i<arr.length){
if(stk.size() == 0){
stk.add(arr[i]);
i++;
}else if(stk.size() != 0 && stk.get(stk.size() - 1)==arr[i]){
stk.remove(stk.size()-1);
i++;
}else{
stk.add(arr[i]);
i++;
}
}
if(stk.size() == 0) stk.add(-1);
return stk.stream().mapToInt(Integer::intValue).toArray();
}
}
무작위로 K개의 수 뽑기
글을 위에서 아래로 읽는 것처럼 코드도 위에서 아래로 짜여지죠? 그냥 번역한다고 생각하시면 될 것 같아요. 그대로 번역해서 옆칸으로 옮기는 거죠. 이 문제도 특별한 부분은 없는 것 같네요. 아래처럼 작성하면 됩니다
import java.util.ArrayList;
class Solution {
public int[] solution(int[] arr, int k) {
ArrayList<Integer> result = new ArrayList<>();
for(int i : arr){
if(result.size() == k) break;
if(!result.contains(i)) result.add(i);
}
if(result.size() < k){
while(result.size() < k){
result.add(-1);
}
}
return result.stream().mapToInt(Integer::intValue).toArray();
}
}