백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 2607 비슷한 단어
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
문제 출처 🏠
https://www.acmicpc.net/problem/2607
문제풀이 소감 🧑💻
생각보다 까다로운 문제다.
dict를 사용해서 풀려고 접근하였는데, 고려해야할 것들이 꽤 있었다.
밑에서 추가로 설명하겠다.
요구사항 📋
- 두 개의 단어가 같은 종류의 문자로 이루어져 있다.
- 같은 문자는 같은 개수 만큼 있다.
두 단어가 같은 구성을 갖는 경우, 또는 한 단어에서 한 문자를 더하거나, 빼거나, 하나의 문자를 다른 문자로 바꾸어 나머지 한 단어와 같은 구성을 갖게 되는 경우에 이들 두 단어를 서로 비슷한 단어라고 한다.
주의 ❗
단순, dict 값의 합으로 접근하려고 하면 예외가 생긴다.
ex)
AABAA
ABBBA
A 갯수 차이 +2
B 갯수 차이 -2
매 단어들을 target이 되는 dict에 비교해야하므로 deepcopy를 해서 매번 새로 비교해줘야한다.
deepcopy 를 쓰는 방법도 있지만, 간편하게 스프레드 문법을 사용하여 해결하였다.
해결 전략 📝
처음에 접근했던 방법은 target 이 되는 단어의 각 알파벳 갯수들을 dict에 따로 저장해준 뒤,
비교할 단어의 글자들을 하나씩 빼주었다.
이후, dict의 value 값들을 모두 합하여 절댓값이 1이하인 문자들만 결과에 포함시켜주었는데
이 방법은 위의 예시와 같은 경우를 제대로 검증해주지 못했다.
계속 여러시도를 해보다가 cnt 변수를 생성하여 발생할 수 있는 경우의 수들을 크게 3가지 경우로 나누어 주었고, 이외의 경우들은 모두 예외처리해주었다.
1. 다른 문자가 2가지인 경우
한 문자를 바꿔서 똑같게 만들어주는 경우다.
해당 경우는 store 값이 [1,-1] 이거나 [-1,1] 인 경우에만 유효하다.
2. 다른 문자가 1가지 인 경우
한 문자를 빼버리거나 추가하면 같아지는 경우다.
해당 경우는 store 값이 [1] 이거나 [-1] 인 경우에만 유효하다.
3. 다른 문자가 없는 경우
해당 경우는 모두 결과에 포함된다.
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const input_T = Number(input[0]);
input.shift();
const [...input_words] = input.map((v) => v.trim());
function solution(T, words) {
const dict = {};
const target = words[0].split("");
let result = 0;
for (let i = 65; i <= 90; i++) dict[String.fromCharCode([i])] = 0;
const keys = Object.keys(dict);
words = words.splice(1);
target.forEach((letter) => {
dict[letter] += 1;
});
words.forEach((word) => {
const copyDict = { ...dict };
let cnt = 0;
let store = [];
word.split("").forEach((letter) => {
copyDict[letter] -= 1;
});
keys.forEach((key) => {
if (0 !== copyDict[key]) {
cnt += 1;
store.push(copyDict[key]);
}
});
if (cnt === 2) {
if (
(store[0] === 1 && store[1] === -1) ||
(store[0] === -1 && store[1] === 1)
)
result += 1;
} else if (cnt === 1) {
if (store[0] === 1 || store[0] === -1) result += 1;
} else if (cnt === 0) result += 1;
});
return result;
}
console.log(solution(input_T, input_words));
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Gold 1 문제 , 백준 Node.js 자바스크립트 15644 구슬 탈출 3 (0) | 2022.11.29 |
---|---|
백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 13459 구슬 탈출 (0) | 2022.11.28 |
백준/ Gold 1 문제 , 백준 Node.js 자바스크립트 13460 구슬 탈출 2 [BFS, 구현] (1) | 2022.11.25 |
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 17214 다항 함수의 적분 (0) | 2022.11.24 |
백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 1002 터렛 (0) | 2022.11.23 |