-
[JAVA/Algorithm] Programmers: 문자열 내 마음대로 정렬하기Algorithm/Programmers 2020. 11. 17. 14:59
문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1의 문자 u, e, a로 strings를 정렬합니다.
제한 조건
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예
stringsnreturn
[sun, bed, car] 1 [car, bed, sun] [abce, abcd, cdx] 2 [abcd, abce, cdx] 해법1:
첫번째 해법은 index n 에있는 char를 앞에 붙인 스트링이 들어있는 ArrayList를 만들고 Collections.sort를 이용하여 풀이하는 해법입니다. 이렇게되면 O(N)의 저장공간이 쓰여지고, O(NlogN)의 시간이 쓰여집니다. 두 for loop 은 O(N) 이지만, Collections.sort 는 보통 NlogN 입니다.
import java.util.*; class Solution { public String[] solution(String[] strings, int n) { ArrayList<String> list = new ArrayList<>(); for(int i = 0; i < strings.length; i ++){ list.add(strings[i].charAt(n) + strings[i]); } Collections.sort(list); String[] answer = new String[list.size()]; for(int i = 0; i < list.size(); i ++){ answer[i] = list.get(i).substring(1, list.get(i).length()); } return answer; } }
두번째 해법은 compare method 를 override 해서 쓰는것 입니다.
import java.util.*; class Solution { public String[] solution(String[] strings, int n) { Arrays.sort(strings, new Comparator<String>(){ @Override public int compare(String s1, String s2){ if(s1.charAt(n) > s2.charAt(n)) return 1; else if (s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2); else return -1; } }); return strings; } }
Arrays.sort를 이용하는것인데, Comparator 를 만들어서 s1 와 s2를 비교할때, index n에 있는 캐릭터로 비교를 해서, 만약 n에 있는 캐릭터가 같으면 스트링자체를 비교하고, 아니라면 1 또는 -1를 리턴하는 override 된 compare 를만들어서 사용합니다.
'Algorithm > Programmers' 카테고리의 다른 글
[JAVA/Algorithm] Programmers: 문자열 내 p와 y의 개수 (0) 2020.11.17 [JAVA/Algorithm] Programmers: 주식가격 (0) 2020.11.17 [JAVA/Algorithm] Programmers: 두 정수 사이의 합 (0) 2020.11.17 [JAVA/Algorithm] Programmers: 나누어 떨어지는 숫자 배열 (0) 2020.11.17 [Java/Algorithm] Programmers: 같은 숫자는 싫어! (0) 2020.11.16