99클럽 코테 스터디 3일차 TIL + 오늘의 학습 키워드

찜와와·2024년 7월 24일
0

algorithm

목록 보기
7/25
post-thumbnail

오늘의 학습 내용

  • 문자와 배열간의 전환
  • Arrays.sort() 내부 @Override 되는 comparator 함수

공부한 내용

  1. 문자를 배열로, 배열을 문자로

나는 answer[] 로 받아오는 parameter 값들을 모두 또다른 2차원 배열 words 에서 구분하여 선언하였다. 우선 words[i][0] 에서는 다른 단어들과 비교할 대상인 각 단어별 2번째 인덱스 값을, words[i][1] 에서는 동일 단어일때 사전순으로 비교하기 위한 전체 단어를 넣었다.

  1. @ Override 메서드

2차원 배열 words를 배열하는 과정에서 1) 2번 인덱스의 값비교, 2) 1)이 동일한 경우 단어자체로 사전 순 비교 과정이 필요하다. 그리고 이 모두를 하나로 정리하기 위해 @Override 메서드를 이용해 Arrays.sort() 함수를 구현했다.

오늘의 회고

문제

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

내 풀이

import java.io.*;
import java.util.*;

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = strings; 
        int len = answer.length;
            String[][] words = new String[len][len];
            //answer배열에서 n번째 인덱스들만 2차원배열[0] + 나머지단어 2차원배열[1]
            for(int i=0; i<len; i++){
                char[] cha = answer[i].toCharArray(); //단어를 배열로
                words[i][0] = Character.toString(cha[n]);
                words[i][1] = answer[i];
            }

            Arrays.sort(words, new Comparator<String[]>(){
                @Override
                public int compare(String[] o1, String[] o2){
                    if(o1[0].toString().contentEquals(o2[0].toString())){ //0번 인덱스가 동일한 경우 -> 1번인덱스끼리 비교
                        return o1[1].toString().compareTo(o2[1].toString());
                    }else{ // 아닌 경우 0번인덱스끼리 비교
                        return o1[0].toString().compareTo(o2[0].toString());
                    }
                }
            });

            //words에 맞춰 answer재배열
            for(int i=0; i<len; i++){
                answer[i] = words[i][1];
            }
           return answer;
    }
}
// n: 몇번째 인덱스
// 2차원배열로 만들어서 1번 인덱스는 n번째 인덱스 애들만 넣음
// 2번 인덱스는 word전체

다른 사람 풀이

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

다른 사람들을 보니 '어차피 인덱스로 비교후 사전순 비교' 이므로 인덱스를 맨 앞에 두고 나머지 단어를 뒤에 연달아 list 로 구현했다. 알파벳의 사전순 비교를 고려해서 알고리즘을 구현하면 이렇게도 되는 것을 알 수 있다. 잘 기억해둬야겠다.

0개의 댓글