[18/06/29] 프로그래머스- Level 1 문자열 내 마음대로 정렬하기
2018. 6. 29. 18:50
문제설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun
, bed
, car
]이고 n이 1이면 각 단어의 인덱스 1의 문자 u
, e
, a
로 strings를 정렬합니다.
제한사항
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
예제
strings | n | return |
---|---|---|
[sun, bed, car] | 1 | [car, bed, sun] |
[abce, abcd, cdx] | 2 | [abcd, abce, cdx] |
입출력 예 1sun
, bed
, car
의 1번째 인덱스 값은 각각 u
, e
, a
입니다. 이를 기준으로 strings를 정렬하면 [car
, bed
, sun
] 입니다.
입출력 예 2abce
와 abcd
, cdx
의 2번째 인덱스 값은 c
, c
, x
입니다. 따라서 정렬 후에는 cdx
가 가장 뒤에 위치합니다. abce
와 abcd
는 사전순으로 정렬하면 abcd
가 우선하므로, 답은 [abcd
, abce
, cdx
] 입니다.
import java.util.List; import java.util.Collections; import java.util.LinkedList; class Solution { public String[] solution(String[] strings, int n) { String[] answer; Listlist = new LinkedList<>(); // 정수 n기준 1글자 뽑기 // 뽑은 글자와 strings 결합 for (int i = 0; i < strings.length; i++) { list.add(strings[i].charAt(n)+strings[i]); } // 정수 n 기준 정렬 Collections.sort(list); answer= new String[list.size()]; // strings[i].charAt(n)를 자르고 완전한 단어로 출력 for (int i = 0; i < list.size(); i++) { answer[i]=list.get(i).substring(1,list.get(i).length()); } return answer; } }
이번 알고리즘은 너무 어려웠다. 문제를 풀고 다른 사람의 풀이를 봐도 자바는 3Page 밖에 없었다. 대부분 Python이었다. charAt과 substring을 두고 계속 고민하다가 charAt으로 정렬까진 했는데 문자를 다시 복구시키는게 문제였다. 2시간정도 걸린거 같다. 해답도 없고.... 결국 뽑은 char와 기존 단어를 합쳐서 정렬시킨다음 char를 제외한 나머지 문자를 다시 잘라내어 answer로 입력하는 방법으로 해결했다.
배운점
charAt, substring을 복습할 수 있어서 좋았다.
공부할 것
검색하면서 Comparator를 써볼까 했는데 쉽지않았다. Comparator를 좀 더 학습할 필요가 있다.
'Get IT Note > 알고리즘' 카테고리의 다른 글
[18/07/01] 프로그래머스- Level 1 가운데 글자 가져오기 (0) | 2018.07.01 |
---|---|
[18/06/30] 프로그래머스- Level 1 문자열 내림차순으로 배치하기 (0) | 2018.07.01 |
[18/06/29] 프로그래머스- Level 1 나누어 떨어지는 숫자 배열 (0) | 2018.06.29 |
[18/06/28] 프로그래머스-Level 1 두 정수 사이의 합 (0) | 2018.06.28 |
[18/06/22] 프로그래머스-순열 검사 (0) | 2018.06.23 |