JavaScript/알고리즘

프로그래머스 배열의 길이에 따라 다른 연산하기 JS ( if문, map() / 비트 XOR (^) 연산 )

hihiha2 2023. 6. 9. 23:22
반응형

프로그래머스 배열의 길이에 따라 다른 연산하기 JS 

 

문제 설명

정수 배열 arr과 정수 n이 매개변수로 주어집니다. arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.

 

✅ 내 코드

function solution(arr, n) {
    if(arr.length%2===1){
       return arr.map((num,i)=> i%2===0? num+n: num)
    } else {
       return arr.map((num,i)=> i%2===1? num+n: num)
    }
}

 배열의 길이가 홀수인지 짝수인지를 if문으로 작성했다. 

그리고 각각의 요소를 돌면서 특정한 행위(n을 더한다)을 반복해야하기 때문에, map()을 사용했다.

 

먼저, if문을 통해서 배열의 길이가 홀수인 경우를 조건으로 넣는다.  arr.length%2 ===1  

map을 돌때, 배열에서 홀수번째인지 짝수번째인지에 따라 다른 조건을 넣어야하기때문에 map의 두번째 인자인 인덱스를 이용했다.

 arr.map((num, i)) 

그런 다음, 삼항연산자를 통해서 배열의 인덱스가 짝수인 경우에는 num+n을 하도록 해주었다.

 

반대로 짝수인 경우에는 인덱스가 홀수인경우 num+n을 수행하도록 했다.

 

 

🙋‍♀️ 내생각

if문이나 map()처럼 기본적이고 중요한 것만 사용해도 충분히 해결이 가능했다.

생각하는게 복잡한 문제는 아니어서 내가 생각하는 바를 자바스크립트 언어로 잘 표현이 가능한지가 관건인 문제인것같다.

 

 

💻  다른사람 코드중에 배울 것  1

const solution = (arr, n) => arr.map((num, idx) => (
    arr.length % 2 !== idx % 2
    ? num + n
    : num
))

 

 

뭔가 내가 생각지 못한 방법으로 풀어서 공부해보았다.

map을 돌면서 배열의 인덱스를 이용한다는 것은 같은데 if문을 통해서 배열의 길이가 홀수/짝수인 경우를 나눈 것이 아니라,

배열의 길이와 인덱스의 홀/짝이 같지 않다

라는 조건을 세워서 푼 것이 신선했다.

 

어차피 조건을 세워야하는것이

1️⃣ 배열의길이(홀)-인덱스(짝)

2️⃣ 배열의 길이(짝)-인덱스(홀)

이기 때문에 이런값의 조건을 조금 더 간단하게 ➡️ 두 값의 홀/짝이 같지않다

로도 표현이 가능하다!

 

그래서 같지않으면 num+n을 해주는 방법이다.

 

내가 생각하지 못한 조건으로 조건을 조금 더 간단하게 만든것같아서 흥미로웠다.

 

 

 

💻  다른사람 코드중에 배울 것  2

const solution=(a,n)=>a.map((v,i)=>a.length%2^i%2?v+n:v)

비트연산자 ^을 이용해서 푼 방법이다. 비트연산자중에 ^는 한번도 써본적이 없어서 이 코드를 이해하면서 공부해보았다.

 

우선 a,n을 매개변수로 받고 map()을 통해서 각 배열의 돌면서 i값을 이용해서 n을 더해주는것은 내가 만든코드나 위의 1코드와 같다.

 

다른점은 a.length와 i%2가 서로 서로 다를때를 비트 XOR (^) 연산을 이용해서 푼것이다.

그래서 비트 XOR (^) 연산자에 대해서 공부해보았다.

 

 

 

💻  학습한 것

비트 XOR (^) 연산이란

비트 XOR 연산은 주로 이진수를 다룰 때 사용되며, 각 비트를 서로 비교하여 결과를 도출

비트 XOR (^) 연산은 이항 연산자로, 두 개의 피연산자를 비트 단위로 XOR 연산을 수행

 

🔫 규칙

  • 두 비트가 서로 다른 경우에는 1을 반환합니다.
  • 두 비트가 동일한 경우에는 0을 반환합니다

 

비트 XOR 연산은 주로 이진수를 다룰 때 사용되며, 각 비트를 서로 비교하여 결과를 도출한다.

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

 

 

 

다시 코드로 돌아가보면, 

const solution=(a,n)=>a.map((v,i)=>a.length%2^i%2?v+n:v)

^를 통해서 a.length%2와 i%2를 비교한다. %2를 통해서 나오는 값이 1아니면 0일것이다. 

0^0 = 0 , 1^1 =0 과 같이 나올것이고 (둘다 홀/홀, 짝/짝 일 경우)

0^1 = 1, 1 ^1=1 과 같이 나올것이다 (둘의 홀/짝이 다를때)

 

그래서 둘의 홀짝이 다른경우에는 v+n을 해주고

홀짝이 같은 경우에는 v값이 나온다.

 

 

 

비트 연산자는 숫자의 비트 단위 조작이 필요한 경우에 사용한다고 한다.

대부분의 상황에서는 일반적인 산술 및 논리 연산자를 사용하는 것이 더 일반적인 경우이므로 엄청나게 자주 사용하게 될지는 공부하고 있는 입장에서는 잘 모르겠다 ㅎㅎ 

그래도 이번 기회에 공부를 해뒀으니 나중에 쓸일이 생기면 금방 익힐수있을것같다.

 

반응형