본문 바로가기

Algorithm

[알고리즘] #15 내적 | 프로그래머스

728x90

프로그래머스에서 내적 알고리즘 문제를 풀어보았다.

 

먼저 내적에 대해서 알고 가고 싶어서 강의를 조금 들었다.

벡터의 정의 (벡터의 기초) https://youtu.be/g3n1VxiXgrE 

백터의 내적 https://www.youtube.com/watch?v=IOf1o72aKDc 

 

여기까지만 간단히 들어보고 이런 거구나 하고 문제 풀이를 시작했다.

 

사실 문제를 푸는데 있어서 내적에 대한 개념을 몰라도 문제 푸는데에는 상관이 없었다. 문제 설명에서 내적을 푸는식이 적혀있기 때문이다. 하지만 간단하게라도 개념을 알고 가고 싶었다.

 


 

 

 

 

 

문제 설명

 

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

 

 

제한사항

 

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

 

입출력 예

 

 

 

입출력 예 설명

 

입출력 예 #1

  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.

입출력 예 #2

  • a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.

 


 

문제 설명은 복잡해 보였지만 알고보면 곱한 뒤 더하면 되는 간단한 문제였다. 

 

< 문제 풀이 코드 >

 

 

< 문제 리뷰 >

// 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. 
//a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
// 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

// 내적을 구하는 식을 살펴보면 결국 a엘리먼트와 b엘리먼트 곱해서 더하는 것이다.
// a, b는 이렇게 가정한다.
// a = [1,2,3,4];	
// b = [-3,-1,0,2];

function solution(a, b) {
//답 저장할 변수 만들기
    let answer = 0;
	
    // a와 b 곱해서 저장하기
    for (let i = 0; i < a.length; i ++){
    
    //실행결과 예상하기
    //첫번째 실행 : (answer = 0) + (a[0]*b[0] = -3)= (answer = -3) 
    //두번째 실행 : (answer = -3) + (a[1]*b[1] = -2) = (answer = -5)
    //... 계속 실행하다보면 마지막 실행에서는 answer에 8이 찍힌다.
      answer += a[i]*b[i];
    }
    //answer 구한 것을 solution 함수에 돌려주기.
    return answer;
}

 

 

 

다른 방법으로 풀어보기  :  reduce( ) 메소드 사용해보기

 

1. 차근 차근 여러 줄로 만들기

 

a = [1,2,3,4];	
b = [-3,-1,0,2];

function solution(a, b) {
    let answer = 0;

	//reduce 메소드의 누적값 파라미터로 합을 구한다.
    answer = a.reduce((acc, cur, i)=>{
    
     //누적값 += 현재 a엘리먼트[i] * b엘리먼트[i]
      acc += cur * b[i];
      
      //누적값을 answer에 돌려준다.
      return acc;
    }, 0);
    
    //answer을 solution에 돌려준다.
    return answer;
}

solution(a, b);

 

 

2. 여러 줄로 만든 거 정리해서 한 줄 코드로 만들기

 

a = [1,2,3,4];	
b = [-3,-1,0,2];

function solution(a, b) {
	//a의 현재 엘리먼트[i] *b엘리먼트[i] 를 acc(누적값)에 넣어 계속 더해준다.
    //최종적으로 더해진 누적값을 solution에 돌려준다.
  return a.reduce((acc, cur, i)=> acc += cur * b[i], 0);
}

solution(a, b);

 

 

 


 

 

다른 사람들의 풀이

https://programmers.co.kr/learn/courses/30/lessons/70128/solution_groups?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90