Hello Kitty Eyes Shut
λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ’» μ½”ν…Œ/πŸ“Œ JAVA

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/JAVA] μΉ΄λ“œ λ­‰μΉ˜

λ°˜μ‘ν˜•

 

 

 

πŸ”— 문제 λ°”λ‘œκ°€κΈ°

 

https://school.programmers.co.kr/learn/courses/30/lessons/159994

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

SW개발자λ₯Ό μœ„ν•œ 평가, ꡐ윑의 Total Solution을 μ œκ³΅ν•˜λŠ” 개발자 μ„±μž₯을 μœ„ν•œ λ² μ΄μŠ€μΊ ν”„

programmers.co.kr

 


πŸ“Œ 문제 μš”μ•½

 

 

πŸ“„ 문제 상황

μ½”λ‹ˆλŠ” μ˜μ–΄ 단어가 적힌 μΉ΄λ“œ λ­‰μΉ˜ 2개λ₯Ό μ„ λ¬Ό λ°›μ•˜λ‹€.

μš°λ¦¬λŠ” 이 μΉ΄λ“œ λ­‰μΉ˜λ“€μ— μžˆλŠ” μΉ΄λ“œλ“€μ„ μ‚¬μš©ν•΄μ„œ μ›ν•˜λŠ” μˆœμ„œμ˜ λ¬Έμž₯을 λ§Œλ“€ 수 μžˆλŠ”μ§€ 확인해야 ν•œλ‹€.

 

 

πŸ“’ μΉ΄λ“œ μ‚¬μš© κ·œμΉ™

  • μ›ν•˜λŠ” μΉ΄λ“œ λ­‰μΉ˜μ—μ„œ 맨 μ•žμ˜ μΉ΄λ“œλΆ€ν„° μˆœμ„œλŒ€λ‘œ ν•œ μž₯μ”© μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. (κ±΄λ„ˆλ›°κΈ° λΆˆκ°€)
  • ν•œ 번 μ‚¬μš©ν•œ μΉ΄λ“œλŠ” λ‹€μ‹œ μ‚¬μš©ν•  수 μ—†λ‹€.
  • μΉ΄λ“œ λ­‰μΉ˜μ— μžˆλŠ” λ‹¨μ–΄μ˜ μˆœμ„œλŠ” λ°”κΏ€ 수 μ—†λ‹€.

 

🎯 λͺ©ν‘œ

  • cards1κ³Ό cards2에 μžˆλŠ” 단어듀을 μ΄μš©ν•΄μ„œ
    μ£Όμ–΄μ§„ goal 배열을 μ •ν™•νžˆ λ§Œλ“€ 수 μžˆλŠ”μ§€ νŒλ³„ν•΄μ•Ό ν•œλ‹€.
  • λ§Œλ“€ 수 있으면 "Yes", λ§Œλ“€ 수 μ—†μœΌλ©΄ "No"λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

 

πŸ”Ž μ˜ˆμ‹œ

cards1 = ["i", "drink", "water"]
cards2 = ["want", "to"]
goal   = ["i", "want", "to", "drink", "water"]
  • "i"  πŸ‘‰πŸ» cards1μ—μ„œ κΊΌλ‚΄κΈ°
  • "want" πŸ‘‰πŸ» cards2μ—μ„œ κΊΌλ‚΄κΈ°
  • "to" πŸ‘‰πŸ» cards2μ—μ„œ κΊΌλ‚΄κΈ°
  • "drink" πŸ‘‰πŸ» cards1μ—μ„œ κΊΌλ‚΄κΈ°
  • "water" πŸ‘‰πŸ» cards1μ—μ„œ κΊΌλ‚΄κΈ°

즉, goal 배열을 μ •ν™•νžˆ λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ "Yes"λ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

 

 

cards1 = ["i", "water", "drink"]
cards2 = ["want", "to"]
goal   = ["i", "want", "to", "drink", "water"]
  • "i" πŸ‘‰πŸ» cards1μ—μ„œ κΊΌλ‚΄κΈ°
  • "want" πŸ‘‰πŸ» cards2μ—μ„œ κΊΌλ‚΄κΈ°
  • "to" πŸ‘‰πŸ» cards2μ—μ„œ κΊΌλ‚΄κΈ°
  • "drink" πŸ‘‰πŸ» cards1μ—μ„œ κΊΌλ‚΄λ €κ³  ν–ˆμœΌλ‚˜, "drink" μ•žμ— μžˆλŠ” "water"λ₯Ό 아직 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ "drink"λ₯Ό κΊΌλ‚Ό 수 μ—†μŒ

