본문 바로가기

알고리즘

프로그래머스 - 뉴스 클러스터링

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

 

프로그래머스

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

programmers.co.kr

 

내일 출근인데 이 문제 푸느라.. 새벽 2시까지 잠을 못잤네요 ㅠㅠ

생각했던 방식은 맞았는데 문법을 몰라서 문자열 파싱에 어려움 겪었고..

다 옳게 풀었다고 생각했는데 틀려서 이유가 무엇인지 문제 다시 봤더니.. 엄청난 실수를 했습니다.

먼저 공백이랑 특수문자를 제거한 후에 문자열을 2개씩 잘라 붙였는데 그것이 아니라 문자열을 먼저 2개씩 잘라 붙이고 거기에 공백이나 특수문자가 포함된다면 버리는 방식이더군요.

문제를 잘 읽어야 하는 것 같습니다.

밑에 문제 풀이 코드를 올리지만 문제 풀이 코드도 정말 깔끔하지 않고.. 졸린 관계로 쓰지 않는 변수나 배열들도 삭제 하지 않고 그냥 올립니다..

문제를 푼 방식은 각 집합에서 중복되는 값이 있는 문자열을 다른 배열에 저장 해 놓은 후에,

이 배열의 길이 만큼 반복하면서 집합 2개에서 반복되는 문자열의 개수를 각각 카운트 했습니다.

그 후에 카운트의 크기를 비교하고 더 작은 크기의 숫자가 min값이 되는데 이 중복 문자열의 최소 집합 의 수입니다.

이 min값을 모든 중복 문자열에서 구한 후에 더한 것이 교집합의 숫자이고, 합집합의 수는 각기 다른 두 집합의 사이즈의 합 - 교집합의 수를 하게 되면 합집합의 수가 나옵니다.

그 후에 교집합 / 합집합 * 65536 을하면 됩니다~ double형도 헷갈리더라고요 다들 화이팅하세요.

 

import java.util.*;
class Solution {
  public int solution(String str1, String str2) {
      int answer = 0;
      
      str1 = str1.toUpperCase();
      str2 = str2.toUpperCase();
      
      ArrayList<String> setA = new ArrayList<>();
      ArrayList<String> setB = new ArrayList<>();
      ArrayList<String> setC = new ArrayList<>();
      ArrayList<String> setD = new ArrayList<>();
      
      String newStr1 = "";
      String newStr2 = "";
      
      for(int i=0; i<str1.length(); i++){
          char ch = str1.charAt(i); 
          newStr1 += String.valueOf(ch);
          
          if(newStr1.length() == 2){
              char ch2 = newStr1.charAt(0);
              char ch3 = newStr1.charAt(1);
              
              if( (ch2>= 'A' && ch2 <= 'Z') && (ch3 >= 'A' && ch3 <= 'Z')){
                  newStr2 += String.valueOf(ch2);
                  newStr2 += String.valueOf(ch3);
                  setA.add(newStr2);
                  setC.add(newStr2);
                  newStr1 = "";
                  newStr1 += String.valueOf(ch3);
                  newStr2 ="";
              } else {
                  newStr1 = "";
                  newStr1 += String.valueOf(ch3);
                  newStr2 = "";
              }
          }
      }
      newStr1 = "";
      newStr2 = "";
      
      for(int i=0; i<str2.length(); i++){
          char ch = str2.charAt(i); 
          newStr1 += String.valueOf(ch);
          
          if(newStr1.length() == 2){
              char ch2 = newStr1.charAt(0);
              char ch3 = newStr1.charAt(1);
              
              if( (ch2>= 'A' && ch2 <= 'Z') && (ch3 >= 'A' && ch3 <= 'Z')){
                  newStr2 += String.valueOf(ch2);
                  newStr2 += String.valueOf(ch3);
                  setB.add(newStr2);
                  setC.add(newStr2);
                  newStr1 = "";
                  newStr1 += String.valueOf(ch3);
                  newStr2 = "";
              } else {
                  newStr1 = "";
                  newStr1 += String.valueOf(ch3);
                  newStr2 = "";
              } 
          }
      }
 
      int total = setA.size() + setB.size();
      int intersection = 0;
      String tempA = "";
      String tempB = "";
      String tempC = "";
      for(int i=0; i<setC.size(); i++){
          tempC = setC.get(i);
          
          for(int j=i+1; j<setC.size(); j++){
              tempB = setC.get(j);
              if(tempC.equals(tempB) && !(setD.contains(tempC))){
                  setD.add(tempC);
              }
          }
      }
      
      int countA = 0;
      int countB = 0;
      int countC = 0;
      int count = 0;
      for(int i=0; i<setD.size(); i++){
          
          countA = 0;
          countB = 0;
          
          tempA = setD.get(i);
          
          for(int j=0; j<setA.size(); j++){
              tempB = setA.get(j);
              
              if(tempA.equals(tempB))
                  countA++;
          }
          
          for(int k=0; k<setB.size(); k++){
              tempB = setB.get(k);
              
              if(tempA.equals(tempB))
                  countB++;
          }
          
          if(countA > countB)
              countC = countB;
          else 
              countC = countA;
          
          count += countC;
          
      }

      double a = (double) count / (total-count);
      a *= 65536;
      answer = (int) a;
      
      if(setA.size()==0 && setB.size()==0)
          return 65536;
      
      
      return answer;
  }
}

'알고리즘' 카테고리의 다른 글

프로그래머스 - 캐시(성공)  (0) 2020.03.28
프로그래머스 - 캐시(실패)  (0) 2020.03.28
프로그래머스 - 예상대진표  (0) 2020.03.26
프로그래머스 - 124 나라의 숫자  (0) 2020.03.21
프로그래머스 - 탑  (0) 2020.03.21