코딩테스트 - 프로그래머스/JAVA
[프로그래머스 / 2018 KAKAO BLIND RECRUITMENT / 자바(JAVA)] [1차] 뉴스 클러스터링
읁;
2024. 5. 6. 13:23
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17677
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[ 요약 ]
더보기
시작 시간 : 11:39
종료 시간 : 13:02
소요 시간(분) : 82분
도전 횟수 (제출 횟수) : 1
로직 및 풀이 참고 여부 : O
[ 풀어보기 ]
풀이
📌 로직
- 다중집합을 만드는 메소드 makeMultiSet
- "다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. "AB"와 "Ab", "ab"는 같은 원소로 취급한다." 라는 입력 형식에 따라, str을 전부 소문자로 만들기.
- 이를 char Array로 만든다.
- char Array의 길이만큼 i가 증가하는 for문을 생성
- 만약 charArray[i] 가 a ~ z에 속하면, String Builder에 append 한다.
- 만약 charArray[i+1]이 a ~ z에 속하면, String Builder 에 append 한다.
- 위 둘을 거치고 난 후 StringBuilder의 길이가 2가 되었다면,
( = 즉, charArray[i] 와 charArray[i+1] 둘 다 a~z에 속한다면) ArrayList에 추가한다. - StringBuilder를 비워준다.
- 과정을 다 거치고 난 후, ArrayList를 return 한다.
- str1 과 str2를 각각 makeMultiSet의 매개변수로 넘겨, 그들의 다중집합을 만든다.
- (각각 strArr1, strArr2 로 칭함)
- 교집합을 구한다.
- strArr1 을 순회하는 확장 for문을 생성, 그의 원소를 String a라고 지정한다.
- union 에 a를 add하고, 만약 a가 strArr2에도 있다면 intersaction 에도 add한다.
- 합집합을 구한다.
- intersaction에 add 되지 않은 strArr2의 원소들을 union에 add한다.
- 이를 위해, 교집합을 구하는 과정에서
'만약 a가 strArr2에도 있다면' strArr2 에서 a를 지우고 intersaction에 add하고, - 지워진 원소들을 제외한 strArr2의 나머지 원소들을 union에 add하면 된다.
📌 코드
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
List<String> strArr1 = makeMultiSet(str1);
List<String> strArr2 = makeMultiSet(str2);
List<String> intersaction = new ArrayList<>();
List<String> union = new ArrayList<>();
// 교집합 구하기
for(String a : strArr1) {
if(strArr2.remove(a)) { // 지워지면 true를 반환 = 교집합에 속함
intersaction.add(a);
}
union.add(a);
}
// 합집합 구하기
for(String a : strArr2) {
union.add(a); // 교집합에 속하지 않은 나머지 원소들 추가
}
// 자카드
double a = intersaction.size();
double b = union.size();
double jaccard = (b==0)?65536:a/b*65536;
return (int)jaccard;
}
private List<String> makeMultiSet (String str) {
List<String> strArrList = new ArrayList<>();
StringBuilder sb = new StringBuilder();
str = str.toLowerCase();
char[] charArr = str.toCharArray();
for(int i=0; i<charArr.length-1; i++) {
if(charArr[i]>='a' && charArr[i]<='z')
sb.append(charArr[i]);
if(charArr[i+1]>='a' && charArr[i+1]<='z')
sb.append(charArr[i+1]);
if(sb.length()==2)
strArrList.add(sb.toString());
sb.setLength(0);
}
return strArrList;
}
}
📌 채점 결과
정확성 테스트
테스트 1 〉 통과 (0.11ms, 75.1MB)
테스트 2 〉 통과 (0.09ms, 78.1MB)
테스트 3 〉 통과 (0.07ms, 76.1MB)
테스트 4 〉 통과 (1.63ms, 66.8MB)
테스트 5 〉 통과 (0.08ms, 71.3MB)
테스트 6 〉 통과 (0.08ms, 76.3MB)
테스트 7 〉 통과 (0.37ms, 75.6MB)
테스트 8 〉 통과 (0.07ms, 78.7MB)
테스트 9 〉 통과 (0.30ms, 84.5MB)
테스트 10 〉 통과 (0.49ms, 74.8MB)
테스트 11 〉 통과 (0.74ms, 82.9MB)
테스트 12 〉 통과 (0.06ms, 73.8MB)
테스트 13 〉 통과 (0.16ms, 83.5MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0