본문 바로가기

알고리즘

[알고리즘] (구현) 시간.cpp (from 이코테)

문제

정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어 있으므로 세어야 하는 시각이다.
00시 00분 03초
00시 13분 30초

반면에 다음은 3이 하나도 포함되어 있지 않으므로 세면 안 되는 시각이다.
00시 02분 55초
01시 27분 45초

입력

첫째 줄에 정수 N이 입력된다. (0 <= N <= 23)

출력

00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다.

IDEA

클래스를 이용해서 문제를 풀어보기로 했다. 클래스의 멤버 변수로 '시', '분', '초'를 만들고, 60이 될때마다 0으로 초기화 하며 상위 개념이 1 상승하도록 만들어 봤다.

배운것

#include <string>

std::string  to_string(int n)
to_string()함수는 c++에서 정수를 문자열로 변환해주는 함수로서 매우 유용하다.

느낀점

사실 이렇게까지 장황하게 풀지 않아도 될것 같은 문제였지만, 지금 42서울에서 c++의 클래스에 대한 과제를 진행 하고 있어, 클래스에 조금더 익숙해져 보고자 이렇게 구현해 봤다. 또한 반순 반복문의 중첩으로만 풀었을때에 비해 가독성이 좋고, 디버깅을 할때 어디에 문제가 생기는지 보기 쉬운것 같았다.

 

 

 

#include <iostream>
#include <string>

class time
{
	public:
			time(void);
			std::string getter(void);
			void increase_hour(void);
			void increase_min(void);
			void increase_sec(void);
	private:
			int hour;
			int min;
			int sec;
};

time::time(void)
{
	this->hour = 0;
	this->min = 0;
	this->sec = 0;
}

std::string time::getter(void)
{
	std::string str = std::to_string(hour)+std::to_string(min) +	std::to_string(sec);
	return (str);
}

void time::increase_min(void)
{
	this->min++;
	if (this->min >= 60)
	{
		this->min = 0;
		increase_hour();
	}
}

void time::increase_hour(void)
{
	this->hour++;
}

void time::increase_sec(void)
{
	this->sec++;
	if (this->sec >= 60)
	{
		this->sec = 0;
		increase_min();
	}
}

int main() {
	int n;
	std::cout << "typing" <<std::endl;
	std::cin >> n;
	class time obj;
	int cnt =0;
	bool flag = false;

	std::string target = std::to_string(n) + "59"+"59";
	std::string now;
	while (1)
		{
			flag = false;
			now = obj.getter();
			if (now == target)
				break;
			for (int i=0;i<now.size();i++)
				{
			if (now[i] =='3')
				flag = true;
				//cnt++;
				}
			if (flag == true)
				cnt++;
			obj.increase_sec();
		}
	std::cout << cnt;
}