반응형

 

문제

 R관의 엘리베이터에는 1층부터 N층까지의 버튼이 있다. 장난기가 많은 셈터는 엘리베이터 버튼을 마구잡이로 눌러 장난을 하려고 한다. 그런데 멀리서 교수님이 험악한 표정으로 다가오고 있다! 빠르게 속도 계산을 한 결과, 교수님은 m초 후에 도착할 것으로 짐작된다. 셈터는 m초 동안 버튼을 있는 대로 누르고 튀어야겠다는 생각을 했다.

하지만 버튼을 아무렇게나 누르면 재미가 없으므로 다음 네 동작 규칙을 정해 놓고 따르려고 한다.

  • 동작 1) 모든 버튼을 다 누른다.
  • 동작 2) 짝수 버튼만 다 누른다.
  • 동작 3) 홀수 버튼만 다 누른다.
  • 동작 4) 1, 4, 7, ... , 3k + 1번 버튼만 다 누른다.

반드시 한 동작이 모두 끝나야 튀거나 다른 동작을 시작할 수 있다. 단, 아무것도 하지 않고 튈 수도 있다.

버튼 1개를 누르는 데는 1초가 걸린다. 버튼은 처음에는 모두 꺼져 있으며, 꺼진 버튼을 누르면 켜지고 켜진 버튼을 누르면 꺼진다. 셈터가 m초 이하의 시간 동안 버튼을 누르고 튀었을 때 교수님이 보게 될 버튼들의 상태는 몇 가지가 될 수 있는가? 단, 엘리베이터는 움직이지 않는다고 가정한다.

입력

첫째 줄에 두 정수 N (1 ≤ N ≤ 100,000), m (0 ≤ m ≤ 100,000)이 주어진다.

출력

마지막 버튼들의 상태가 될 수 있는 가짓수를 출력한다.

 

<코드>

#include<iostream>
#include<algorithm>
using namespace std;

int N, m;
int t1, t2, t3, t4;
int ans;

int main()
{
	cin >> N >> m;

	t1 = N;
	t2 = N / 2;
	t3 = (N + 1) / 2;
	t4 = (N - 1) / 3 + 1;

	// 아무것도 하지 않는다
	ans++;

	// 동작 1 (모든버튼)
	if (t1 <= m) ans++;

	// 동작 2 (짝수버튼)
	if (N > 1 && t2 <= m) ans++;

	// 동작 3 (홀수버튼)
	if (N > 1 && t3 <= m) ans++;

	// 동작 4 (3k+1버튼)
	if (N > 2 && t4 <= m) ans++;

	// 동작 2 & 동작 4 (짝수버튼 & 3k+1버튼)
	if (N >= 3 && t2 + t4 <= m) ans++;

	// 동작 3 & 동작 4 (홀수버튼 & 3k+1버튼)
	if (N >= 3 && t3 + t4 <= m) ans++;

	// 동작 1 & 동작 4 (모든버튼 & 3k+1버튼)
	if (N >= 3 && t1 + t4 <= m) ans++;

	cout << ans;
}

 

풀이 방법

 

n이 1일때는 동작1과 동작3이 같으므로 중복이 발생합니다.

그리고 동작 2와 아무것도 하지 않는것이 같으므로 중복이 발생합니다.

n이 2일때는 동작3과 동작4가 같으므로 중복이 발생합니다.

 

따라서 n이 1 또는 2일때를 주의해서 풀이를 하셔야합니다.

 

www.acmicpc.net/problem/14936

 

14936번: 엘리베이터 장난

마지막 상태는 버튼이 모두 꺼진 상태, 버튼이 모두 켜진 상태, 짝수만 켜진 상태, 홀수만 켜진 상태, 1, 4, 7, 10층이 켜진 상태, 1, 2, 6, 7, 8층이 켜진 상태, 3, 4, 5, 9, 10층이 켜진 상태로 총 7가지가

www.acmicpc.net

 

반응형

+ Recent posts