본문 바로가기
컴퓨터공학/알고리즘

[백준,C++] 1107 : 리모컨

by Tonny Kang 2024. 2. 20.
반응형

문제

수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.

수빈이가 지금 보고 있는 채널은 100번이다.

입력

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.

출력

첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.

 

예제 입력 1 복사

5457
3
6 7 8

예제 출력 1 복사

6

예제 입력 2 복사

100
5
0 1 2 3 4

예제 출력 2 복사

0

예제 입력 3 복사

500000
8
0 2 3 4 6 7 8 9

예제 출력 3 복사

11117

예제 입력 4 복사

100
3
1 0 5

예제 출력 4 복사

0

예제 입력 5 복사

14124
0

예제 출력 5 복사

5

예제 입력 6 복사

1
9
1 2 3 4 5 6 7 8 9

예제 출력 6 복사

2

예제 입력 7 복사

80000
2
8 9

예제 출력 7 복사

2228

힌트

예제 1의 경우 5455++ 또는 5459--

 

처음 알고리즘은

내가 가려하는 채널의 앞자리 수 부터 따져서

젤 앞자리 수가 고장난 버튼이면 

(그 수 -  1)99999... [9가 고장나면 8...]

(그 수 + 1)00000... [0이 고장나면 1..]

이런식으로 거리 가까운거 계산하려했는데

코드 짜다 머리 터질뻔했다

 

결국 이 문제는 브루트 포스 문제였다

vector <int> buttons(10,1);

 

이렇게 버튼의 작동 여부를 작동하면 1로 해주고

for (int i = 0; i < m; i++) {
		int d;
		cin >> d;
		buttons[d] = 0;
	}

 

고장 난 버튼들을 입력받아

0으로 바꿔준다

 

그리고 0부터 1000000까지 모든 채널이 이동 가능한지 불가능한지 판단해

최소값을 찾는다

 

가능한지 판단은

그 채널의 고장난 버튼이 한개라도 있으면 불가능 하다

bool is_possible(int num) {
	while(num){
		if(!buttons[num%10]){
        	return false;
        }
    }
	return true;
}

그래서 가능한지 불가능한지를 판별해주는 함수를 만들어서 평가해준다

int temp = abs(n - i) + to_string(i).size();//자릿수를 더해줘 버튼 누르는 횟수를 계산
			ans = min(ans, temp);

 

이렇게 우리가 원하는 채널로의 최소 버튼 수를 구해서 return한다 

그리고 마지막

그냥 100에서 그냥 움직이는게 더 나은지 비교한다\

 

그래서 최종 코드는

 

#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<string>

using namespace std;

int n;
int m;
vector <int> buttons(10,1);

bool isPossible(int num) {
	while(num){
		if(!buttons[num%10]){
        	return false;
        }
    }
	return true;
}

int main(void) {

	int ans = 0;

	cin >> n;
	cin >> m;

	for (int i = 0; i < m; i++) {
		int d;
		cin >> d;
		buttons[d] = 0;
	}

	if (n == 100) {
		cout << 0;
		return 0;
	}

	ans = abs(n - 100);

	for (int i = 0; i <= 1000000; i++) {
		if (isPossible(i)) {
			int temp = abs(n - i) + to_string(i).size();//자릿수를 더해줘 버튼 누르는 횟수를 계산
			ans = min(ans, temp);
		}
	}

	cout << ans;

	return 0;
}

 

<백준,C++ 1074 : Z>

https://tonnykang.tistory.com/116

 

[백준,C++] 1074번 : Z

문제 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배

tonnykang.tistory.com

 

반응형

'컴퓨터공학 > 알고리즘' 카테고리의 다른 글

[백준/C++] 1541: 잃어버린 괄호  (55) 2024.02.27
[백준,C++] 1463번: 1로 만들기  (58) 2024.02.26
[백준,C++] 1074번 : Z  (50) 2024.02.19
[백준/C++] 1654 : 랜선 자르기  (48) 2024.02.14
[백준,C++] 10989 : 수 정렬하기 3  (49) 2024.02.13