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

2024. 10. 16. 20:15·여러가지/알고리즘 & 자료구조

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

문제 설명

주어진 문자열 리스트 strings와 정수 n을 기준으로 각 문자열의 n번째 인덱스에 위치한 문자를 기준으로 오름차순 정렬하는 문제입니다. 만약 n번째 문자가 동일한 문자열이 여럿 있을 경우, 그 문자열들은 사전순으로 정렬합니다.


문제 조건

  1. strings는 길이 1 이상, 50 이하의 배열입니다.
  2. strings의 각 원소는 소문자 알파벳으로 이루어져 있습니다.
  3. strings의 각 문자열은 길이 1 이상, 100 이하입니다.
  4. 모든 strings의 원소의 길이는 n보다 큽니다.

입출력 예시

예시 1

  • 입력: strings = ["sun", "bed", "car"], n = 1
  • 출력: ["car", "bed", "sun"]

설명: 각 문자열의 1번째 인덱스 문자를 기준으로 보면 "sun"의 u, "bed"의 e, "car"의 a가 됩니다. 이를 기준으로 오름차순으로 정렬하면, "car", "bed", "sun" 순으로 배열됩니다.

예시 2

  • 입력: strings = ["abce", "abcd", "cdx"], n = 2
  • 출력: ["abcd", "abce", "cdx"]

설명: 각 문자열의 2번째 인덱스 문자를 기준으로 보면 "abce"와 "abcd"는 둘 다 c, "cdx"는 x입니다. 먼저 "cdx"는 가장 뒤에 위치하고, "abce"와 "abcd"는 사전순으로 비교하여 "abcd"가 앞에 옵니다.


Java 코드 구현

package lv1.문자열내마음대로정렬하기;

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

public class Solution {
    // 문자열을 n번째 문자를 기준으로 정렬하는 함수
    static String[] solution(String[] strings, int n){
        // Arrays.sort를 사용하여 문자열 배열을 정렬
        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 1. n번째 문자가 같으면 사전순으로 비교
                if (o1.charAt(n) == o2.charAt(n)) {
                    return o1.compareTo(o2);  // 사전순 비교
                } else {
                    // 2. n번째 문자가 다르면 해당 문자를 기준으로 비교
                    return o1.charAt(n) - o2.charAt(n);  // n번째 문자로 비교
                }
            }
        });
        return strings;
    }

    public static void main(String[] args) {
        var main = new Solution();
        // 예시 테스트
        System.out.println(Arrays.toString(main.solution(new String[]{"sun", "bed", "car"}, 1)));
        System.out.println(Arrays.toString(main.solution(new String[]{"abce", "abcd", "cdx"}, 2)));
    }
}

코드 설명

1. Arrays.sort() 메서드

Java의 Arrays.sort() 메서드는 배열을 정렬할 때 사용됩니다. 여기서는 Comparator<String>을 사용하여 각 문자열의 n번째 인덱스에 있는 문자를 기준으로 비교합니다.

2. Comparator의 compare 메서드

이 코드에서 핵심은 compare 메서드입니다.

  • 먼저 두 문자열의 n번째 문자를 비교합니다.
    • 만약 o1과 o2의 n번째 문자가 같다면, 사전순으로 비교하기 위해 o1.compareTo(o2)를 사용합니다.
    • n번째 문자가 다르면, 해당 문자를 기준으로 비교하여 정렬합니다.

3. 문자열 사전순 정렬

compareTo() 메서드는 두 문자열을 사전순으로 비교합니다. 따라서 n번째 문자가 같을 경우, 문자열 전체를 사전순으로 정렬할 수 있습니다.


입출력 예 설명

예시 1

  • 입력: ["sun", "bed", "car"], n = 1
  • 각 문자열의 1번째 인덱스 문자:
    • "sun" → 'u'
    • "bed" → 'e'
    • "car" → 'a'

이제 각 문자를 오름차순으로 정렬하면 "car", "bed", "sun"의 순서가 됩니다.

예시 2

  • 입력: ["abce", "abcd", "cdx"], n = 2
  • 각 문자열의 2번째 인덱스 문자:
    • "abce" → 'c'
    • "abcd" → 'c'
    • "cdx" → 'x'

먼저 "cdx"가 가장 뒤에 위치하게 됩니다. "abce"와 "abcd"는 2번째 문자가 같으므로, 전체 문자열을 사전순으로 정렬하여 "abcd", "abce"의 순서가 됩니다.


결론

이 알고리즘은 문자열 배열을 주어진 인덱스 n에 위치한 문자를 기준으로 정렬하고, 문자가 같을 경우에는 사전순으로 정렬합니다. Java의 Arrays.sort()와 Comparator를 적절히 활용하여 간결하게 구현할 수 있습니다.

저작자표시 (새창열림)

'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글

[LeethCode] 160번 Intersection of Two Linked Lists  (0) 2024.10.28
[프로그래머스] 푸드 파이트 대회  (1) 2024.10.16
[프로그래머스] k번째수  (0) 2024.10.16
[프로그래머스] 숫자 문자열과 영단어  (0) 2024.10.16
[프로그래머스] 가장 가까운 같은 글자  (0) 2024.10.16
'여러가지/알고리즘 & 자료구조' 카테고리의 다른 글
  • [LeethCode] 160번 Intersection of Two Linked Lists
  • [프로그래머스] 푸드 파이트 대회
  • [프로그래머스] k번째수
  • [프로그래머스] 숫자 문자열과 영단어
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (283)
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 운영체제 (0)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    celery
    java
    mybatis
    시험
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    완전탐색
    docker
    Spring Boot
    EC2
    ecs
    그리디
    SAA
    백준
    WebFlux
    Docker-compose
    FastAPI
    RDS
    spring
    OOP
    취업리부트
    Python
    프로그래머스
    파이썬
    자바
    Redis
    Spring WebFlux
    reactor
    AWS
    항해99
    DP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[프로그래머스] 문자열 내마음대로 정렬하기
상단으로

티스토리툴바