본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 문자열 내 마음대로 정렬하기 / JAVA]

by KDW999 2023. 3. 22.

https://school.programmers.co.kr/learn/courses/30/lessons/12915

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 접근

풀다가 시간 오래 걸려서 다른 사람 풀이를 봐야될 때 뭔가 되게 분하다

이걸 못풀어서 답을 봐야되나 같은 느낌이랄까

자른 인덱스 정렬 후 기존 단어들도 다시 정렬 해줄 때 단어마다 점수를 부과해서 정렬해야되나, 위치 인덱스에 따라 어떻게 해줄 순 없을까 생각이 많았다.

이 분은 List를 만들어서 정렬해놓은 자른 인덱스랑 기존 단어들의 인덱스 위치랑 비교해서 같다면 자른 인덱스의 위치에 해당 단어들을 다시 삽입해주면서 기존 단어들을 재정렬 해주었다.

 

import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
        
	    Arrays.sort(strings); // 자른 인덱스 문자가 같을 경우 단어의 오름차순으로 비교해야되기 때문에 미리 정렬
	    
		String[] answer = new String[strings.length]; // strings의 단어 인덱스를 자른 배열
		for(int i=0; i<strings.length; i++) answer[i] = strings[i].substring(n, n+1); // n부터 n+1보다 1작은 곳 까지 자르기 → n번 째 문자만 나옴 
		Arrays.sort(answer); // 자른 인덱스들을 오름차순 정렬
		
        
		List<String> wordList = new ArrayList<>(Arrays.asList(strings)); // strings 배열을 List로 생성
		
		for(int i=0; i<answer.length; i++) { // 반복문 돌면서 자른 인덱스랑 기존 문자들의 인덱스 위치와 같은 지 검토
			                                 // 자른 인덱스는 오름차순 정렬 되있기에 위치가 같다면 해당 자른 인덱스 위치에 기존 단어 삽입
			for(int j=0; j<wordList.size(); j++) {
				if(wordList.get(j).substring(n, n+1).equals(answer[i])) {
					answer[i] = wordList.get(j); 
					wordList.remove(j); // 같은 문자가 오면 중복되기에 삭제해주기
					break;
				}
			}
		}
        return answer;
    }
}

 

다른 사람 풀이

자른 인덱스 문자와 기존 문자들을 같이 List에 담아서 만들었다.

이렇게 만들고 List를 정렬하면 자른 인덱스의 순서에 맞게 정렬되기 때문에 뒤에 붙어있는 단어들도 정렬이 됨

한 번에 문제 해결

이후 반복문에서 인덱스 순서대로 단어 부분만 잘라내서 answer 배열에 넣음

자른 인덱스 문자랑 기존 문자를 붙였다는 게 참 신박하다.

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

댓글