본문 바로가기

Dev/BAEKJOON 백준

[백준/BOJ] 백준 코딩 알고리즘 1107번/C++

728x90
반응형

 

백준 코딩 알고리즘 문제 1107

 

 

백준 코딩 알고리즘 문제 1107번 풀이 - 사용 언어: C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
 
using namespace std;
 
int remocon[10= { 1111111111 };
 
int main() {
 
    int N, M;
 
    //목표 채널을 입력받음
    cin >> N;
 
    //고장난 버튼의 수를 입력받음
    cin >> M;
 
    int remoconNum;
    for (int i = 0; i < M; i++) {
        //망가진 버튼을 입력받음
        cin >> remoconNum;
        //망가진 부분의 리모콘 배열값을 0으로 만듦
        remocon[remoconNum] = 0;
    }
 
    int MIN;
 
    //기본채널100에서 ++혹은 --로만 이동하는 경우
    if (N <= 100) {
        MIN = 100 - N;
    }
    else {
        MIN = N - 100;
    }
 
    int channel; //현재 채널
    int length;
    bool flag = false//채널에 근접하게 도달하여 연산이 끝났는지 판별
 
    //수학적방법
    for (int i = 0; i <= 1000000; i++) {
        channel = i; //각 채널마다 계산
        length = 0//채널 자리수 - 즉 숫자 버튼을 누르는 횟수
        flag = false;
 
        while (true) {
            if (remocon[channel % 10]) { //버튼이 사용가능한 경우
                channel = channel / 10;
                length++;
                if (channel == 0) { //채널번호를 끝까지 숫자 버튼으로 누를 수 있는 경우
                    flag = true;
                    break;
                }
            }
            else { //버튼이 망가진경우
                break//이 채널은 버튼을 눌러서 갈 수 없으므로, 반복문을 빠져나감
            }
        }
 
        int move;
        if (flag) { //채널번호를 끝까지 숫자버튼으로 누를 수 있는 경우
            if (i > N) {
                move = i - N; // -버튼을 누르는 횟수
            }
            else {
                move = N - i; // +버튼을 누르는 횟수
            }
 
            if (length + move < MIN)
                MIN = length + move;
        }
 
    }
 
    cout << MIN;
 
    return 0;
 
}
cs

문제풀이 참고 블로그: https://kwanghyuk.tistory.com/51

 

728x90
반응형