javascript

두 배열이 동등한지 비교하는 방법

2023. 1. 30. 18:00
목차
  1. ⚡능지이슈가 온 부분
  2. 🙄every()를 이용해서 비교하기
  3. 🔍반복문을 사용해서 하면?

⚡능지이슈가 온 부분

리트코드 문제를 풀던 중 능지 이슈가 발생했습니다.

문제는 간단한데 두 문자열의 구조가 일치하면 true 다르면 false를 뱉는 함수를 만드는 것입니다.

전 maker함수를 하나 만들어두고 maker함수는 배열을 반환하도록 코드를 작성했습니다.

그런 뒤 maker함수에 각 문자열을 넣고 결과값을 콘솔로 찍어보면

[0,1,1] == [0,1,1]을 비교하는데도 false가 반환되는 것입니다.

엄격한 비교를 했을때 false라면 이해가 되지만 느슨한 비교를 했는데도 false?

뭔가...이상한데..? 싶어서 찾아본 결과

자바스크립트에서 배열 끼리의 비교(==,===)는 객체를 비교할때처럼 요소의 값이 아닌
주소값(reference)를 기준으로 비교합니다.
즉 각 배열의 길이와 각 요소의 값이 같더라도 주소값이 다르면 false를 반환합니다.

 

그러면 이 문제를 어떻게 해결할 수 있을까요?

배열을 안쓰면 됩니다.

예컨대 그냥 문자열형식으로 만들면 해결아님?

그것도 하나의 방법이겠네요 간단히 생각나는 방법은 다음과 같습니다.

1. JSON.stringfy() 
2. every() 함수를 사용해서 비교
3. for문 등 반복문으로 각값 하나하나 비교
4. join() 함수 등으로 문자열화 해서 비교(어떤 위험이 있을진 모르겠지만 조금 위험성이 있을지도?)

 


🙄every()를 이용해서 비교하기

var isIsomorphic = function(s, t) {
    
    function maker(str) {
        let [map,arr] = [new Map(), []]
        str.split('').forEach( (ele,i) => {
            if(map.get(ele) != undefined) {
                arr[i] = map.get(ele)
            }
            else {
                arr[i] = i
                map.set(ele,i)
            }
        })
        return arr
    }
    
    let [sResult,tResult] = [maker(s) , maker(t)]
    console.log(sResult)
    console.log(tResult)
    
    return sResult.every((t,i) => t == tResult[i] ) ? true : false
};

every() 함수는 각 요소들이 주어진 조건을 다 통과하는지 비교하고

모든 요소들이 조건을 통과하면 true를 하나라도 통과못하면 false를 뱉는 고차함수입니다.

각 요소를 인자로 받을 수 있고 인덱스를 추가로 받을 수 있습니다.

따라서 위 코드는 각 요소 t가 tResult의 인덱스 i와 같은지를 비교하는 코드입니다.


🔍반복문을 사용해서 하면?

for(i=0 ; i<s.length; i++) {
	if(s[i] !== t[i]) return false
}

return true

반복문을 사용해서 비교한다면 위 every 코드는 대충 이런식으로 치환할 수 있겠네요

join()과 JSON.stringfy()는 둘 다 문자열로 치환해주는 메서드입니다.

쉬우니까 굳이 서술하지는 않겠습니다.

읽어주셔서 ㄳ

반응형
저작자표시 비영리 (새창열림)

'javascript' 카테고리의 다른 글

자바스크립트의 모듈을 내가 만들어서 써보자!  (1) 2023.02.24
DOM을 다루는 실전적인 방법  (0) 2023.02.14
요약 정리는 못 참지 않을까요? (20) 모듈  (1) 2023.01.28
요약 정리는 못 참지 않을까요? (19) async/await  (1) 2023.01.27
요약 정리는 못 참지 않을까요? (18) 제너레이터와 async/await  (0) 2023.01.27
  1. ⚡능지이슈가 온 부분
  2. 🙄every()를 이용해서 비교하기
  3. 🔍반복문을 사용해서 하면?
'javascript' 카테고리의 다른 글
  • 자바스크립트의 모듈을 내가 만들어서 써보자!
  • DOM을 다루는 실전적인 방법
  • 요약 정리는 못 참지 않을까요? (20) 모듈
  • 요약 정리는 못 참지 않을까요? (19) async/await
냠냠맨
냠냠맨
프론트엔드 개발 전반을 다루는 기술 블로그입니다.
냠냠맨
React와 TypeScript를 좋아하는 개발자
냠냠맨
전체
오늘
어제
  • all category (433)
    • CMC (0)
    • best (11)
    • 년간회고 (1)
    • cheetsheet (15)
    • 프로젝트 회고 (3)
    • 서평 (3)
    • SEO Study (1)
    • 프로젝트 진행기 (10)
    • testcode (9)
    • yarnberry (7)
    • css (21)
    • typescript (15)
    • redux (7)
    • react (43)
    • Next.js (9)
    • Nestjs (3)
    • javascript (44)
    • programmers (67)
    • leetcode (41)
    • frontend (41)
    • backjoon (1)
    • Next.js Beta Docs 번역 (12)
    • TIL (15)
      • html (3)
    • Network (12)
      • 간단 정리 시리즈 (2)
      • 질답 준비 (0)
    • 자료구조와 알고리즘 (2)
    • CS (4)
      • OS (1)
    • 취업준비 (2)
    • zoom websocket (2)
    • talk (6)
    • 면접대비 (1)
    • 코드스테이츠 프론트 (5)
    • 간헐적 회고 (17)

블로그 메뉴

  • leetcode
  • programmers
  • javascript
  • html
  • css

공지사항

인기 글

태그

  • 테오의스프린트17기
  • 테오의스프린트
  • 코드스테이츠 #프론트엔드
  • 말풍선
  • LeetCode
  • frontend
  • CSS
  • JavaScript
  • 프론트엔드
  • 개발자
  • teosprint
  • 주니어개발자
  • 개발
  • border말풍선

최근 댓글

최근 글

hELLO · Designed By 정상우.
냠냠맨
두 배열이 동등한지 비교하는 방법
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.