로봇이 되고픈 부엉이

(C 언어) 프로젝트 : 채널 돌리기 본문

대학생의 그쩍거림/C 언어

(C 언어) 프로젝트 : 채널 돌리기

탈모탈모대작전 2019. 6. 25. 09:34
반응형

문제1

빈수는 테레비를 보고 있다.

리모콘이 고장나버렸다.

원하는 버튼으로 가기 위해

1. 원하는 버튼으로 부터 가장 가까운 번호를 찾는다.

2. 거기로 부터 +또는 -하여 원하는 버튼으로 접근한다.

현재 채널이 100일 때, 다음 입력을 받고 문제를 해결해보자.

출처 : 한국외대 바이오메디컬공학과 컴퓨터개론 및 실습

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

#define NOW 100
int main() {
	printf("채널 입력 : "); int New_channel; scanf("%d", &New_channel);
	printf("고장난 버튼의 개수 입력 : "); int num_Broken; scanf("%d", &num_Broken);
	getc(stdin); printf("고장난 버튼 입력 : "); char Broken[21]; gets(Broken);

	//printf("%d %d %s\n", New_channel, num_Broken, Broken);
	int min = 0;

	if (num_Broken == 0) {
		printf("버튼 누르는 최소 횟수 : %d",(int)log10(New_channel)+1);
		return 0;
	}


	if (NOW == New_channel) {
		min = 0;
	}
	else {
		if (abs(NOW - New_channel) < (log10(New_channel) + 1))
		{
			min = abs(NOW - New_channel);
		}
		else {
			int up = New_channel, down = New_channel;
			char UP[7] = "\0", DOWN[7] = "\0";
			while (1) {
				up++, down--;
				sprintf(UP, "%d", up); sprintf(DOWN, "%d", down);
				int U = 0, D = 0;
				for (int i = 0; i < strlen(UP); i++) {
					for (int j = 0; j < num_Broken; j++) {
						if (UP[i] == Broken[2 * j]) {
							U = 1; break;
						}
					}
					if (U == 1) {
						break;
					}
				}
				for (int i = 0; i < strlen(DOWN); i++) {
					for (int j = 0; j < num_Broken; j++) {
						if (DOWN[i] == Broken[2 * j]) {
							D = 1; break;
						}
					}
					if (D == 1) {
						break;
					}
				}
				if (U == 0) {
					min = abs(New_channel - up) + strlen(UP);
					break;
				}
				if (D == 0) {
					min = abs(New_channel - down) + strlen(DOWN);
					break;
				}
			}
		}
	}
	
	printf("버튼 누르는 최소 횟수 : %d", min);
	return 0;
}
반응형