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


프로그래머스 “문자열 내 마음대로 정렬하기” 문제 해결과정입니다.

문자열 내 마음대로 정렬하기

문제설명

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

제한사항

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

입출력 예

stringsnreturn
["sun", "bed", "car"]1["car", "bed", "sun"]
["abce", "abcd", "cdx"]2["abcd", "abce", "cdx"]

문제 해결과정

프로그래머스 코드

import java.util.*;

class Solution {
    public String[] solution(String[] strings, int n) {
		String[] answer = new String[strings.length];
		List<String> list = new ArrayList<>();
		for(int i = 0; i < strings.length; i++) {
			list.add(strings[i].charAt(n) + "," + strings[i]); // ex) "u,sun","e,bed","a,car"
		}
		System.out.println(list);
		Collections.sort(list);
		for(int i = 0; i < list.size(); i++) {
            String a = list.get(i).split(",")[1];
			answer[i] = a;
		}
        return answer;
    }
}

먼저 리턴 할 answer의 배열 크기를 string.length로 설정해준다. 리스트를 선언하고 list.add(strings[i].charAt(n) + "," + strings[i]);로 string의 요소의 n번째 문자를 나타내는 형태로 리스트 안에 넣어준다. 이후에 Collections.sort를 통해 정렬해주고 반복문으로 “,” 뒤에 있는 것을 반환받아(split(“,”)[1]) answer에 넣어준다.

한 줄 코드

import java.util.*;

class Solution {
    public String[] solution(String[] strings, int n) {
        return Arrays.stream(strings)
             .sorted((s1, s2) -> {
                 int cmp = Character.compare(s1.charAt(n), s2.charAt(n));
                 return cmp != 0 ? cmp : s1.compareTo(s2);
             })
             .toArray(String[]::new);
    }
}

배열의 요소를 스트림으로 변환(Arrays.stream(strings))하고 정렬(sort) 하였다. sort 안에 람다식으로 s1과 s2를 Character.compare로 각 문자열의 n번째 문자를 비교하여 만약 둘 다 동일하면 0을 반환한다. s1의 문자가 s2의 문자보다 작으면 음수를, 크면 양수를 반환한다. 만약 0이 아니라면 cmp를 반환하여 정렬 순서를 결정하고, 0이면 compareTo로 s1,s2를 문자열의 사전 순서를 비교하여 반환한다. 마지막으로 .toArray(String[]::new);로 새 문자열 배열을 선언하며 배열 값을 리턴한다.

사용된 메소드

메소드설명
List list = new ArrayList<>();문자열을 저장할 ArrayList 생성
list.add(strings[i].charAt(n) + “,” + strings[i]);n번째 문자와 전체 문자열을 결합하여 리스트에 추가
Collections.sort(list);리스트를 사전순으로 정렬
String a = list.get(i).split(“,”)[1];리스트의 요소를 ‘,’로 나누어 두 번째 부분(원래 문자열)을 가져옴
Arrays.stream(strings)문자열 배열을 스트림으로 변환
sorted((s1, s2) -> {…})정렬 기준을 정의하는 람다 표현식
Character.compare(s1.charAt(n), s2.charAt(n));두 문자열의 n번째 문자를 비교
s1.compareTo(s2);n번째 문자가 동일할 경우, 사전순으로 두 문자열을 비교
toArray(String[]::new);스트림의 결과를 새로운 문자열 배열로 변환

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.