[백준] 1599. 민식어

최대 1 분 소요

문제 링크

[백준] 1599. 민식어


풀이 과정

같이 공부한 친구의 풀이 방법입니다.

코드 특징은 다음과 같습니다.

  1. Stream 클래스의 메서드를 순차적으로 호출해, 단 한 줄로 결과값까지 출력할 수 있게 된다. 따라서, 코드가 깔끔하고 직관적이다.
  2. 민식어는 일반적인 알파벳 순서에서 c대신 k가 사용되고, n과 o 사이에 새로운 문자열 ng가 사용된다. 따라서, k를 c로, ng를 임의의 문자 N으로 치환한다. 이후, 문자 N의 아스키 코드 값은 n의 아스키 코드 값에 0.5를 더해, n과 o 사이에 위치할 수 있도록 조정한다. 조정된 민식어는 일반 알파벳 순서와 동일하므로, 문자열 정렬 기준으로 정렬한다.


코드

import java.util.Scanner;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        IntStream.range(0, N)
                .mapToObj(e -> sc.next().replace('k', 'c').replace("ng", "N"))
                .sorted((s1, s2) -> {
                    int len1 = s1.length(), len2 = s2.length();

                    for (int i = 0; i < Math.min(len1, len2); i++) {
                        double ascii1 = getAscii(s1.charAt(i)), ascii2 = getAscii(s2.charAt(i));
                        if (ascii1 != ascii2) return Double.compare(ascii1, ascii2);
                    }
                    return len1 - len2;
                })
                .map(s -> s.replace('c', 'k').replace("N", "ng"))
                .forEach(System.out::println);
    }

    static double getAscii(char ch) {
        return ch == 'N' ? 'n' + 0.5 : ch;
    }
}

카테고리:

업데이트:

댓글남기기