본문 바로가기
Java

자바 임의 값 0~100 랭크 구하기

by NaHyungMin 2021. 9. 16.

거의 1년만에 OKKY 사이트에 들어가봤더니 이런 링크가 있었다.

 

https://okky.kr/article/1052166

 

OKKY | 이 문제 어떻게 푸는게 맞는걸까요? (손코딩 간단한 문제)

오늘 경력직 면접 손코딩 시험 보면서 나온 문제 중 하나인데 솔직히 코딩테스트 봐본게 4년 전이고.. 기억도 안나구.. 일했던게 IT기업도 아니구.. 그래서 그냥 풀이 자체만 신경썼는데 어떤 메

okky.kr

 

그래서... 그냥 한 40분정도 나라면 어떻게 만들까 하다가 생각해봤다. 그러다 고민되는 룰이 하나 생김.

Sql에도 존재하듯 동일한 점수면 어떻게 할 것인가? 대충 100점이 2명일 때 99점이면 이건 3등으로 처리하자라고 생각함.

 

  private static final ArrayList<ArrayList<Integer>> rankArrayList = new ArrayList<>();
  private static int perfectRankCount = 0;
  private static final int perfectRank = 100;
  private static final int numberMaxCount = 10;
  private static final int arrayRankCount = (perfectRank / numberMaxCount);

  public static void main(String[] args) {
    perfectRankCount = 0;
    
    //보통은 반환값으로 받는게 더 좋긴한데. 테스트니깐 안에서 배열 초기화를 한다.
    makeRankArray();
    final int testRankCount = 100;
    Random random = new Random();

    for(int i = 0; i < testRankCount; i++) {
      //0 ~ 100점
      int randomRank = random.nextInt(perfectRank + 1);
      rank(randomRank);
    }

    System.out.println("Hello World");
  }

  private static void makeRankArray() {
    rankArrayList.clear();

    for(int i = 0; i < arrayRankCount; i++) {
      ArrayList<Integer> rankArray = new ArrayList<>();

      for(int j = 0; j < numberMaxCount; j++) {
        rankArray.add(0);
      }

      rankArrayList.add(rankArray);
    }
  }

  private static int rank(int randomRank) {
    int resultRank = 1;

    if(perfectRank > randomRank) {
      int arrayListIndex = randomRank / numberMaxCount;
      int arrayIndex = randomRank - (arrayListIndex * 10);

      //자신의 위치 카운트 증가
      rankArrayList.get(arrayListIndex).set(arrayIndex, rankArrayList.get(arrayListIndex).get(arrayIndex) + 1);

      int firstRank = 0;

      //자신의 위치 카운트
      for(int i = arrayIndex + 1; i < numberMaxCount; i++) {
        firstRank = firstRank + rankArrayList.get(arrayListIndex).get(i);
      }

      //자기 상위 위치 카운트
      for(int i = arrayListIndex + 1; i < rankArrayList.size(); i++) {
        for(int j = 0; j < numberMaxCount; j++) {
          firstRank = firstRank + rankArrayList.get(i).get(j);
        }
      }

      resultRank = firstRank + perfectRankCount + 1;
    } else {
      perfectRankCount++;
    }

    System.out.println("점수 : " + randomRank + " 랭크 : " + resultRank);
    return resultRank;
  }

 

전역 변수로 만든건 자주 사용된다면 그냥 메모리에 상주해놓는게 이득이라고 생각했다.

만약 자주 사용되지 않는 함수라면 그냥 지역변수로 만드는게 이득

원래 코드를 짜면 다른 클래스에서 getter를 통해 가져오도록 구현해서 가독성을 더 올렸을 듯하다.

 

맨날 알고리즘 공부도 안하고 ㅜ.ㅜ 언어도 코틀린 + 자바 + C#을 여러개 생각하며 하니깐... 코딩 테스트도 못 한다.

 

'Java' 카테고리의 다른 글

자바 비밀번호 생성(금융보안원)  (1) 2022.05.10
자바 프로그래머스 위클리 챌린지 8주차  (0) 2021.10.01
자바 랜덤키  (0) 2021.05.13
자바 Json Parser  (0) 2021.02.22
자바 Log Class  (0) 2021.02.22