상세 컨텐츠

본문 제목

[프로그래머스] Lv.0 - 문자열 정렬하기(1)

알고리즘/프로그래머스

by 으노로 2023. 2. 16. 01:48

본문

안녕하세요.

오늘은 프로그래머스의 코딩테스트 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의 숫자만 가져오기 위해 반복문을 통해 문자열의 글자를 하나씩 가지고 옵니다.

해당 글자가 숫자인지 문자인지 판별하여 숫자만 리스트에 추가하여 숫자만 있는 리스트를 만든 후에

오름차순으로 정렬하도록 구현하였습니다.

  1. 숫자만 담을 List를 선언한다.
  2. 매개변수 my_string(String)을 반복문을 통해 한 글자씩 숫자 여부를 확인한다.
  3. 문자열중에 판별된 글자를 숫자로 변환하여 List에 추가한다.
  4. List를 오름차순으로 정렬한다.
  5. List의 크기로 배열을 선언한다.
  6. 반복문으로 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()에 정규표현식을 사용하여 숫자를 제외한 글자들을 빈값으로 교체하였습니다.

  1. 매개변수 my_string을 replaceAll() 함수로 숫자를 제외한 문자들을 제거한다.
  2. 문자가 제거된 my_string의 길이로 배열을 선언한다.
  3. 반복문을 통해 문자열의 한 글자씩 배열에 삽입한다.
  4. 배열을 오름차순으로 정렬한다.
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) 공부를 마치겠습니다.

감사합니다.

관련글 더보기

댓글 영역