반응형
12-24 00:25
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[Programmers] 문자열 내 마음대로 정렬하기 본문

Programming/프로그래머스

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

조용한고라니 2021. 3. 17. 18:13
반응형
 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱

programmers.co.kr

 


Comparable 인터페이스를 구현한 Word라는 클래스를 만들었다. Comparable을 구현한 이유는 Collections.sort() 메서드를 사용하기 위해서이다. 보통 String이나 int같은 타입은 대소관계가 명확하지만, 이 문제같은 경우 주어진 문자열의 n번째 문자의 대소를 비교해야하기 때문에 일반적인 정렬로는 불가능하다.

 

따라서 Comparable을 구현하여 정렬의 기준을 커스터마이징 한 것이다.

    static class Word implements Comparable<Word>{

        String word;
        char c;

        public Word(String w, char c){
            word=w;
            this.c = c;
        }

        @Override
        public int compareTo(Word o) {

            return c - o.c;
        }
    }
    //나보다 Word o가 클 때
    //return -1
    //나보다 Word o가 작을 때
    //return 1
    //나랑 Word o가 같을 때
    //return 0

그리고 n번째 문자의 대소관계가 동일할 경우, 문자열의 사전순으로 출력해야 하므로 미리 주어진 문자열 strings를 정렬 해준다.

 

List<Word>라는 리스트를 만들어 strings가 갖는 문자열을 이용해 Word 객체를 생성하여 담아준다.

        Arrays.sort(strings);

        List<Word> list = new ArrayList<>();

        for(int i=0; i<strings.length; i++) {
            String word = strings[i];
            char character = strings[i].charAt(n);

            list.add(new Word(word, character));
        }

이제 Comparable을 구현한 것이 제 역할을 해줄 때이다.

Collections.sort(list);

위에서도 말했듯 List<Integer> 같이 정수를 담는 리스트는 Comparable을 구현하지 않아도 대소관계가 명확하기에 구현할 필요가 없으나, Word라는 클래스는 멤버 변수로 문자열과 문자를 갖는데 어떤 것을 정렬 기준으로 삼을지 모르기에 알려주는 작업이라고 생각하면 쉬울 것 같다.

# Code </>

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Solution {

    static class Word implements Comparable<Word>{

        String word;
        char c;

        public Word(String w, char c){
            word=w;
            this.c = c;
        }

        @Override
        public int compareTo(Word o) {

            return c - o.c;
        }
    }

    public static String[] solution(String[] strings, int n) {

        Arrays.sort(strings);

        List<Word> list = new ArrayList<>();

        for(int i=0; i<strings.length; i++) {
            String word = strings[i];
            char character = strings[i].charAt(n);

            list.add(new Word(word, character));
        }

        Collections.sort(list);
        String[] answer = new String[list.size()];

        int idx = 0;
        for(Word w : list)
            answer[idx++] = w.word;

        return answer;
    }
/*
    public static void main(String[] args) {

        String[] str = {"abce", "abcd", "cdx"};
        int n = 2;

        System.out.println(Arrays.toString(solution(str, n)));
    }*/
}

 

다음은 버블정렬을 이용하여 푼 코드이다.

import java.util.Arrays;

public class Solution {

    public static String[] solution(String[] strings, int n) {

        Arrays.sort(strings);

        for(int i=0; i<strings.length; i++)
            for(int j=1; j<strings.length; j++) {

                String front = strings[j];
                String before = strings[j - 1];
                String tmp = "";

                if (front.charAt(n) < before.charAt(n)) {
                    tmp = strings[j];
                    strings[j] = strings[j - 1];
                    strings[j - 1] = tmp;
                }
            }

        String[] answer = strings;
        return answer;
    }
/*
    public static void main(String[] args) {

        String[] str = {"abce", "abcd", "cdx"};
        int n = 2;

        System.out.println(Arrays.toString(solution(str, n)));
    }*/
}
반응형

'Programming > 프로그래머스' 카테고리의 다른 글

[Programmers] 순위  (0) 2021.03.28
[Programmers] 가장 먼 노드  (0) 2021.03.28
[Programmers] 지형 이동  (0) 2021.03.10
[Programmers] 섬 연결하기  (0) 2021.03.10
[Programmers] 크레인 인형 뽑기 게임  (0) 2021.02.06
Comments