본문으로 바로가기

[level2] [1차] 뉴스 클러스터링 JAVA

category 코딩테스트/programmers 2022. 11. 16. 11:56

 

https://school.programmers.co.kr/learn/courses/30/lessons/17677

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

두 개의 문자열이 주어졌을 때 두 문자열을 2음절로 나누어 (공통부분)/(전체) 의 값을 구하는 문제이다.

내가 생각한 방법은 HashMap<String, Integer> 형식으로 첫번째 문자열을 담은 다음 두번째 문자열을 빼내어 공통부분을 구하는 식으로 생각을 했었다.

import java.util.*;

class Solution {
public int solution(String str1, String str2) {
        int answer = 0;
        
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        
        HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
        double Acnt = 0;
        double Bcnt = 0;
        double allcnt = 0;
        for(int i = 0; i < str1.length()-1; i++) {
        	String str = "";
        	if('A' <= str1.charAt(i) && 'Z' >= str1.charAt(i) && 'A' <= str1.charAt(i+1) && 'Z' >= str1.charAt(i+1)) {
        		str += str1.charAt(i);
        		str += str1.charAt(i+1);
        	 
        		Acnt++;
        		hm1.put(str, hm1.getOrDefault(str, 0)+1);
        	}
        }
        
        
        for(int i = 0; i < str2.length()-1; i++) {
        	String str = "";
        	if('A' <= str2.charAt(i) && 'Z' >= str2.charAt(i) && 'A' <= str2.charAt(i+1) && 'Z' >= str2.charAt(i+1)) {
        		str += str2.charAt(i);
        		str += str2.charAt(i+1);
        	 
        		if(hm1.containsKey(str)) {
        			Acnt--;
        			allcnt++;
        			hm1.put(str, hm1.getOrDefault(str, 0)-1);
        			if(hm1.get(str) == 0) hm1.remove(str);
        		} else {
        			Bcnt++;
        		}
        	 
        	}
        }
        
        double result = allcnt/(Acnt+allcnt+Bcnt);
      
        answer = (int)(result * 65536);
        if(answer == 0 ) answer = 65536;
        return answer;
    }
}

그런데..

정확성 부분에서 오류가 발생....

 

도대체 뭐가 문제인지 몰라서 한참을 고민했다.

답은 생각보다 간단한 곳에 있었다..

변수 선언부분을 고치니 정답... 사소한 것도 신경을 써야한다..(오늘의 교훈)

public int solution(String str1, String str2) {
        int answer = 0;
        
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        
        HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
        float Acnt = 0;
        float Bcnt = 0;
        float allcnt = 0;
        for(int i = 0; i < str1.length()-1; i++) {
        	String str = "";
        	if('A' <= str1.charAt(i) && 'Z' >= str1.charAt(i) && 'A' <= str1.charAt(i+1) && 'Z' >= str1.charAt(i+1)) {
        		str += str1.charAt(i);
        		str += str1.charAt(i+1);
        	 
        		Acnt++;
        		hm1.put(str, hm1.getOrDefault(str, 0)+1);
        	}
        }
        
        
        for(int i = 0; i < str2.length()-1; i++) {
        	String str = "";
        	if('A' <= str2.charAt(i) && 'Z' >= str2.charAt(i) && 'A' <= str2.charAt(i+1) && 'Z' >= str2.charAt(i+1)) {
        		str += str2.charAt(i);
        		str += str2.charAt(i+1);
        	 
        		if(hm1.containsKey(str)) {
        			Acnt--;
        			allcnt++;
        			hm1.put(str, hm1.getOrDefault(str, 0)-1);
        			if(hm1.get(str) == 0) hm1.remove(str);
        		} else {
        			Bcnt++;
        		}
        	 
        	}
        }
        
        float hab = Acnt + Bcnt+allcnt;
        double f = 0d;
        
        if(hab == 0) {
        	answer = 1 * 65536;
        } else {
        	f = allcnt/hab;
        	answer= (int)(f*65536);
        }
        System.out.println(answer);
        
        return answer;
    }