새소식

💻 Computer/🐘 Algorithm

[1107] 리모컨 - C++

  • -

브루트 포스로 문제를 풀어야겠다는 생각 조차 하지 못했다.


풀이

수빈이는 현재 100번 채널에 있다.


부서진 리모컨 입력 받기

부서진 리모컨의 번호를 bool 배열로 표시한다.

bool breakDown[11];

//부서진 번호 입력
for(int i = 0; i < m; ++i){
    int num;
    cin >> num;
    breakDown[num] = true;
  }

초기 최솟값 설정

최소 이동을 표현하기 위한 minimum 변수를 만드며, 초기값은 abs(n-100)

int minimum = abs(n-100);

위처럼 구현한 이유는?

만약 n 이 100보다 작을 수 있기 때문에

예) n = 10, mnimum = 90, 현재로서 최솟값은 90번 ( - ) 버튼을 눌러야 10에 도달할 수 있다.


연산 로직

////부서진 번호가 있는지 확인하는 함수 check
bool check(int num){
//문자열로 변환후 연산
  string st = to_string(num);
  for(int i = 0; i < st.length(); ++i)
    if(breakDown[st[i]-'0']) return false;
  return true;
}


//연산 로직
for(int i = 0; i <= 1'000'000; ++i){
    int tmp = 0;
    if(check(i)){
       tmp = abs(n-i)+to_string(i).length();
       minimum = min(minimum, tmp);
    }
  }

어째서 500'000이 아니라 1'000'000 일까?

예) n = 500'000, i = 500'001, n - i = 1, 500'001과 같이 ( - ) 한 번만 누르면 되는 경우도 있기 때문이다.


전체 코드

#include <bits/stdc++.h>

using namespace std;
void init(){
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
}

int n, m;
bool breakDown[11];

//부서진 번호가 있는지 확인하는 함수 check
bool check(int num){
  string st = to_string(num);
  for(int i = 0; i < st.length(); ++i)
    if(breakDown[st[i]-'0']) return false;
  return true;
}

int main(){
  init();
  cin >> n >> m;
  //입력
  for(int i = 0; i < m; ++i){
    int num;
    cin >> num;
    breakDown[num] = true;
  }
  //초기값 설정
  int minimum = abs(n-100);
  //연산 로직
  for(int i = 0; i <= 1'000'000; ++i){
    int tmp = 0;
    if(check(i)){
       tmp = abs(n-i)+to_string(i).length();
       minimum = min(minimum, tmp);
    }
  }
  cout << minimum <<'\n';
  return 0;
}

문제를 풀며

나에게는 감도 잡지 못할 정도로 어려운 문제였다. 새로운 아이디어를 얻은 것 같다

abs(n-100)과 같이 초기값을 설정할 생각을 어떻게 한 걸까

( - )를 누를 경우도 생각해 1'000'000까지 반복문을 돌리는 것 또한 그렇다.

이렇듯 배우고자 한다면 문제 하나에서도 여러 가지 아이디어를 얻을 수 있음을 기억하자

 

요즘 나 혼자 라이벌이라 생각하는 친구가 정말 열심히 하는데, 나도 뒤떨어지고 싶지 않아 괜스레 열심히 하게 된다.

기억하자 라이벌은 함께 가는 동료이며, 친구다.

지나친 승부욕은 오히려 나를 죽인다.

'💻 Computer > 🐘 Algorithm' 카테고리의 다른 글

[9251]LCS - C++  (0) 2023.06.23
[2294] 동전 2 - C++  (0) 2023.06.22
[2293] 동전 1 - C++  (0) 2023.06.21
[1018] 체스판 다시 칠하기 - C++  (0) 2023.06.19
[11502] 카드 구매하기 - c++  (0) 2023.06.19
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.