본문 바로가기
코딩테스트/Java

[Level1] 문자열 내 마음대로 정렬하기 답안 및 풀이

by SRin23 2021. 7. 14.

◇ 문제 설명

문자열로 구성된 리스트 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"] 입니다.

 

◇ 초기 내용

※ [출처] 프로그래머스-코딩테스트 연습-문제명

※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        return answer;
    }
}

 


◇ 답안

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];
        for(int i = 0; i<strings.length-1; i++){
            for(int j = i+1; j<strings.length; j++){
                if(strings[i].charAt(n)>strings[j].charAt(n)){
                    String tmp = strings[i];
                    strings[i] = strings[j];
                    strings[j] = tmp;
                }
                else if(strings[i].charAt(n)==strings[j].charAt(n)){
		        	if(strings[i].compareTo(strings[j])>0){
                        String tmp = strings[i];
                        strings[i] = strings[j];
                        strings[j] = tmp;
                    }
                }
            }
        }
        
        for(int i = 0; i<strings.length; i++){
            answer[i] = strings[i];
        }

        return answer;
    }
}

 

◇ 답안 힌트

    ▶ 문자열의 각 문자에 접근하기 위해서 (문자열).charAt(접근하고자 하는 인덱스 번호)를 사용합니다.

    ▶ (문자열1).compareTo(문자열2)메서드는 두 문자열을 앞 문자부터 사전순으로 비교하여  문자열 1이 크면 1, 같으면 0, 문자열2가 크면 -1을 반환합니다.(값이 중복될때, 사용하면 유용합니다.)

 

◇ 답안 풀이

(※ 실행 흐름 순으로 해석됩니다.)

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

        //반환할 문자열 생성
        String[] answer = new String[strings.length];

 

        //selection sort(strings[i]의 n번째 문자의 오름차순으로 정렬)

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

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

                //만약, strings[i]의 n번째 문자가 strings[j]의 n번째 문자보다 크면 두 배열 자리바꿈
                if(strings[i].charAt(n)>strings[j].charAt(n)){
                    String tmp = strings[i];
                    strings[i] = strings[j];
                    strings[j] = tmp;
                }

                //만약, strings[i]의 n번째 문자가 strings[j]의 n번째 문자와 같으면 아래문장 실행
                else if(strings[i].charAt(n)==strings[j].charAt(n)){

                    //두 문자열의 문자를 하나하나씩 비교하여 오름차순으로 정렬
                    if(strings[i].compareTo(strings[j])>0){
                        String tmp = strings[i];
                        strings[i] = strings[j];
                        strings[j] = tmp;
                    }
                }
            }
        }
        

        //배열 answer에 strings의 문자열 저장
        for(int i = 0; i<strings.length; i++){
            answer[i] = strings[i];
        }

        return answer;
    }
}

 

◇ 실행결과

문자열 내 마음대로 정렬하기 실행결과

 

◇ 출처

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

댓글