본문 바로가기
PS 문제 풀이/HackerRank

[HackerRank] Strange Counter

by 까망 하르방 2021. 2. 18.
반응형

출처: https://www.hackerrank.com/challenges/strange-code/problem

시간의 경과와 달리 특정 규칙에 따라 숫자를 세고 있다.

[Counter Count]를 그대로 구현하는 주먹구구 방식은 시간을 만족하지 못한다.

각 Cycle의 시작시간과 끝시간은 다음과 같다.

(1) 1~3  차이 3

(2) 4~9  차이 6

(3) 10~21  차이 12

→ 차이는 진행되는 cycle이 2배씩 된다.

→ (해당 Cycle의) 시작 시간은 초기값 1부터 '차이'가 더해진 값이며

→ (해당 Cycle의) 종료 시간은 시작시간에서 '차이'가 더해진 값이다.

이를 수식적으로 계산하면 보다 빠르게 계산할 수 있다.  

※ Test Case 중에 t가 int 범위를 벗어나는 것이 있어서 Long 타입 이용.


import java.util.Scanner;
 
public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         
        Long t = sc.nextLong();
         
        // 초기값 3을 설정
        Long cc = 3L;
        Long s_t = 0L;
        Long e_t = s_t + cc;
         
        // 어느 cycle에 해당 되는지 탐색
        // 해당 cycle을 시작시작과 끝 시간을 도출
        while(true) {
            if(s_t + 1 <= t && t <= e_t) {
                break;
            }
             
            s_t = s_t + cc;
            // 다음 cycle에서는 counter count 2배로 계산
            cc = cc * 2;
            e_t = s_t + cc;
        }
         
        // 위에서 도출한 시작시간과 counter count를 이용해 계산
        System.out.println(cc - (t - (s_t + 1)));
    }
}

 

 

반응형

'PS 문제 풀이 > HackerRank' 카테고리의 다른 글

[HackerRank] Queen's Attack II  (2) 2021.02.18
[HackerRank] The Bomberman Game  (0) 2021.02.18
[HackerRank] Cavity Map  (0) 2021.02.18
[HackerRank] 3D Surface Area  (0) 2021.02.18
[HackerRank] Repeated String (Java)  (0) 2021.02.14

댓글