728x90

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

ํŒŒ์ผ๋ช… ์ •๋ ฌ

 

๐Ÿ”Ž ๋ฌธ์ œ ํ’€์ด

Comparator ํ˜น์€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •๋ ฌ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ•œ ๋ธ”๋กœ๊ฑฐ์˜ ์ฝ”๋“œ๊ฐ€ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์–ด์„œ, ํ•ด๋‹น ์ฝ”๋“œ๋กœ ํ’€๋ฉฐ ์ดํ•ด๋ฅผ ํ–ˆ๋‹ค.

 

Key Point

๐Ÿ”‘ Comparator ํ˜น์€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

Java ์ฝ”๋“œ

import java.util.*;

class Solution {
    public String[] solution(String[] files) {
        
        // Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •๋ ฌํ•œ๋‹ค.
        
        Arrays.sort(files, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            String[] file1 = fileInfo(s1);
            String[] file2 = fileInfo(s2);
            
            int headValue = file1[0].compareTo(file2[0]);
            
            if (headValue == 0) {
                int num1 = Integer.parseInt(file1[1]);
                int num2 = Integer.parseInt(file2[1]);
                
                return num1 - num2;
            }
            else {
                return headValue;
            }
        }
        
        // head, number, tail ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
            
        private String[] fileInfo(String s) {
            String head = "";
            String number = "";
            String tail = "";
            
            int idx = 0;
            for ( ; idx<s.length(); idx++) {
                char ch = s.charAt(idx);
                if (ch>='0' && ch<='9') break;
                head += ch;
            }
            
            for ( ; idx<s.length(); idx++) {
                char ch = s.charAt(idx);
                if (!(ch>='0' && ch<='9')) break;
                number += ch;
            }
            
            for ( ; idx<s.length(); idx++) {
                char ch = s.charAt(idx);
                tail += ch;
            }
            
            String[] file = {head.toLowerCase(), number, tail};
            return file;
            }
        });
        
        return files;
    }
}

 

๐Ÿ’ก Comparable๊ณผ Comparator 

๊ฐ์ฒด๋ฅผ ์ •๋ ฌํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

์ฆ‰, Comparable ํ˜น์€ Comparator๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

Comparable ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” compareTo (T o) ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜๊ฐ€ ์„ ์–ธ๋˜์–ด์žˆ๋‹ค.

์ฆ‰, Comparable์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ (Override/๊ตฌํ˜„) ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

โœ” ์ž๊ธฐ ์ž์‹ ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

โœ” lang ํŒจํ‚ค์ง€์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— import ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

Comparator ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŽ์ง€๋งŒ, ์‹ค์งˆ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” compare(T o1, T o2) ํ•˜๋‚˜์ด๋‹ค.

โœ” ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

โœ” util ํŒจํ‚ค์ง€์— ์žˆ๋‹ค.

 

๐Ÿ’ก ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์ฝ”๋”ฉ์˜ ๊ธฐ์ดˆ ๋ฌธ์ œ์ธ ์ •๋ ฌ ๋ฌธ์ œ์ด๋‹ค.

์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์—†๋‹ค๋ฉด ์›๋ž˜ ์ž…๋ ฅ์—์„œ ์ฃผ์–ด์ง„ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์•ˆ์ • ์ •๋ ฌ (Stable Sort)์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ  ํ’€๋ฉด์„œ ์•„์ง๊นŒ์ง€ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์™„๋ฒฝํžˆ ์ˆ™์ง€ํ•˜๊ณ  ์žˆ์ง€ ๋ชปํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์กฐ๋งŒ๊ฐ„ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค !

 


+ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ, ์ •๊ทœ์‹์„ ํ™œ์šฉํ•ด์„œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ๋‹ค.

Java์—์„œ๋Š” ์ •๊ทœ์‹์„ ํ™œ์šฉํ•ด ๋ฌธ์ž์—ด ๊ฒ€์ฆ ๋ฐ ํƒ์ƒ‰์„ ๋•๋Š” Pattern, Matcher ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ์€ Matcher์˜ find()์™€ group() ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

 boolean find()

ํŒจํ„ด์ด ์ผ์น˜ํ•˜๋Š” ๋‹ค์Œ ๋ฌธ์ž์—ด์„ ์ฐพ๊ณ , ๋‹ค์Œ ๋ฌธ์ž์—ด์ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

String group()

๋งค์น˜์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

groupt(int i)๋Š” ๋งค์นญ ๋˜๋Š” ๋ฌธ์ž์—ด ์ค‘ i๋ฒˆ์งธ ๊ทธ๋ฃน์˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

0์€ ๊ทธ๋ฃน์˜ ์ „์ฒด ํŒจํ„ด์„ ์˜๋ฏธํ•œ๋‹ค.

- group(0) = group()

 

