프로그래머스 | 맞팔로우 검사하기

chaen·2024년 3월 7일
post-thumbnail

📌 문제

["follower", "following"] 는 follower가 following을 팔로우함을 나타냅니다. 이 관계가 표현된 2차원 문자열 배열 A가 주어질 때, SNS에서 서로를 팔로한 쌍의 수를 구하세요.

입출력 예

A  = {["철수", "영희"],["영희", "철수"],["진수", "준환"], ["진수", "철수"]}
return 1

철수와 영희는 서로를 팔로우하고 있습니다.

✨ 해결 방법

각 요소를 돌면서, 각 요소를 정 반대로 뒤집은 것과 뒤에 나오는 요소들이 동일한지 탐색합니다. 이미 탐색한 요소를 다음 요소에서 다시 탐색할 경우 중복이 발생하므로 배열을 현재 요소 다음으로 잘라 그 뒤부터 탐색하도록 합니다.
자른 요소의 0번째와 현재 요소의 1번째, 자른 요소의 1번째와 0번째가 같은 경우가 나온다면 sum은 1이 되고, sumanswer에 더한 값을 결과로 반환합니다.
이는 반대의 경우가 딱 한 번만 나온다는 특징을 이용하여 some 메소드를 사용하였습니다.

참고로 저는 처음에 이렇게 식을 구상했다가 오류가 났습니다.

const pair = A[i];
const reversePair = [pair[1],pair[0]];
const restOfPairs = A.slice(i + 1);
const sum = restOfPair.includes(reversePair);

입출력 예시처럼, pair가 ["철수", "영희"]이고 reversePair가 ["영희", "철수"]이기 때문에 restOfPair 에는 ["영희", "철수"]가 있어 sum이 1이 되어야 할 것 같지만, reversePair은 객체로써 두 ["영희", "철수"] 는 참조값이 다르기 때문에 성립하지 않습니다.

위의 이미지처럼, 객체 o1o1을 얉은 복사한 o2, 깊은 복사로 아예 새로 만든 o3가 있을 때 o1 === o2는 성립하지만 o1 === o3 은 성립하지 않습니다. 둘은 엄연히 다른 참조값을 가지고 있기 때문입니다.
reversePair도 생김새만 같을 뿐 아예 새로 만든 값이기 때문에 includesfalse를 반환합니다.

이 둘을 같은 값으로 검사하려면 아래의 식처럼 0번째와 1번째를 각각 비교하거나, JSON.stringify()를 사용하는 방법, 혹은 findIndex를 사용하는 방법이 있습니다.

💻 solution

function solution(A) {
    let answer = 0;
    for (let i = 0; i < A.length; i++) {
        const pair = A[i];
        const restOfPairs = A.slice(i + 1);
        const sum = restOfPairs.some(e => e[0] === pair[1] && e[1] === pair[0]);
        answer += sum;
    }
    return answer;
}

참고: 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

0개의 댓글