[HackerRank] Strange Counter

아르당·2023년 12월 14일
0

HackerRank

목록 보기
46/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

이상한 카운터가 있다. 첫 번째 초에 숫자 3이 나타난다. 각 초마다 숫자는 1씩 1이 될때까지 감소한다. 다음 초에는 이전 주기의 2배로 재설정되고 계속 카운트 다운을 한다.
카운터가 시간 t에 표시하는 값을 찾고 출력해라.

Function Description

strangeCounter 함수를 완성해라.
strangeCounter 함수는 아래와 같은 매개변수를 가지고 있다.

  • int t: 정수

Returns

  • int: 시간 t에 표시되는 값

Constraints

  • 1 <= t <= 10^12

풀이

t가 어떤 범위에 있는지 찾고 해당 범위에서 계산하면 쉽게 풀 수 있다.
시작값과 현재값을 담아둘 init과 time 변수를 선언하고 각각 1과 3을 할당한다. 이때 타입은 long으로 한다. t의 범위가 int의 범위를 넘기 때문이다.

long init = 1;
long time = 3;

while문을 통해 init과 time을 계산한다.

while(t > time + init - 1){
	init += time; // 다음 주기의 시작 초를 구한다.
    time *= 2;    // 다음 주기의 시작 값을 구한다.
}

그리고 주기의 시작 값 time에서 t와 시작 초의 값 init을 뺀 값을 반환한다.

return time - t - init;

전체 코드

public static long strangeCounter(long t) {
	long init = 1;
	long time = 3;

	while(t > time + init - 1){
		init += time;
		time *= 2;
	}

	return time - t - init;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글