λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

[큐] 7. κ΅μœ‘κ³Όμ • 섀계

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2024. 1. 13.
7. κ΅μœ‘κ³Όμ • 섀계
 

μ„€λͺ…

ν˜„μˆ˜λŠ” 1λ…„ κ³Όμ •μ˜ μˆ˜μ—…κ³„νšμ„ μ§œμ•Ό ν•©λ‹ˆλ‹€.

μˆ˜μ—…μ€‘μ—λŠ” ν•„μˆ˜κ³Όλͺ©μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이 ν•„μˆ˜κ³Όλͺ©μ€ λ°˜λ“œμ‹œ μ΄μˆ˜ν•΄μ•Ό ν•˜λ©°, κ·Έ μˆœμ„œλ„ μ •ν•΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ 총 κ³Όλͺ©μ΄ A, B, C, D, E, F, Gκ°€ 있고, μ—¬κΈ°μ„œ ν•„μˆ˜κ³Όλͺ©μ΄ CBA둜 μ£Όμ–΄μ§€λ©΄ ν•„μˆ˜κ³Όλͺ©μ€ C, B, Aκ³Όλͺ©μ΄λ©° 이 μˆœμ„œλŒ€λ‘œ κΌ­ μˆ˜μ—…κ³„νšμ„ μ§œμ•Ό ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μˆœμ„œλž€ Bκ³Όλͺ©μ€ Cκ³Όλͺ©μ„ μ΄μˆ˜ν•œ 후에 λ“€μ–΄μ•Ό ν•˜κ³ , Aκ³Όλͺ©μ€ C와 Bλ₯Ό μ΄μˆ˜ν•œ 후에 λ“€μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν˜„μˆ˜κ°€ C, B, D, A, G, E둜 μˆ˜μ—…κ³„νšμ„ 짜면 μ œλŒ€λ‘œ 된 μ„€κ³„μ΄μ§€λ§Œ

C, G, E, A, D, B μˆœμ„œλ‘œ μ§°λ‹€λ©΄ 잘 λͺ» μ„€κ³„λœ μˆ˜μ—…κ³„νšμ΄ λ©λ‹ˆλ‹€.

μˆ˜μ—…κ³„νšμ€ κ·Έ μˆœμ„œλŒ€λ‘œ μ•žμ— μˆ˜μ—…μ΄ 이수되면 λ‹€μŒ μˆ˜μ—…μ„ μ‹œμž‘ν•˜λ‹€λŠ” κ²ƒμœΌλ‘œ ν•΄μ„ν•©λ‹ˆλ‹€.

μˆ˜μ—…κ³„νšμ„œμƒμ˜ 각 κ³Όλͺ©μ€ 무쑰건 μ΄μˆ˜λœλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

ν•„μˆ˜κ³Όλͺ©μˆœμ„œκ°€ μ£Όμ–΄μ§€λ©΄ ν˜„μˆ˜κ°€ μ§  N개의 μˆ˜μ—…μ„€κ³„κ°€ 잘된 것이면 “YES", 잘λͺ»λœ 것이면 ”NO“λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

μž…λ ₯

첫 쀄에 ν•œ 쀄에 ν•„μˆ˜κ³Όλͺ©μ˜ μˆœμ„œκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. λͺ¨λ“  κ³Όλͺ©μ€ 영문 λŒ€λ¬Έμžμž…λ‹ˆλ‹€.

두 번 μ§Έ 쀄뢀터 ν˜„μˆ˜κ°€ μ§  μˆ˜μ—…μ„€κ³„κ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€.(μˆ˜μ—…μ„€κ³„μ˜ κΈΈμ΄λŠ” 30μ΄ν•˜μ΄λ‹€)

좜λ ₯

첫 쀄에 μˆ˜μ—…μ„€κ³„κ°€ 잘된 것이면 “YES", 잘λͺ»λœ 것이면 ”NO“λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ μž…λ ₯ 1 

CBA
CBDAGE

μ˜ˆμ‹œ 좜λ ₯ 1

YES

 

<<풀이>>

-λ‚˜μ˜ 풀이-

 

μ‹œκ°„ λ³΅μž‘λ„ : O(N)

 

μ²˜μŒμ— λŸ°νƒ€μž„ μ—λŸ¬κ°€ 났닀. ν•„μˆ˜κ³Όλͺ©μ„ μ•„μ˜ˆ λ‹€ λ„£μ§€ μ•Šμ€ 경우λ₯Ό κ³ λ €λͺ»ν•΄μ„œ 생긴 λ¬Έμ œμ΄λ‹€. λΉ„κ΅ν•˜λ©΄μ„œ νμ—μ„œ poll을 ν•˜λŠ”λ° ν•„μˆ˜κ³Όλͺ©μ„ λ‹€ λ„£μ§€ μ•Šμ€ κ²½μš°μ—λŠ” λ‹€ λΉ„κ΅ν•˜κΈ°μ „μ— 이미 큐에 데이터가 μ—†λŠ” 상황이 λ°œμƒν•œλ‹€. 근데 이 μƒνƒœμ—μ„œλ„ poll을 ν•˜κΈ° λ•Œλ¬Έμ— NullPointerException μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

 

이λ₯Ό κ³ λ €ν•˜λ‹ˆ 정닡을 맞좜 수 μžˆμ—ˆλ‹€.

 

