[프로그래머스] Lv.0 - 문자열 정렬하기(1)
안녕하세요.
오늘은 프로그래머스의 코딩테스트 lv.0 단계 중에 문자열 정렬하기(1)를 공부해보겠습니다.
언어는 Java로 구현하였습니다.
문제 설명
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.
제한 사항
- 1 ≤ my_string의 길이 ≤ 100
- my_string에는 숫자가 한 개 이상 포함되어 있습니다.
- my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다
입출력 예
my_string | result |
"hi12392" | [1, 2, 2, 3, 9] |
"p2o4i8gj2" | [2, 2, 4, 8] |
"abcde0" | [0] |
문제 풀이
매개변수 my_string의 숫자만 가져오기 위해 반복문을 통해 문자열의 글자를 하나씩 가지고 옵니다.
해당 글자가 숫자인지 문자인지 판별하여 숫자만 리스트에 추가하여 숫자만 있는 리스트를 만든 후에
오름차순으로 정렬하도록 구현하였습니다.
- 숫자만 담을 List를 선언한다.
- 매개변수 my_string(String)을 반복문을 통해 한 글자씩 숫자 여부를 확인한다.
- 문자열중에 판별된 글자를 숫자로 변환하여 List에 추가한다.
- List를 오름차순으로 정렬한다.
- List의 크기로 배열을 선언한다.
- 반복문으로 List에 있는 숫자를 배열로 담는다.
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()에 정규표현식을 사용하여 숫자를 제외한 글자들을 빈값으로 교체하였습니다.
- 매개변수 my_string을 replaceAll() 함수로 숫자를 제외한 문자들을 제거한다.
- 문자가 제거된 my_string의 길이로 배열을 선언한다.
- 반복문을 통해 문자열의 한 글자씩 배열에 삽입한다.
- 배열을 오름차순으로 정렬한다.
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에는 소문자와 숫자로만 이루어져 있다는 제한 사항을 조건으로 정규표현식을 사용하여 코드를 정리할 수 있었습니다.
사용 함수
- Character.getNumericValue()
- 문자(char)를 숫자(int)로 변환하는 함수
- Arrays.sort() / Collections.sort()
- 배열을 오름차순으로 정렬하는 함수
- 배열을 정렬할 때는 Arrays.sort(), 리스트를 정렬할 때는 Collections.sort()를 사용하였습니다.
- 참조 : https://codingnojam.tistory.com/38
- charAt()
- 문자열에서 특정 인덱스의 값을 문자(Char)로 변환하는 함수
- replaceAll()
- 문자열 내에 특정문자 및 정규표현식에 해당하는 문자를 치환하는 함수
- 정규표현식을 이용하여 숫자가 아닌 문자들을 빈값으로 치환하였습니다.
마무리 정리
반복문과 조건문만을 사용하여 해결하기 보다는 정규표현식 등 코드를 줄일 수 있는 방법을 고민해 보면 좋을 것 같습니다.
정렬하는 함수에 Arrays.sort와 Collections.sort가 있는데 이에 대한 이론은 참조된 에서 추가로 공부해야겠습니다.
이상으로 프로그래머스 lv.0 - 문자열 정렬하기(1) 공부를 마치겠습니다.
감사합니다.