· 문제 설명
문자열로 구성된 리스트 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] |
· 입출력 예 설명
입출력 예 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] 입니다.
· Thinking 1
1. 일단 n번째 인덱스를 뽑고
2. n번째를 기준으로 sort하고
3. 같은 경우 전체 sort
1)
for(int i = 0; i < strings.length; i++) {
standard[i] = strings[i].substring(n, n+1);
}
2)
for (int i = 0; i < standard.length; i ++) {
for (int j = 0; j < strings.length; j++) {
if (standard[i].equals(strings[j].substring(n, n+1))) {
System.out.println("j : " + j + " " + strings[j].substring(n, n+1));
standard[i] = strings[j];
}
}
}
3) 같은 경우에는 전체 sort ..
이게 지금 같은 경우라는게.. n번째를 뽑은 standard가 같은 경우니까
그럼 그냥 일단 전체를 맨처음에 전체를 sort 하자..
strings : [abce, abcd, cdx]
standard : [c, c, x]
j : 0 c
j : 0 c -> 여기서 0이 아니라 1이 되어야된단 말이지;
j : 2 x
answer : [abce, abce, cdx]
0을 썼으면 0을 빼야된단 말이야;;;?
그니까.. standard[i] == standard[i+1] 이면은
j의 값을 넣어줘야되는뎅;..
standard : [c, c, x]
strings : [abcd, abce, cdx]
n = 2
i = 0
j = 0
if (standard[0] == strings[0]) ? true
if (i != 0) ? false
standard[0] = strings[0] -----------------> [abcd]
i = 1
j = 0
if (standard[1] == strings[0])? true
if (i != 0) ? true
if (standard[1] == standard[0]) ? true ---> 아 여기서 바뀌었구나,,
standard[1] = strings[j+1] ----------------> [abcd, abce]
i = 2
j = 0
if (standard[2] == strings[0]) ? false
j = 1
if (standard[2] == strings[1]) ? false
j = 2
if (standard[2] == strings[2]) ? true
if (i != 0) ? true
if (standard[2] == standard[1] ? false
standard[2] = strings[2]
· Thinking 2
import java.util.Arrays;
class Solution {
public String[] solution(String[] strings, int n) {
String[] standard = new String[strings.length];
Arrays.sort(strings);
for(int i = 0; i < strings.length; i++) {
standard[i] = strings[i].substring(n, n+1);
}
Arrays.sort(standard);
for (int i = 0; i < standard.length; i ++) {
for (int j = 0; j < strings.length; j++) {
if (standard[i].equals(strings[j].substring(n, n+1))) {
if (i != 0) {
if (standard[i].equals(standard[i-1].substring(n, n+1))) {
standard [i] = strings[j+1];
} else {
standard[i] = strings[j];
}
} else {
standard[i] = strings[j];
}
}
}
}
return standard;
}
}
- 아니네.. 정확성 : 25.0점
- 이걸 standard에 넣고나서 arraylist로 strings을 지우는 방법으로 풀어보자..
· 완성 코드
import java.util.Arrays;
import java.util.ArrayList;
class Solution {
public String[] solution(String[] strings, int n) {
String[] standard = new String[strings.length];
Arrays.sort(strings);
ArrayList<String> temp = new ArrayList<String>();
for (int i = 0; i < strings.length; i++) {
standard[i] = strings[i].substring(n, n + 1);
temp.add(strings[i]);
}
Arrays.sort(standard);
for (int i = 0; i < standard.length; i++) {
for (int j = 0; j < temp.size(); j++) {
if (standard[i].equals(temp.get(j).substring(n, n+1))) {
standard[i] = temp.get(j);
temp.remove(j);
}
}
}
return standard;
}
}
· 다른 사람의 풀이
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;
}
}
- 처음부터 n번째 인덱스의 값 + 전체 값 넣은 arrayList를 만들고, arrayList sort하고 n번째 인덱스 값 빼고 sort..
- 감탄스럽다....!
· 문제 출처
https://programmers.co.kr/learn/courses/30/lessons/12915
'Algorithm > Programmers' 카테고리의 다른 글
문자열 다루기 기본 (0) | 2019.05.31 |
---|---|
문자열 내림차순으로 배치하기 (0) | 2019.05.31 |
문자열 내 p와 y의 개수 (0) | 2019.05.31 |
두 정수 사이의 합 (0) | 2019.05.31 |
나누어 떨어지는 숫자 배열 (0) | 2019.05.31 |
댓글