λ˜ν•œ String.valueOf() λ₯Ό ν™œμ˜ν•˜μ—¬ String λ©”μ„œλ“œμΈ containsλ₯Ό ν™œμš©ν•  수 μžˆμ—ˆλ‹€. String.valueOf() 이게 μ—†μ—ˆμœΌλ©΄ 문자λ₯Ό λ¬Έμžμ—΄λ‘œ λ°”κΏ€ μˆ˜κ°€ μ—†μ–΄μ„œ containsλ₯Ό ν™œμš©ν•˜μ§€ λͺ»ν•œλ‹€.

import java.util.*;

class Main {
    private String solution(String target, String str) {
        Queue<Character> Q = new LinkedList<>();
        for(char x : str.toCharArray()) {
            if(target.contains(String.valueOf(x))) {
                Q.offer(x);
            }
        }
        for(char y : target.toCharArray()) {
            if(!Q.isEmpty()) {
                if (y != Q.poll()) return "NO";
            } else return "NO";
        }
        return "YES";
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String target = in.next();
        String str = in.next();
        System.out.println(T.solution(target, str));

    }
}

 

-κ°•μ‚¬λ‹˜ 풀이-

 

μ‹œκ°„ λ³΅μž‘λ„ : O(N)

 

κ°•μ‚¬λ‹˜μ€ λ‚˜μ™€ μ ‘κ·Ό 방식이 λ°˜λŒ€μ΄λ‹€. λ‚˜λŠ” μ‹€μ œ 넣은 κ°•μ’Œλ₯Ό μ‹€μ œ ν•΄μ•Όν•˜λŠ” μˆœμ„œμ˜ κ°’κ³Ό λΉ„κ΅ν•˜λ©΄μ„œ 큐에 λ„£μ—ˆλ‹€λ©΄, κ°•μ‚¬λ‹˜μ€ 미리 μ§€μ •ν•΄λ‘” ν•΄μ•Όν•˜λŠ” μˆœμ„œλ₯Ό 넣어두고 μ‹€μ œ μ‹ μ²­ν•œ 것과 λΉ„κ΅ν•˜λ©΄μ„œ poll을 ν•˜λ©° 데이터λ₯Ό λΉ„μ›Œλ‚˜κ°”λ‹€. κ·Έ 쀑에 값이 κ°™μ§€ μ•ŠμœΌλ©΄ "NO" λ°˜ν™˜ν•˜κ²Œ ν–ˆλ‹€.

 

이후에 isEmpty() λ©”μ„œλ“œλ‘œ 0이면 "YES"λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ•„λ‹ˆλ©΄ "NO"λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν–ˆλ‹€.

 

import java.util.*;

class Main {
    private String solution(String target, String str) {
        String answer = "YES";
        Queue<Character> Q = new LinkedList<>();
        for(char x : target.toCharArray()) Q.offer(x);
        for(char x : str.toCharArray()) {
            if(Q.contains(x)) {
                if(x != Q.poll()) return "NO";
            }
        }
        if(!Q.isEmpty()) return "NO";
        
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String target = in.next();
        String str = in.next();
        System.out.println(T.solution(target, str));

    }
}

 

νŠΉνžˆλ‚˜, 큐 의 λ©”μ„œλ“œ 쀑에 contains()κ°€ μžˆλŠ”λ° 이λ₯Ό 잘 ν™œμš©ν•˜λ©΄ μ½”λ“œλ₯Ό μ’€ 더 쉽고 짧게 ꡬ성할 수 μžˆλ‹€. 

 

μ΄λ ‡κ²Œ 같은 방식을 μ‚¬μš©ν•˜λ”λΌλ„ 무엇을 κΈ°μ€€μœΌλ‘œ μž‘μ„μ§€ 그리고 μ–΄λ–€ λ©”μ„œλ“œλ₯Ό μ΄μš©ν• μ§€μ— 따라 풀이 ν˜•νƒœκ°€ 많이 바뀐닀. 

 

이번 문제 같은 경우 더 효율적인 풀이λ₯Ό μƒκ°ν•˜μ§€ λͺ»ν•œ μ΄μœ λŠ” 두 κ°€μ§€κ°€ μžˆλ‹€κ³  λ³Έλ‹€.

 

첫째, μ§€μ‹μ˜ 뢀쑱이닀. λ‚΄κ°€ 큐에 λŒ€ν•΄ 아직 많이 μ•Œμ§€ λͺ»ν•΄μ„œ μƒκ°ν•˜μ§€ λͺ»ν•œ 것이닀. 특히 containsκ°€ 큐의 λ©”μ„œλ“œμΈμ§€ λͺ°λžλ‹€.

 

λ‘˜μ§Έ, 아직 μ½”λ“œλ₯Ό μ§œλŠ” 것이 λ―Έμˆ™ν•˜λ‹€λŠ” 것이닀. μ΄λŠ” κΎΈμ€€νžˆ μ˜μ‚¬μ½”λ“œλ₯Ό μ§œμ„œ λ‚΄κ°€ 풀어보고 κ°•μ‚¬λ‹˜μ˜ ν’€μ΄μ˜ νŒμ„ λ°›μ•„ μ’€ μ½”λ“œλ₯Ό λ‹€λ“¬μ–΄μ„œ κ·Έ λ¬Έμ œμ™€ 방식을 λ‚΄ κ²ƒμœΌλ‘œ λ§Œλ“œλŠ” 과정이 ν•„μš”ν•˜λ‹€. 이런 것듀이 자꾸 μŒ“μ—¬κ°€λ©΄ μ–Έμ  κ°€ 졜적으둜 효율적인 μ½”λ“œλ₯Ό 짜고 μžˆμ„ 것이라 ν™•μ‹ ν•œλ‹€ !! 

 

μ˜€λŠ˜λ„ 많이 배우고 κ°„λ‹€ γ…Žγ…Ž

λŒ“κΈ€