Post

프로그래머스 기초 예제

프로그래머스에 기초를 다지면서 풀 수 있는 시리즈가 생겨 조금씩 풀어봐야겠다.

문자열 잘라서 정렬하기

  • ‘x’ 기준으로 문자열을 자른다.
    • 1트) StringTokenizer 사용
    • 2트) .split() 메서드 결과가 배열이라는 걸 기억해냄
  • 사전순으로 정렬
    • 오름차순으로 정렬하라는 뜻
    • 문제에서 ‘x’ 기준으로 나눴을 때, 알파벳이 섞여 있는 경우가 있다고 명시되어 있지 않음
      • 근데 생각해보니 문자열이 섞여 있으면 사전 순 정렬의 의미가 어색해짐
      • Comparator 로 한 단어 씩 비교하는 사전식 정렬을 원하는 거였으면 난이도가 올라가서 뺏나? 싶음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;

class Solution {
    
    public String[] solution(String myString) {
        String[] letters = myString.split("x");
        ArrayList<String> arr = new ArrayList<>();
        
        for (String letter : letters) {
            if (!letter.isEmpty()) {
                arr.add(letter);    
            }
        }
        
        String[] answer = arr.toArray(new String[arr.size()]);
        Arrays.sort(answer);
        
        
        
        return answer;
    }
}

프로그래머스는 홈페이지 자체에서 바로바로 디버깅 할 수 있는게 너무 편하다. 백준은 그런거 허용안하는 대신에 좀 더 생각하게 만드는 분위기가 있다.

부분 문자열

문제는 여기

.contains 메서드가 있어서 고민할 것도 없지만 만일 직접 구현해야 했다면 어떻게 하면 좋을까? 고민하게 되는 문제이다.

1
2
3
4
5
6
7
8
class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        // str1 이 str2 에 속하는가?
        
        return (str2.contains(str1)) ? 1 : 0;
    }
}

꼬리 문자열

문제는 여기

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;

class Solution {
    public String solution(String[] str_list, String ex) {
        String answer = "";
        StringBuilder sb = new StringBuilder();
        for (String str : str_list){
            if(!str.contains(ex)) sb.append(str);
        }
        answer = sb.toString();
        return answer;
    }
}

반성

  • 문제를 똑바로 읽자
    • 특정 문자열을 제거하고, 남은 문자열 또한 더하는 문제인 줄 알았다.

뒤에서 5등 위로

문제는 여기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;

class Solution {
    public int[] solution(int[] num_list) {
        List<Integer> list = new ArrayList<>();
        Arrays.sort(num_list);
        
        for(int i = 5; i < num_list.length; i++) {
            list.add(num_list[i]);
        }
        
        int[] answer = new int[list.size()];
        
        for (int j = 0; j < list.size(); j++) {
            answer[j] = list.get(j);
        }
        
        return answer;
    }
}

배열의 원소 삭제하기

문제는 여기

stream API

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
import java.util.*;
import java.util.stream.*;


class Solution {
    public int[] solution(int[] arr, int[] delete_list) {
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<arr.length; i++) {
            for (int j=0; j<delete_list.length; j++) {
                if (arr[i] == delete_list[j]) {
                    arr[i] = -1;
                }
            }
            list.add(arr[i]);
        }
        list = list.stream().filter(i -> i != -1).collect(Collectors.toList());
        
        int[] answer = new int[list.size()];
        
        int idx = 0;
        for(Integer i : list) {
            System.out.println(i);
            answer[idx] = i;
            idx++;
        }
        return answer;
    }
}
This post is licensed under CC BY 4.0 by the author.