코딩테스트/BOJ

[BOJ] 19637 IF문 좀 대신 써줘 - JAVA

5월._. 2023. 3. 8.
728x90

1. 문제

 

19637번: IF문 좀 대신 써줘

첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭

www.acmicpc.net

게임 개발자인 밀리는 전투력 시스템을 만들어, 캐릭터가 가진 전투력을 기준으로 칭호를 붙여주려고 한다.

예를 들어, 전투력 10,000 이하의 캐릭터는 WEAK, 10,000 초과 그리고 100,000 이하의 캐릭터는 NORMAL, 100,000 초과 그리고 1,000,000 이하의 캐릭터는 STRONG 칭호를 붙여준다고 하자. 이를 IF문으로 작성한다면 아래와 같이 구현할 수 있다.

if power <= 10000
 print WEAK
else if power <= 100000
 print NORMAL
else if power <= 1000000
 print STRONG

혼자서 게임을 개발하느라 매우 바쁜 밀리를 대신해서, 캐릭터의 전투력에 맞는 칭호를 출력하는 프로그램을 작성하자.


2. 풀이

ArrayList로 점수와 이름을 각각 관리한다.

만약 이전 점수와 현재 입력되는 점수가 동일하다면 저장하지 않는다.

 

출력해야되는 점수를 하나씩 입력받으면서 Collections.binarySearch()메서드를 활용해 인덱스를 구한다.

list에 요소가 있다면 idx>=0이고, 없으면 idx=-(넣어야할 곳)-1이다. 따라서 idx<0일때 idx = -idx-1을 해서 원래 들어갈 자리가 어딘지 계산한다.

같은 위치의 names와 scores값은 짝을 이루므로 scores에서 구한 idx위치에서 name값을 가져온다.

import java.io.*;
import java.util.*;

public class BOJ_19637_IF문좀대신써줘 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(in.readLine());
      int N = Integer.parseInt(st.nextToken());
      int M = Integer.parseInt(st.nextToken());

      List<String> names = new ArrayList<>();
      List<Integer> scores = new ArrayList<>();

      String name;
      int score;
      for(int i=0;i<N;i++){
         st = new StringTokenizer(in.readLine());
         name = st.nextToken();
         score = Integer.parseInt(st.nextToken());
         if(scores.size()>0 && scores.get(scores.size()-1)==score) continue;
         names.add(name);
         scores.add(score);
      }

      //출력하기
      StringBuilder sb = new StringBuilder();
      int input,idx;
      for(int i=0;i<M;i++){
         input = Integer.parseInt(in.readLine());
         idx = Collections.binarySearch(scores,input);
         if(idx<0) idx = -idx-1;
         sb.append(names.get(idx)).append('\n');
      }

      System.out.print(sb);
   }
}

3. 결과

'비내림차순'이라는 말이 마구잡이로 입력된다는 말인 줄 알고 괜히 map써서 key값 정렬했다..

하지만 지금 생각해도 왜 안됐는지 모르겠다..

list를 keyset요소로 넣고 정렬한 다음 똑같이 이분탐색을 이용해 idx를 구했다. 그 다음 map.get(list.get(idx))했는데 대체 왜 outofbounds가 나온걸까?ㅠㅠ 문제에는 칭호가 없는 입력이 주어지지 않는다고 해서 쓴거라 의문이다.!

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 2407 조합 - JAVA  (0) 2023.03.10
[BOJ] 20300 서강근육맨 - JAVA  (0) 2023.03.09
[BOJ] 20310 타노스 - JAVA  (0) 2023.03.06
[BOJ] 3473 교수가 된 현우 - JAVA  (0) 2023.03.05
[BOJ] 9935 문자열 폭발 - JAVA  (0) 2023.03.04

댓글