안녕하세요.
오늘은 프로그래머스의 코딩테스트 lv.0 단계 중에 문자열 정렬하기(1)를 공부해보겠습니다.
언어는 Java로 구현하였습니다.
문제 설명
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.
제한 사항
입출력 예
my_string | result |
"hi12392" | [1, 2, 2, 3, 9] |
"p2o4i8gj2" | [2, 2, 4, 8] |
"abcde0" | [0] |
문제 풀이
매개변수 my_string의 숫자만 가져오기 위해 반복문을 통해 문자열의 글자를 하나씩 가지고 옵니다.
해당 글자가 숫자인지 문자인지 판별하여 숫자만 리스트에 추가하여 숫자만 있는 리스트를 만든 후에
오름차순으로 정렬하도록 구현하였습니다.
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
|
import java.util.*;
class Solution {
public int[] solution(String my_string) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < my_string.length(); i++)
{
if(0 <= (int)(my_string.charAt(i) - '0') && (int)(my_string.charAt(i) - '0') <= 9)
{
list.add((int)(my_string.charAt(i) - '0'));
}
}
Collections.sort(list);
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++)
{
answer[i] = list.get(i);
}
return answer;
}
}
|
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
|
import java.util.*;
class Solution {
public int[] solution(String my_string) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < my_string.length(); i++)
{
if(0 <= Character.getNumericValue(my_string.charAt(i)) && Character.getNumericValue(my_string.charAt(i)) <= 9)
{
list.add(Character.getNumericValue(my_string.charAt(i)));
}
}
Collections.sort(list);
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++)
{
answer[i] = list.get(i);
}
return answer;
}
}
|
위의 두 가지 코드는 동일한 로직인데 my_string의 글자를 가지고 오는 방법을 다르게 했습니다.
1번은 my_string의 글자를 단순히 int 변환하게 되면 아스키코드로 변환되고 0~9의 아스키코드 값은 48~57이기 때문에 담고자 하는 값과 차이가 있어서 변환값을 0(ASC 48)으로 빼서 원하는 값을 얻었습니다.
2번은 Character의 내장 함수 중에 int로 변환할 수 있는 함수인 getNumericValue()을 이용하여 원하는 값을 얻었습니다.
추가 풀이
위의 방식들은 정답이지만 return 타입이 List가 아닌 Array이고 Array는 선언 시에 크기 할당이 필요하고 my_string의 길이가 아닌 my_string에 있는 숫자 개수만큼의 크기 할당이 필요합니다.
그래서 my_string의 숫자만 List에 담아서 sort 한 뒤에 List를 다시 Array에 담기 위해 반복문을 두 번 실행해야 한다는 점이 마음에 들지 않았습니다.
my_string의 숫자만 남기는 방식을 고민하다가 String의 내장함수 중에 replaceAll()에 정규표현식을 사용하여 숫자를 제외한 글자들을 빈값으로 교체하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.util.*;
class Solution {
public int[] solution(String my_string) {
my_string = my_string.replaceAll("[a-z]", "");
int[] answer = new int[my_string.length()];
for(int i = 0; i < my_string.length(); i++)
{
answer[i] = Character.getNumericValue(my_string.charAt(i));
}
Arrays.sort(answer);
return answer;
}
}
|
my_string에는 소문자와 숫자로만 이루어져 있다는 제한 사항을 조건으로 정규표현식을 사용하여 코드를 정리할 수 있었습니다.
사용 함수
마무리 정리
반복문과 조건문만을 사용하여 해결하기 보다는 정규표현식 등 코드를 줄일 수 있는 방법을 고민해 보면 좋을 것 같습니다.
정렬하는 함수에 Arrays.sort와 Collections.sort가 있는데 이에 대한 이론은 참조된 에서 추가로 공부해야겠습니다.
이상으로 프로그래머스 lv.0 - 문자열 정렬하기(1) 공부를 마치겠습니다.
감사합니다.
[프로그래머스] Lv.0 - 인덱스 바꾸기 (0) | 2023.03.09 |
---|---|
[프로그래머스] Lv.2 - 올바른 괄호 (0) | 2023.03.03 |
[프로그래머스] Lv.0 - 직각삼각형 출력하기 (0) | 2023.03.02 |
[프로그래머스] Lv.0 - n의 배수 고르기 (0) | 2023.03.01 |
[프로그래머스] Lv.1 - 문자열 내림차순으로 정렬하기 (0) | 2023.02.26 |
댓글 영역