본문 바로가기
algorithm/hackerRank

[HackerRank] Climbing the Leaderboard

by 무대포 개발자 2020. 7. 10.
728x90
반응형

1. Problem

2. Feedback

  • 주어진 점수의 랭킹이 몇 등인지 구하는 문제
  • 정렬되있다는 힌트를 보고 이진 검색을 생각했고, 랭킹을 구하기 위해 이진검색을 변형시켜서 풀었음.
  • 순위를 매기는 작업은 시간복잡도 O(n)
  • 이진검색은 n 을 1/2 씩 줄여나가니 logN
  • 총 시간복잡도는 m개의 score 의 순위를 구하는 문제이니 O(n) + O(m*logm)
  • min > max 인 부분을 체크를 못해서 시간 걸림.

3. Source


import java.util.Scanner;

public class ClimbingTheLeaderboard {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int score[] = new int[n];
        for (int i = 0; i < n; i++)
            score[i] = in.nextInt();
        int m = in.nextInt();
        int aliceScore[] = new int[m];
        for (int j = 0; j < m; j++)
            aliceScore[j] = in.nextInt();

        int result[] = solve(score, aliceScore);

        for (int k = 0; k < result.length; k++)
            System.out.println(result[k]);
    }

    public static int[] solve(int score[], int aliceScore[]) {
        int result[] = new int[aliceScore.length];

        int rank[] = new int[score.length];
        rank[0] = 1;
        int rankNum = 1;
        for (int i = 1; i < score.length; i++) {
            if (score[i - 1] == score[i])
                rank[i] = rankNum;
            else {
                rankNum++;
                rank[i] = rankNum;
            }
        }

        for (int i = 0; i < aliceScore.length; i++) {
            result[i] = binarySearch(score, rank, aliceScore[i], 0, score.length - 1);
        }
        return result;
    }

    public static int binarySearch(int score[], int rank[], int key, int min, int max) {
        if (min >= max) {
            if (key < score[min]) {
                return rank[min] + 1;
            } else if (key > score[min]) {
                if (min == 0) return 1;
                return rank[min];
            } else {
                return rank[min];
            }
        }

        int mid = (min + max) / 2;

        if (key == score[mid])
            return rank[mid];
        else if (key > score[mid])
            return binarySearch(score, rank, key, min, mid - 1);
        else if (key < score[mid])
            return binarySearch(score, rank, key, mid + 1, max);
        else
            throw new IllegalStateException("IllegalState...");
    }
}


'algorithm > hackerRank' 카테고리의 다른 글

hackerrank A Very BigSum  (0) 2020.09.13
[HackerRank] Encryption  (0) 2020.07.10
[HackkerRank] Sherlock and Anagrams  (0) 2018.10.12
[HackerRank] Minimum Swap2  (0) 2018.10.11
[HackerRank] New Year Chaos  (0) 2018.10.11

댓글