관리 메뉴

Algo μ“°μž

[Programmers] λ©€μ©‘ν•œ μ‚¬κ°ν˜• λ³Έλ¬Έ

πŸ’― CodingTest/Programmers

[Programmers] λ©€μ©‘ν•œ μ‚¬κ°ν˜•

S.Honey 2022. 6. 11. 16:25

β–Ά 문제 : https://programmers.co.kr/learn/courses/30/lessons/62048

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λ©€μ©‘ν•œ μ‚¬κ°ν˜•

κ°€λ‘œ 길이가 Wcm, μ„Έλ‘œ 길이가 Hcm인 μ§μ‚¬κ°ν˜• 쒅이가 μžˆμŠ΅λ‹ˆλ‹€. μ’…μ΄μ—λŠ” κ°€λ‘œ, μ„Έλ‘œ λ°©ν–₯κ³Ό ν‰ν–‰ν•˜κ²Œ 격자 ν˜•νƒœλ‘œ 선이 κ·Έμ–΄μ Έ 있으며, λͺ¨λ“  κ²©μžμΉΈμ€ 1cm x 1cm ν¬κΈ°μž…λ‹ˆλ‹€. 이 쒅이λ₯Ό 격자 선을

programmers.co.kr

 

β–Ά μ½”λ“œ : 

function solution(w, h) {
    const total = w * h;
    const g = gcd(w, h); // g 즉, μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ λ‚˜λˆ„μ—ˆμ„λ•Œ λ°˜λ³΅λ˜λŠ” μ‚¬κ°ν˜•ν˜•νƒœκ°€ λ“±μž₯ν•˜λŠ” νšŸμˆ˜μ΄λ‹€.
    const miniSquare = w/g + h/g - 1; // 각각의 μž‘μ€ μ‚¬κ°ν˜•μ€ κ°€λ‘œλ₯Ό g둜 λ‚˜λˆˆκ°’κ³Ό μ„Έλ‘œλ₯Ό g둜 λ‚˜λˆˆκ°’μ—μ„œ 1(μ€‘λ³΅ν•΄μ„œ 자λ₯΄λŠ” μ‚¬κ°ν˜•)을 λΊ€ κ°’λ§ŒνΌ μ‚¬κ°ν˜•μ„ μ§€μš΄λ‹€.
    
    return total - (g * miniSquare);
}

function gcd(a,b){
    if(b === 0){
        return a;
    }else{
        return gcd(b, a % b);
    }   
}

 

 

β–Ά 문제 풀이 : 

- ν•΄λ‹Ή λ¬Έμ œλŠ” 'λ©€μ©‘ν•œ μ‚¬κ°ν˜• 풀이' λ₯Ό μ°Έκ³ ν•˜μ—¬ ν’€μ΄ν•˜μ˜€λ‹€.

1. 전체 μ‚¬κ°ν˜•μ—μ„œ μž˜λ¦¬λŠ” μ‚¬κ°ν˜•μ˜ 수λ₯Ό μ„Έμ–΄μ•Ό ν•œλ‹€. (μ΄λ•Œ, μ „μ²΄μ‚¬κ°ν˜•μ€ μ§μ‚¬κ°ν˜•μ΄λΌλŠ” μ „μ œμ‘°κ±΄μ΄ λ¬Έμ œμ— μžˆλ‹€.)

2. 전체 μ‚¬κ°ν˜•μ—μ„œ μž˜λ¦¬λŠ” μ‚¬κ°ν˜•(μž˜λ¦¬λŠ” μ˜μ—­)은 λ°˜λ³΅λ˜λŠ” ν˜•νƒœλ₯Ό κ°€μ§€λŠ”λ°, μ΄λ•Œ λ°˜λ³΅λ˜λŠ” νšŸμˆ˜λŠ” GCD(μ΅œλŒ€κ³΅μ•½μˆ˜) 번 λ“±μž₯ν•œλ‹€. 

3. μΆ”κ°€μ μœΌλ‘œ μž˜λ¦¬λŠ” μ˜μ—­μ˜ μž‘μ€ μ‚¬κ°ν˜•μ΄ μ΅œλŒ€κ³΅μ•½μˆ˜ 번 λ“±μž₯ν•œλ‹€λ©΄ ν•˜λ‚˜μ˜ μž‘μ€ μ˜μ—­ μ‚¬κ°ν˜• λ‚΄λΆ€μ—μ„œ μž˜λ¦¬λŠ” μ‚¬κ°ν˜•μ˜ κ°œμˆ˜λŠ” μ–΄λ–»κ²Œ κ΅¬ν• κΉŒ? 

  - μž‘μ€ μ‚¬κ°ν˜•μ˜ ν¬κΈ°λŠ” (w // g) * (h // g) 이닀. μ΄λ•Œ 각각의 μ‚¬κ°ν˜•μ— λŒ€ν•΄ λŒ€κ°μ„ μ„ κ·Έμ—ˆμ„λ•Œ (μž‘μ€ μ‚¬κ°ν˜•μ˜ κ°€λ‘œ) 개, (μž‘μ€ μ‚¬κ°ν˜•μ˜ μ„Έλ‘œ) 개 μ”© λ‚˜λˆˆλ‹€. ν•˜μ§€λ§Œ μ΄λ•Œ κ°€λ‘œμ™€ μ„Έλ‘œμ— λŒ€ν•΄ μ€‘λ³΅μœΌλ‘œ μΉ΄μš΄νŒ…ν•˜λŠ” μΉΈ(처음 μ‹œμž‘μΉΈ) 에 λŒ€ν•œ 1을 λΉΌμ£Όμ–΄μ•Όν•œλ‹€. 

4. μ§€κΈˆ κΉŒμ§€μ˜ 말을 정리해보면 전체 μ‚¬κ°ν˜•μ˜ 크기 (w * h) μ—μ„œ gcd(μž‘μ€ μ‚¬κ°ν˜•μ˜ λ“±μž₯ 횟수) * miniSquare(μž‘μ€ μ‚¬κ°ν˜•μ—μ„œ λŒ€κ°μ„ μ— μ˜ν•΄ μ œμ™Έλ˜λŠ” μ‚¬κ°ν˜•μ˜ 수)λ₯Ό λΉΌμ£Όμ–΄μ•Ό ν•˜κ³  miniSquare의 μˆ˜λŠ” "(w / g) + (h /g) - 1" 이 λœλ‹€λŠ” 것이닀. 

5. λ”°λΌμ„œ 전체 식은 `(w * h) - gcd * (w/g + h/g - 1)` 이 λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 

6. gcd() ν•¨μˆ˜λŠ” 'μœ ν΄λ¦¬λ“œ 호제' λ₯Ό μ°Έκ³ ν•΄ κ΅¬ν˜„ν•˜μ˜€μœΌλ©° 각각을 μ‘°ν•©ν•˜μ—¬ κ²°κ³Όλ₯Ό 좜λ ₯ν•΄μ£Όλ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ‹€.