์•„๋ž˜๋Š” ์ •๊ทœ์‹์„ ํ™œ์šฉํ•œ ํ’€์ด ์ค‘ ๊น”๋”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” Java ์ฝ”๋“œ์ด๋‹ค.

import java.util.*;
import java.util.regex.*;

class Solution {
    public String[] solution(String[] files) {
        Pattern p = Pattern.compile("([a-z\\s.-]+)([0-9]{1,5})");

        Arrays.sort(files, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                Matcher m1 = p.matcher(s1.toLowerCase());
                Matcher m2 = p.matcher(s2.toLowerCase());
                m1.find();
                m2.find();

                if(!m1.group(1).equals(m2.group(1))) {
                    return m1.group(1).compareTo(m2.group(1));
                } else {
                    return Integer.parseInt(m1.group(2)) - Integer.parseInt(m2.group(2));
                }
            }
        });

        return files;
    }
}

 

 

+ ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋” ์‰ฌ์šด ๋ฌธ์ œ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ : ๋ฌธ์ž์—ด ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ์ •๋ ฌํ•˜๊ธฐ

 

compareTo ๋ฉ”์„œ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„  ํ’€๋ฉด์„œ ๋ช‡ ๋ฒˆ ์‚ฌ์šฉํ•œ ์ ์ด ์žˆ์ง€๋งŒ Comparable๊ณผ Comparator ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฒ˜์Œ ์ ‘ํ•ด๋ณด์•˜๋‹ค ,, ์•„๋‹ˆ๋ฉด ๊นŒ๋จน์—ˆ๊ฑฐ๋‚˜ ,,^^  ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ๋ฒ•์„ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ์šฐ์—ฐํžˆ "๋ฌธ์ž์—ด ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ์ •๋ ฌํ•˜๊ธฐ" ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ›จ์”ฌ ์ง๊ด€์ ์ด์–ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ’€๊ณ  ๋‚˜๋‹ˆ Java์—์„œ์˜ ๊ฐ์ฒด ์ •๋ ฌ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

 

Java ์ฝ”๋“œ

import java.util.*;

class Solution {
    public String[] solution(String[] strings, int n) {
        
        Arrays.sort(strings, new Comparator<String>() {
            
            // ์•ž์˜ ๊ฐ’(o1)๊ณผ ๋’ค์˜ ๊ฐ’(o2)์„ ๋น„๊ตํ•ด์„œ ๋ฆฌํ„ด๊ฐ’์„ ์–‘์ˆ˜๋กœ ์ฃผ๋ฉด ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค. (์˜ค๋ฆ„์ฐจ์ˆœ)
            // ์•ž์˜ ๊ฐ’(o1)๊ณผ ๋’ค์˜ ๊ฐ’(o2)์„ ๋น„๊ตํ•ด์„œ ๋ฆฌํ„ด๊ฐ’์„ ์Œ์ˆ˜๋กœ ์ฃผ๋ฉด ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. (๋‚ด๋ฆผ์ฐจ์ˆœ)          
            @Override
            public int compare(String o1, String o2) {
                if (o1.charAt(n) > o2.charAt(n)) {
                    return 1;
                }
                else if (o1.charAt(n) == o2.charAt(n)) {
                    
                    // compareTo() ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ int ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. 
                    
                    return o1.compareTo(o2); 
                }
                else {
                    return -1;
                }             
            }
            
        });
        return strings;
    }
}

 


Reference

 

์ž๋ฐ” [JAVA] - Comparable ๊ณผ Comparator์˜ ์ดํ•ด

์•„๋งˆ ์ด ๊ธ€์„ ์ฐพ์•„ ์˜ค์‹  ๋ถ„๋“ค ๋Œ€๊ฐœ๋Š” Comparable๊ณผ Comparator์˜ ์ฐจ์ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•ด์„œ ์ฐพ์•„์˜ค์…จ์„ ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ์•Œ๊ณ ๋ณด๋ฉด ๋‘ ๊ฐœ๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์œผ๋‚˜ ์•„๋ฌด๋ž˜๋„ ์ž๋ฐ”๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ ๊ฐ

st-lab.tistory.com

 

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํŒŒ์ผ๋ช… ์ •๋ ฌ (Java)

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํŒŒ์ผ๋ช… ์ •๋ ฌ์ง€๋ฌธ์—์„œ ์š”๊ตฌํ•˜๋Š” ์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ์„œ ์ •๋ ฌ์„ ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค. Java์˜ ๊ฒฝ์šฐ์—๋Š” Comparator๋ฅผ ์ž˜์‚ฌ์šฉํ•  ์ค„ ์•Œ์•„์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.์ฃผ์–ด์ง„ ํŒŒ์ผ๋ช…์„ HEAD, NUMBER, TAI

velog.io

 

728x90

+ Recent posts