πŸ’œκ°œλ°œκ³Ό 일상 (≧∇≦)οΎ‰

[λ°±μ€€ c++] 1105 νŒ” (μ‹€1) λ³Έλ¬Έ

CS/λ°±μ€€

[λ°±μ€€ c++] 1105 νŒ” (μ‹€1)

κ°•μ˜μ„œ 2023. 9. 25. 14:38

πŸ“Œ 문제

숫자 Lκ³Ό R이 μžˆμ„ λ•Œ, 숫자 두 개 사이에 8을 κ°€μž₯ μ΅œμ†Œλ‘œ κ°€μ§€λŠ” 숫자의 8의 개수λ₯Ό 좜λ ₯ν•˜λŠ” λ¬Έμ œλ‹€.

 

λ¨Όμ € μƒκ°λ‚˜λŠ” 방법은 LλΆ€ν„° RκΉŒμ§€μ˜ μˆ«μžλ“€μ˜ 자리수λ₯Ό ν•˜λ‚˜μ”© κ΅¬ν•΄μ„œ μ΅œμ†Œ 값을 κ΅¬ν•œλ‹€κ³  생각할 μˆ˜λ„ μžˆλ‹€.

ν•˜μ§€λ§Œ λͺ…심할 점은 ꡳ이 μš°λ¦¬κ°€ ν•˜λ‚˜μ”© 확인할 ν•„μš”κ°€ 없이 생각 ν•˜λ‚˜λ‘œ λ°”κΏ€ 수 μžˆλ‹€λŠ” 점이닀.

 

첫번째, Lκ³Ό R의 μžλ¦¬μˆ˜μ—μ„œ λΆ„λͺ…νžˆ κ³΅ν†΅λœ 뢀뢄이 μžˆμ„ 것이닀. 

κ³΅ν†΅λœ μžλ¦¬μˆ˜μ— μžˆλŠ” 8의 κ°œμˆ˜λŠ” Lκ³Ό R의 사이에 μžˆλŠ” μˆ«μžλ“€λ„ 무쑰건 가지기 λ•Œλ¬Έμ— μ•žμœΌλ‘œ μ…€ ν•„μš”κ°€ μ—†λ‹€λŠ” 것.

 

λ‘λ²ˆμž¬, μš°λ¦¬λŠ” 8μ΄λΌλŠ” 숫자λ₯Ό μ“°λŠ” 것을 ν”Όν•˜λŠ” 것이닀.

κ·ΈλŸ¬λ―€λ‘œ Lκ³Ό Rμ‚¬μ΄μ˜ 숫자 사이에 8 μ΄μ—μ™Έμ˜ 자리수λ₯Ό κ°€μ§€λŠ” μˆ«μžκ°€ λΆ„λͺ…νžˆ μ‘΄μž¬ν•œλ‹€λ©΄ ꡳ이 8을 μ“Έ ν•„μš”κ°€ μ—†λ‹€λŠ” 것이닀. 

이런 점을 κ³ λ €ν–ˆμ„ λ•Œ Brute Force둜 κ³„μ‚°ν•˜μ§€ μ•Šκ³  μ΅œμ†Œ 값을 ꡬ할 수 μžˆλ‹€.

 

[사담]

개인적으둜 싀버1 λ‚œμ΄λ„ 치고 μ‰¬μš΄ νŽΈμ΄λ‹€... 

μ½”λ”©ν…ŒμŠ€νŠΈμ—λ„ 이런 λ¬Έμ œκ°€ λ‚˜μ™”μœΌλ©΄ ν•˜μ§€λ§Œ ν•œ λ²ˆλ„ 그런 적은 μ—†μ—ˆλ‹€.....γ…Ž...^^

μš”μ¦˜ μΆ”μ„Έκ°€ λ‹€ κ΅¬ν˜„, DFS, BFS 이μͺ½μ΄ 많이 λ‚˜μ™€μ„œ..γ… 

μ΄λ ‡κ²Œ 머리 κ΅΄λ €μ„œ ν‘ΈλŠ” 문제(?)λŠ” μ—†μ• λŠ” μΆ”μ„Έλ‹€. λ‘˜λ‹€ λΉ‘μ„ΈκΈ° λ•Œλ¬Έμ—....

 

πŸ’» μ •λ‹΅ μ½”λ“œ

#include <iostream>

using namespace std;

int main()
{
    int L, R; cin >> L >> R;
    
    
    //8의 μ΅œμ†Œκ°’μΈ 문제.
    //κ²°κ΅­ λ‚΄κ°€ 8을 μ–΄μ©”μˆ˜ 없이 ν’ˆμ–΄μ•Όν•˜λŠ” κ²½μš°λŠ” 
    //두 개의 숫자 사이에 κ³΅ν†΅λœ μˆ«μžκ°€ 될 κ²½μš°μž„.
    //νŠΉνžˆλ‚˜
    
    int lowNum[10];
    int highNum[10];
    
    //숫자 μͺΌκ°œκΈ°
    int low = L;
    int Lidx = 0;
    
    while(low != 0){
        //κ°€μž₯ μ•„λž˜ 자리수λ₯Ό 배열에 μ €μž₯
        lowNum[Lidx++] = low % 10;
        low /= 10;
    }
    
    int high = R;
    int Ridx = 0;
    
    while(high != 0){
        //κ°€μž₯ μ•„λž˜ 자리수λ₯Ό 배열에 μ €μž₯
        highNum[Ridx++] = high % 10;
        high /= 10;
    }
    
    //λ‘˜μ΄ μžλ¦¬μˆ˜κ°€ λ‹€λ₯Ό 경우, 무쑰건 0
    if(Lidx != Ridx){
        cout << 0 << endl;
        return 0;
    }
    
    int max = Lidx;
    
    int cnt = 0;
    
    //같은 μˆ«μžκ°€ λͺ‡ κ°œμΈμ§€ 확인
    for(int i = max - 1; i >=0 ; i--){
        
        //μˆ«μžκ°€ 같을 경우
        if(lowNum[i] == highNum[i]){
            
            // κ·Έ μˆ«μžκ°€ 8일 경우
            if(lowNum[i] == 8) cnt++;
        }
        
        //아닐 κ²½μš°λŠ” λ³Ό ν•„μš”λ„ 없이 패슀
        else break;
    }
    
    cout << cnt << endl;
    
    return 0;
}