ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1157] 단어 공부
    자바/백준 2023. 7. 20. 22:39

    [Java]

    문제 링크: https://www.acmicpc.net/problem/1157

     

    입력된 단어에서 가장많이 입력된 알파벳을 대문자로 출력하는 문제로 처음에는 set을 활용해 알파벳별 count를 확인할라 했으나 런타임오류로 해당 풀이는 포기했습니다. 풀이1_런타임오류 설명 후 성공한 풀이2를 기재하였으니 참고 부탁 드립니다.

     

    [풀이1_런타임오류]

    import java.util.Scanner;
    import java.util.Set;
    import java.util.ArrayList;
    import java.util.HashSet;
    
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int max = 0;
    		int cnt = 0;
    		char chr=' ';
    		String str = sc.next();
    		Set<String> strSet = new HashSet<String>();
    		for(int i=0; i<str.length(); i++) {
    			strSet.add(String.valueOf(Character.toUpperCase(str.charAt(i))));
    		}
    		ArrayList<String> strList = new ArrayList<String>(strSet);
    		
    		int[] iArr = new int[strList.size()];
    		for(int i = 0; i<str.length(); i++) {
    			for(int j = 0; j<strList.size(); j++) {
    				if(String.valueOf(Character.toUpperCase(str.charAt(i))).equals(strList.get(j))) {
    					iArr[j]++;
    					if(max<iArr[j]) {
    						max=iArr[j];
    						chr=strList.get(j).charAt(0);
    					}
    				}
    			}
    		}
    		for(int i = 0; i<strList.size();i++) {
    			if(max==iArr[i]) cnt++;
    		}
    		if(cnt>1) System.out.println("?");
    		else System.out.println(chr);
    	}
    
    }
    1. set을 사용하여 입력된 단어를 중복없는 알파벳(Character.toUpperCase를 통해 대문자로 변환)으로 표현
    2. 중복 제거된 set을 ArrayList 형태로 변환(이때부터 앞으로의 비효율적인 코드가 그려져서 멈출까 고민했습니다..)
    3. ArrayList size 만큼의 int[] 배열을 생성
    4. 이중 for문을 이용하여 입력된 문자 한 글자마다 ArrayList에 몇 번째 알파벳과 일치하는지 확인 후, int[]에 1씩 더했습니다.(왕비효율적) - 이 부분에서 런타임오류가 발생했을 거라 생각해 이후 설명은 생략하겠습니다.

    [풀이2]

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		
    		String str = sc.next();
    		int[] num = new int[26];
    		
    		for(int i = 0; i<str.length(); i++) {
    			num[Character.toUpperCase(str.charAt(i))-'A']++;
    		}
    		
    		int max=0;
    		int maxIndex=0;
    		int cnt=0;
    		for(int i=0; i<num.length; i++) {
    			if(max<num[i]) {
    				max=num[i];
    				maxIndex=i;
    				cnt=0;
    			}
    			if(String.valueOf(num[i]).equals(String.valueOf(num[maxIndex])) && max!=0) {
    				cnt++;
    			}
    		}
    		
    		if(cnt>1) {
    			System.out.println("?");
    		}
    		else System.out.println((char) (maxIndex+'A'));
    
    	}
    
    }

    혹시 궁금하신 점 있으신 경우 편하게 말씀 부탁 드립니다.

     

    '자바 > 백준' 카테고리의 다른 글

    [1158] 요세푸스 문제  (0) 2023.08.03
    [10828] 스택  (0) 2023.07.22
    [1834] 나머지와 몫이 같은 수  (0) 2023.07.19
    [1568] 새  (2) 2023.07.17
    [1568] 공  (0) 2023.07.17
Designed by Tistory.