본문 바로가기
Algorithm/Programmers

문자열 내 마음대로 정렬하기

by 동그란 혜주 2019. 5. 31.

· 문제 설명

문자열로 구성된 리스트 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

 

알고리즘 연습 - 문자열 내 마음대로 정렬하기 | 프로그래머스

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1의 문자 u, e, a로 strings를 정렬합니다. 제한 조건 strings는 길이 1 이상, 50이하인 배열입니다. strings의 원소는 소문자 알파벳으로 이루어져 있습니다. strings의 원소는 길이 1 이상, 100이하인

programmers.co.kr

 

'Algorithm > Programmers' 카테고리의 다른 글

문자열 다루기 기본  (0) 2019.05.31
문자열 내림차순으로 배치하기  (0) 2019.05.31
문자열 내 p와 y의 개수  (0) 2019.05.31
두 정수 사이의 합  (0) 2019.05.31
나누어 떨어지는 숫자 배열  (0) 2019.05.31

댓글