enoch012 / JavaBasicStudy

Java 기초 스터디 (2023.09 ~ 10)
0 stars 1 forks source link

12월 3일 / 코딩 테스트 연습(jaeyeon) #58

Open jaeyyyyy opened 11 months ago

jaeyyyyy commented 11 months ago

문제 1

문제

문자열 내 마음대로 정렬하기 (https://school.programmers.co.kr/learn/courses/30/lessons/12915)

입출력 예

strings n return
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

입출력 예 1

입출력 예 2

문제 풀이

어떤 방법으로 문제에 접근해야할지(compare 메서드를 재정의, temp 임시 변수를 선언해서 값을 바꿔주기) 고민했다. temp 변수로 하루종일 하다가 막혀서 결국 메서드를 재정의해보기로함..

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];

        Comparator<String> comp = 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 -1;
                } else {
                    return 0;
                }
            }
        };

        Arrays.sort(strings);
        Arrays.sort(strings, comp);

        return strings;
    }
}

temp 변수를 사용해서도 풀어보았다


... 생략
        String temp = "";
        for(int i = 0; i < strings.length; i++){
            for(int j = i+1; j < strings.length; j++){
                if(strings[i].charAt(n) > strings[j].charAt(n)){
                    temp = strings[i];
                    strings[i] = strings[j];
                    strings[j] = temp;
                } else if(strings[i].charAt(n) == strings[j].charAt(n)){
                    if(strings[i].compareTo(strings[j]) > 0){
                        // strings[i]가 strings[j]를 포함하고 있다면
                        temp = strings[i];
                        strings[i] = strings[j];
                        strings[j] = temp;
                    }
                }
            }
        }

        return strings;
    }
}

n번째 인덱스 문자가 같다면 compareTo를 사용해서 두 문자열의 포함관계를 알아야한다. 예) {"abcd","abc"}이고 n이 1일 경우, "b"로 같으므로 else if 부분을 타게된다. "abcd"가 "abc"를 포함한다면, "abc", "abcd"순으로 정렬해주어야하므로 temp 변수를 통해 자리를 바꾼다.

회고

다른 사람들의 풀이를 통해 comparing()을 사용하면 간단하게 원소들을 비교하여 정리할 수 있음을 알았다. (Java 8이후부터 사용 가능)

... 생략
        Arrays.sort(strings);
        Arrays.sort(strings, Comparator.comparing((s) -> s.substring(n, n + 1)));

        return strings;

n번째 인덱스 글자(s.substring(n, n+1))를 기준으로 바로 정렬한 코드이다.

유연하게 사고하기가 어렵다. 여러 개념들을 찾아보고 문제도 많이 풀어봐야겠다.