백준 1371 java-Scanner의 hasNext() 이해(더 이상 입력이 없을 때 멈추는)와 HashMap과 TreeMap

byeol·2023년 1월 3일
0

이 문제는 단계적으로 해결하는 방법으로 정리해보려고 한다.

  1. 런타임에러 중 NoSuchElement 이다.


존재하지 않은 것을 가져오려고 할 때 발생하는데 아래 코드의 경우

Scanner kb = new Scanner(System.in);
     ArrayList<String> list = new ArrayList<>();
     while(true){
          String x = kb.nextLine();
          x=x.replace(" ", "");
          if(x==null || x.isEmpty() ) break;
          list.add(x);
       }

위에서 발생한다.
문제가 EOF가 선언되기 전까지는 계속 입력을 받는 조건인데
나는 공백이거나 null인 경우에 while문을 벗어나도록 설정해놓았다.
문제의 조건과 다르다.

import java.util.*;

class Main{			
  public static String solution(ArrayList<String> list ){
    HashMap<Character, Integer> map  = new HashMap<>();
    int max = Integer.MIN_VALUE;
    String answer="";
    for(int i=0;i<list.size(); i++){
        for(int j=0;j<list.get(i).length();j++){
               map.put(list.get(i).charAt(j),map.getOrDefault(list.get(i).charAt(j),0)+1);
        }   
      }
     Collection<Integer> values = map.values();
     Iterator<Integer> it= values.iterator();
     while(it.hasNext()){
           Integer value = it.next();
           if(max<value) max = value;
     }
     
     Iterator<Character> iit =map.keySet().iterator();
     while(iit.hasNext()){
           Character key = iit.next();
           Integer value = map.get(key);
           if(value==max)  answer+=String.valueOf(key);
        }  
      return answer;
  }


  public static void main(String[] args){
     Scanner kb = new Scanner(System.in);
     ArrayList<String> list = new ArrayList<>();
     while(true){
          String x = kb.nextLine();
          x=x.replace(" ", "");
          if(x==null || x.isEmpty() ) break;
          list.add(x);
       }
      System.out.println(solution(list));
  }
}

💡 따라서 Scanner의 hasNext()메소드를 이용하기로 한다.
hasNext()는 while문 body에 입력값이 있으면 true 없으면 false를 반환한다.
window의 경우 Ctrl+Z를 콘솔창에 입력하면 EOF로 간주하기 때문에
Ctrl+Z로 EOF를 간접적으로 선언한다.

  1. 출력 조건 중에 "여러 개일 경우에는 알파벳 순으로 앞서는 것부터 모두 공백없이 출력한다."가 있다.
    나의 경우 각 알파벳들을 HashMap에 넣었는데 HashMap은 key들의 알파벳 정렬을 보장하지 않는다.

    그걸 몰라서 여러 시간 방황하다가 질문게시판에 질문을 남겼다.
    정말 감사하다.
    TreeMap으로 선언해야 정렬을 보장한다.
    아주 기초적인 부분을 잊어버리고 문제를 푼 것이다.
    부끄러웠다.

import java.util.*;

class Main{			
  public static String solution(ArrayList<String> list ){
    HashMap<Character, Integer> map  = new HashMap<>();
    int max = Integer.MIN_VALUE;
    String answer="";
    
    //2. list의 인덱스 별 값을 읽고 
    for(int i=0;i<list.size(); i++){
        //그 값인 String을 문자로 접근해서 HashMap에 넣기
        for(int j=0;j<list.get(i).length();j++){
               map.put(list.get(i).charAt(j),map.getOrDefault(list.get(i).charAt(j),0)+1);
        }   
      }
     
     // 3. HashMap에 저장된 문자별 누적값 중 가장 큰 값을 구하기
     Collection<Integer> values = map.values();
     Iterator<Integer> it= values.iterator();
     while(it.hasNext()){
           Integer value = it.next();
           if(max<value) max = value;
     }
     
      // 4. 앞서 구한 가장 큰 누적값을 가지고 있는 key값을 answer에 추가하기
     Iterator<Character> iit =map.keySet().iterator();
     while(iit.hasNext()){
           Character key = iit.next();
           Integer value = map.get(key);
           if(value==max)  answer+=String.valueOf(key);
        }  
      
      return answer;
  }


  public static void main(String[] args){
     Scanner kb = new Scanner(System.in);
     ArrayList<String> list = new ArrayList<>();
     
     //1. EOF가 될 때까지 값 입력받기 
     while(kb.hasNextLine()){
          String x = kb.nextLine();
          list.add(x.replace(" ","")); //HashMap에서 " "도 글자로 새기 때문에 제거하여 list에 담기
       }
      System.out.println(solution(list));
      kb.close();
  }
}

💡 따라서 TreeMap으로 문제를 푸니 정답이 나왔다.

  1. 하지만 이보다 더 사람들이 많이 사용하는 방법이 있었다.
import java.util.*;

class Main{			
  public static String solution(ArrayList<String> list ){
         
        int[] arr = new int[26];
        String answer="";        

        for(int i=0;i<list.size();i++){
            for(int j=0;j<list.get(i).length();j++){
                   arr[list.get(i).charAt(j)-97]+=1;
              }
         }
        int max = Arrays.stream(arr).max().getAsInt();
        for(int i=0;i<arr.length;i++){
         if(arr[i]==max){
               answer+=Character.toString((char)(i+97));  
            } 
         }
        
        return answer;
      
  }


  public static void main(String[] args){
     Scanner kb = new Scanner(System.in);
     ArrayList<String> list = new ArrayList<>();
     
     //1. EOF가 될 때까지 값 입력받기 
     while(kb.hasNextLine()){
          String x = kb.nextLine();
          list.add(x.replace(" ","")); //HashMap에서 " "도 글자로 새기 때문에 제거하여 list에 담기
       }
      System.out.println(solution(list));
      kb.close();
  }
}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글