프로그래머스: 문자열 내 마음대로 정렬하기

김아무개·2023년 3월 30일
0

프로그래머스

목록 보기
24/41

23.03.31

import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
        Arrays.sort(strings, (String s1, String s2) -> {
            if (s1.charAt(n) < s2.charAt(n))  return -1;
            if (s1.charAt(n) > s2.charAt(n))  return  1;
            if (s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);
            return 0;
        });
        return strings;
    }
}

😊



23.03.30

다른 사람 코드 1_프로그래머스 첫번째

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;
    }
}

오호...
이 사람은 각 문자열의 n번째 문자에 해당 문자열 전체를 연결해서 ArrayList에 순서대로 집어넣은 후
ArrayList를 정렬해서
ArrayList의 첫번째 값부터 뽑아내어 처음 나타나는 문자를 제거한 후
answer 배열에 집어넣어주었다
정말 좋은 아이디어라고 생각했다. 📝🤓


다른 사람 코드 2_프로그래머스 두번째

import java.util.*;

class Solution {
  public String[] solution(String[] strings, int n) {
      Arrays.sort(strings, new Comparator<String>(){
          @Override
          public int compare(String s1, String s2){
              if(s1.charAt(n) > s2.charAt(n)) return 1;
              else if(s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);
              else if(s1.charAt(n) < s2.charAt(n)) return -1;
              else return 0;
          }
      });
      return strings;
  }
}

가만 보면 Comparator 인터페이스를 사용하는 사람이 몇몇 보였었다.
학습하지 않고 지나갔었는데
이제는 그냥 지나가면 안될 것 같은 생각이 들었다.

그래서 공부 고고📝🤓


..
이해가 쉽지 않아 ChatGPT의 힘을 빌려보았다...🥲
🔻
이 코드는 문자열 배열(strings)을 주어진 정수 n에 따라 특정 비교 규칙에 따라 정렬하는 Solution 클래스의 solution 메서드를 정의합니다.

이제 코드의 각 부분을 자세히 살펴보겠습니다.

  1. Arrays.sort(strings, new Comparator(){ ... })
    Arrays 클래스의 sort 메서드는 배열을 정렬하는 데 사용됩니다. 이 경우, 문자열 배열(strings)을 정렬하고 있습니다. 두 번째 인수로 Comparator 인터페이스의 구현을 제공하면 사용자 지정 정렬 순서를 제공할 수 있습니다. 여기서는 익명 클래스(anonymous class)를 사용하여 Comparator 인터페이스를 구현하고 있습니다.

  2. public int compare(String s1, String s2) { ... }
    Comparator 인터페이스의 compare 메서드를 오버라이드하여 두 문자열(s1과 s2) 사이의 순서를 정의합니다. 이 메서드는 다음과 같은 규칙에 따라 두 문자열을 비교합니다.

    두 문자열의 n번째 문자를 비교합니다.
    n번째 문자가 같으면 문자열 전체를 비교합니다.

  3. if(s1.charAt(n) > s2.charAt(n)) return 1;
    s1의 n번째 문자가 s2의 n번째 문자보다 큰 경우 1을 반환합니다. 이 경우 s1이 s2보다 뒤에 있어야 함을 나타냅니다.

  4. else if(s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);
    s1의 n번째 문자가 s2의 n번째 문자와 같은 경우 문자열 전체를 비교합니다. 이때 compareTo 메서드를 사용하여 자연 순서에 따라 정렬됩니다.

  5. else if(s1.charAt(n) < s2.charAt(n)) return -1;
    s1의 n번째 문자가 s2의 n번째 문자보다 작은 경우 -1을 반환합니다. 이 경우 s1이 s2보다 앞에 있어야 함을 나타냅니다.

  6. else return 0;
    이 부분은 실행되지 않는 코드입니다. 이전 조건문에서 모든 경우의 수를 이미 처리했기 때문입니다.

마지막으로, 정렬된 문자열 배열(strings)을 반환합니다.

이 코드에서 중요한 부분은 Arrays.sort 메서드와
사용자 지정 정렬 순서를 제공하는 Comparator 인터페이스의 구현입니다.
이를 통해 문자열 배열(strings)을 주어진 정수 n에 따라 원하는 순서로 정렬할 수 있습니다.

Q. compare()의 return 값으로 1과 -1을 주었는데 이 값들은 왜 일까? 아무값이나 입력해도 되는지?

A. 반환 값은 임의의 값이 아닙니다.
compare 메서드의 반환 값은 두 객체의 순서를 결정하는 데 중요한 역할을 합니다.
다음과 같은 반환 값이 권장됩니다:

  • 양수(보통 1) : 첫 번째 객체가 두 번째 객체보다 큰 경우 (즉, 첫 번째 객체가 두 번째 객체보다 뒤에 위치해야 함)

  • 0 : 두 객체가 동일한 경우

  • 음수(보통 -1) : 첫 번째 객체가 두 번째 객체보다 작은 경우 (즉, 첫 번째 객체가 두 번째 객체보다 앞에 위치해야 함)

이러한 값들은 순서를 결정하기 위해 사용되며, 여기서 1과 -1은 일반적인 규칙을 따르고 있습니다.
그러나 양수나 음수의 실제 값은 중요하지 않습니다.
중요한 것은 양수와 음수의 부호만이 순서를 결정합니다.

따라서 아무 값이나 입력하는 것이 아니라
양수, 0, 음수를 반환하여 객체 간의 순서를 정확하게 결정해야 합니다.
반환 값은 일관되게 사용되어야 하며, 다른 값으로 대체되면 예기치 않은 정렬 결과를 초래할 수 있습니다.



내 코드였던 것

머쓱;

import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];
        
        Arrays.sort(strings);
        char[] temp = new char[strings.length];
        for (int i = 0; i < strings.length; i++) {
            temp[i] = strings[i].charAt(n);
        }

		Arrays.sort(temp);
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < strings.length; j++) {
                if ("".equals(strings[j])) continue;
                
                if (temp[i] == strings[j].charAt(n)) {
                    answer[i] = strings[j];
                    strings[j] = "";
                    break;
                }
            }
        }
        return answer;
    }
}

소요시간: 19분 58초



처음 풀어본 날 : 23.03.30
다시 풀어본 날 : 23.03.31 _ 04.01 _ 04.02

profile
Hello velog! 

0개의 댓글