문제설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예
입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.
입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.
알고리즘 구상
주어진 문제의 입력으로 문자열 배열 strings과 인덱스 n을 받아 정렬된 결과를 반환하는 문제입니다.
저는 이러한 알고리즘을 구상하였습니다.
1. 주어진 문자열 배열 strings을 Arrays.sort()를 이용하여 오름차순으로 정렬 합니다.
2. 정렬된 문자열 배열에서 각 문자열을 charAt()함수를 이용하여 해당 인덱스 n의 문자와 알파벳을 비교해 주어 다시 정렬해줍니다.
이 알고리즘을 가지고 코딩을 하였습니다.
코드 설명
String[] answer = new String[strings.length];
answer에 strings의 값의 순서를 바꾸어 넣어 줄 것이기 때문에 strings의 길이만큼의 문자열을 만들어줍니다.
int cnt = 0;
그 다음 인덱스값에 넣어줄 cnt값을 0으로 초기화해줍니다.
Arrays.sort(strings);
Arrays.sort()를 사용하여 strings를 오름차순으로 정렬 해줍니다.
for(int i = 97; i < 123; i++)
char 타입의 알파벳 a는 int 타입의 97. 소문자 알파벳(a~z)는 97 ~ 122입니다. 따라서 97부터 시작해서 123까지 반복하도록 만들어주었습니다.
for(int j = 0; j < strings.length; j++)
그 후 j는 strings.length까지 반복하도록 만들어주었습니다.
if(strings[j].charAt(n) == (char)i){
answer[cnt++] = strings[j];
}
정렬된 문자열 배열에서 각 문자열을 charAt()함수를 이용하여 strings[j]에서 해당 인덱스 n의 문자를 추출하였고, 그 값이 i값을 char형으로 바꾼 값이랑 같다면 answer[]에 strings[j]를 추가해줍니다.
- 예를 들어, strings 배열이 ["car", "bed", "apple", "cat"]이고, n 값이 1이라면, 정렬된 결과는 ["apple", "bed", "car", "cat"]이 됩니다. 여기서 "apple", "bed", "car", "cat"은 각각 n 인덱스의 문자 'p', 'e', 'a', 'a'에 따라 다시 정렬되었습니다.
소스코드&결과
소스 코드
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
int cnt = 0;
Arrays.sort(strings);
for(int i = 97; i < 123; i++){
for(int j = 0; j < strings.length; j++){
if(strings[j].charAt(n) == (char)i){
answer[cnt++] = strings[j];
}
}
}
return answer;
}
}
결과
다른 사람이 짠 코드
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> arr = new ArrayList<>();
for (int i = 0; i < strings.length; i++) {
arr.add("" + strings[i].charAt(n) + strings[i]);
}
Collections.sort(arr);
answer = new String[arr.size()];
for (int i = 0; i < arr.size(); i++) {
answer[i] = arr.get(i).substring(1, arr.get(i).length());
}
return answer;
}
}
위의 코드를 보면서 어떤 식으로 코딩을 하였는지 알아보겠습니다!
위의 코드는 원하는 인덱스 문자를 뽑아서 앞에붙이고 오름차순 정렬하여 문제를 풀어 주었네요.
ArrayList<String> arr = new ArrayList<>();
Arraylist인 arr을 생성하고
for (int i = 0; i < strings.length; i++)
반복문을 통해 주어진 문자열 배열의 각 문자열에 접근해주었습니다.
arr.add("" + strings[i].charAt(n) + strings[i]);
각 문자열의 인덱스 n에 위치한 문자와 해당 문자열을 연결하여 arr에 추가합니다.
- 예를 들어, 문자열이 "abc"이고 n이 1이라면, "babc"를 arr에 추가되는 것입니다!
Collections.sort(arr);
그 후 Collections.sort()함수를 이용하여 arr을 정렬합니다.
answer = new String[arr.size()];
arr의 크기에 맞게 answer 배열을 생성해주었네요.
for (int i = 0; i < arr.size(); i++)
반복문을 통해 arr의 각요소에 접근하고 있습니다.
answer[i] = arr.get(i).substring(1, arr.get(i).length());
이 코드는 arr에서 가져온 요소의 일부분을 잘라내어 answer 배열에 저장하는 코드입니다.
arr.get(i)는 arr에서 인덱스 i에 해당하는 요소를 가져옵니다.
.substring(1, arr.get(i).length())은 가져온 요소를 일부분으로 잘라내는 역할을 합니다.
.substring(1, arr.get(i).length())의 첫 번째 매개변수인 1은 잘라낼 부분의 시작 인덱스를 나타냅니다. 여기서는 인덱스 1부터 시작하여 문자열의 두 번째 문자부터 잘라내게 됩니다.
두 번째 매개변수인 arr.get(i).length()는 잘라낼 부분의 끝 인덱스를 나타냅니다. arr.get(i).length()는 해당 요소의 길이를 반환하므로, 잘라내는 부분은 문자열의 끝까지 포함하게 됩니다.
따라서, 이 코드는 arr에서 가져온 요소를 두 번째 문자부터 마지막 문자까지 잘라낸 부분 문자열을 반환합니다.
마지막으로, answer[i]는 answer 배열의 인덱스 i에 잘라낸 부분 문자열을 저장하는 역할을 합니다.
answer[i] = arr.get(i).substring(1, arr.get(i).length());
종합하면 arr에서 가져온 요소를 두 번째 문자부터 마지막 문자까지 잘라낸 부분 문자열을 answer 배열의 인덱스 i에 저장하는 코드입니다.
- 예를 들어, 요소가 "babc"라면, "abc"를 answer에 저장하게 되는 것입니다.
이번 문제를 풀어보면서 제 실력이 아직 많이 부족하다는 점을 다시금 깨닫게 되었습니다. 또한 add()함수나 get()함수를 어떤 식으로 쓰는지 알게되었습니다!
혹시 이해가 안되는 부분이 있거나 설명이 잘못된 부분이 있다면 댓글로 알려주세용!!
'Coding Test > 프로그래머스' 카테고리의 다른 글
[JAVA] K번째수 (2) | 2023.06.02 |
---|---|
[JAVA] 푸드 파이트 대회 (0) | 2023.06.02 |
[JAVA] 숫자 문자열과 영단어 (0) | 2023.05.24 |
[JAVA] 크기가 작은 부분문자열 (0) | 2023.05.24 |
[JAVA] [1차] 비밀지도 (0) | 2023.05.22 |