티스토리 뷰
반응형
프로그래머스 뉴스클러스터링
구현문제
주어진 문제에 맞춰 구현하면 된다.
요구조건에 맞춰 단계별로 수행했다.
입력에 있어서 대,소문자 차이는 무시하기에 모든 입력을 소문자로 처리했다.
입력문자열을 두 글자씩 끊어서 원소로 만들되 특수문자가 포함되어있으면 해당 원소는 버린다.
2번과정은 문자열 길이만큼 반복문을 돌리고, i, i - 1 문자를 map에 삽입하고, 반복되는 횟수를 count해주었다.
카운트해준 이유는 교집합, 합집합을 만들 때 사용되기 때문인데, 중복원소가 포함된 원소 {1,1,1}, {1,2,3}의 교집합은 {1,2,3}이고 합집합은 {1,1,1,1,2,3}이다.
교집합을 구하는 건 중복원소인 1에 대해 카운트된 숫자중 최소값을 넣으면되고
합집합의 경우 두 집합중 1이 반복되는 횟수의 max값을 찾아 기준 집합의 1원소갯수에 더하면된다.
여기서 나는 기준이되는 집합을 map의 사이즈, 원소의 갯수가 작은 집합을 기준으로 잡았다.
교집합, 합집합 원소의 갯수를 구했다면 요구사항에 맞게 계산해 반환해주면 된다.
공집합에 대한 처리도 해주어야한다.
function stringToLowerCase(str) {
return str.toLowerCase();
}
function sliceString(str) {
let len = str.length;
let result = new Map();
for (let i = 1; i < len; i++) {
if (
str[i - 1] >= "a" &&
str[i - 1] <= "z" &&
str[i] >= "a" &&
str[i] <= "z"
) {
if (!result.has(str[i - 1] + str[i])) {
result.set(str[i - 1] + str[i], 1);
} else {
result.set(str[i - 1] + str[i], result.get(str[i - 1] + str[i]) + 1);
}
}
}
return result;
}
//교집합 구하기 m2반복시켰을 때, m1이 m2 키가 있다면, 둘 중 작은거 추가하기, 없다면 아무일도 없음.
function getIntersection(m1, m2) {
let interNumber = 0;
for (let key of m2) {
if (m1.has(key[0])) {
interNumber += Math.min(m1.get(key[0]), key[1]);
}
}
return interNumber;
}
// 둘 중 사이즈 큰 것 중, 디폴트 0 (m2라고 할 때) m2가 m1의 키가 없다면 추가시키기, 있다면 둘 중 max값 더하기
function getUnion(m1, m2) {
let unionNumber = 0;
if (m2.size <= m1.size) {
for (let key of m2) {
unionNumber += key[1];
}
for (let key of m1) {
if (m2.has(key[0])) {
unionNumber -= m2.get(key[0]);
unionNumber += Math.max(m2.get(key[0]), key[1]);
} else {
unionNumber += key[1];
}
}
} else if (m1.size <= m2.size) {
for (let key of m1) {
unionNumber += key[1];
}
for (let key of m2) {
if (m1.has(key[0])) {
unionNumber -= m1.get(key[0]);
unionNumber += Math.max(m1.get(key[0]), key[1]);
} else {
unionNumber += key[1];
}
}
}
return unionNumber;
}
function solution(str1, str2) {
var answer = 0;
if (str1.length === 0 && str2.length === 0) return 1; //둘 다 공집합
if (str1.length === 0 || str2.length === 0) return 0; //둘중하나 공집합 0 / 합집합
str1 = stringToLowerCase(str1);
str2 = stringToLowerCase(str2);
let map1 = sliceString(str1);
let map2 = sliceString(str2);
if (map1.size === 0 && map2.size === 0) return 1 * 65536; //둘 다 공집합
if (map1.size === 0 || map2.size === 0) return 0;
//둘중하나 공집합 0 / 합집합
let mole = getIntersection(map1, map2);
let deno = getUnion(map1, map2);
answer = Math.floor((mole / deno) * 65536);
return answer;
}
console.log(solution("FRANCE", "french"));
console.log(solution("handshake", "shake hands"));
console.log(solution("aa1+aa2", "AAAA12"));
console.log(solution("E=M*C^2", "e=m*c^2"));
반응형
'문제풀이' 카테고리의 다른 글
백준 2638 치즈 (dfs + bfs) (0) | 2021.07.12 |
---|---|
백준 다리만들기 (dfs + bfs) (0) | 2021.07.12 |
프로그래머스 타겟넘버 js (0) | 2021.05.19 |
프로그래머스 메뉴리뉴얼 js (0) | 2021.05.19 |
프로그래머스 짝지어제거하기 js (0) | 2021.05.19 |
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
농담곰의 고군분투 개발기