즉, goal 배열을 μ™„μ„±ν•  수 μ—†μœΌλ―€λ‘œ "No"λ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

 


πŸ’‘ 아이디어

1️⃣ 포인터 두 개둜 맨 μ•žλ§Œ 가리킀기

  • i πŸ‘‰πŸ» cards1의 ν˜„μž¬ 맨 μ•ž 인덱슀λ₯Ό 가리킀도둝 ν•œλ‹€.
  • j πŸ‘‰πŸ» cards2의 ν˜„μž¬ 맨 μ•ž 인덱슀λ₯Ό 가리킀도둝 ν•œλ‹€.
int i = 0;
int j = 0;

 

 

2️⃣ 각 단어 g에 λŒ€ν•΄μ„œ κ·Έλ¦¬λ””ν•˜κ²Œ μ„ νƒν•˜κΈ°

  • cards1[i] == g이면 πŸ‘‰πŸ» i++ ν•΄μ£ΌκΈ° (cards1μ—μ„œ ν•œ μž₯ μ‚¬μš©ν–ˆλ‹€λŠ” 의미)
  • cards2[j] == g이면 πŸ‘‰πŸ» j++ ν•΄μ£ΌκΈ° (cards2μ—μ„œ ν•œ μž₯ μ‚¬μš©ν–ˆλ‹€λŠ” 의미)
  • λ‘˜ λ‹€ μ•„λ‹ˆλ©΄ πŸ‘‰πŸ» κ·œμΉ™μ„ 더이상 λ§Œλ“€ 수 μ—†λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ "No" λ°˜ν™˜ν•˜κΈ°
for(String g : goal){
    if(i < cards1.length && cards1[i].equals(g)){
        i++;
    }
    else if(j < cards2.length && cards2[j].equals(g)){
        j++;
    }
    else{
        return "No";
    }
}

 

μœ„μ™€ 같이 κ·Έλ¦¬λ””ν•˜κ²Œ μ„ νƒν•˜λŠ” μ΄μœ λŠ”,

goal은 μˆœμ„œκ°€ 고정이고, 각 μΉ΄λ“œ λ­‰μΉ˜μ—μ„œλŠ” μ•žμ—μ„œ λΆ€ν„° μ°¨λ‘€λŒ€λ‘œλ§Œ μΉ΄λ“œλ₯Ό 뽑을 수 μžˆμœΌλ―€λ‘œ

ν˜„μž¬ ν•„μš”ν•œ 단어λ₯Ό μ§€κΈˆ λ‹Ήμž₯ λ½‘λŠ” 선택 μ™Έμ—λŠ” 더 λ‚˜μ€ λŒ€μ•ˆμ΄ μ—†λ‹€.

 


πŸ‘©πŸ»‍πŸ’» μ΅œμ’… μ½”λ“œ

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        
        int i = 0;
        int j = 0;
        
        for(String g : goal){
            if(i < cards1.length && cards1[i].equals(g)){
                i++;
            }
            else if(j < cards2.length && cards2[j].equals(g)){
                j++;
            }
            else{
                return "No";
            }
        }
        
        return "Yes";
    }
}

 


πŸ•‘ μ‹œκ°„ λ³΅μž‘λ„

1️⃣ goal 순회

for(String g : goal) {
    ....
}

 

goal λ°°μ—΄μ˜ 길이λ₯Ό N이라고 ν•  λ•Œ,

이 λ£¨ν”„λŠ” μ΅œλŒ€ N번 λ°˜λ³΅ν•˜λ―€λ‘œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)이닀.

 

이것 μ΄μ™Έμ˜ 연산듀은 λͺ¨λ‘ λ‹¨μˆœ 비ꡐ 및 λŒ€μž…μ΄λ―€λ‘œ O(1)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–λŠ”λ‹€.

 

 

πŸ‘‰πŸ» λ”°λΌμ„œ μ΅œμ’… μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)이닀.

       (μ΄λ•Œ N은 goal λ°°μ—΄μ˜ 길이이닀.)

λ°˜μ‘ν˜•