항해99

TIL 9 알고리즘 공부하자

kongom2 2021. 11. 9. 10:45

내적 [15번 문제]

우선 내적이라는 말부터 이해가 안되서 검색을 해보았다. (다른말로 도트곱, 점곱이 있다.)

수학용어로 많이 쓰이고 있고 여러 수학용어들이 정리되어 있는 사이트가 있어 공유한다

[출처]

수학 용어를 알면 개념이 보인다 => 여러 수학 용어 정리

장철원님의 블로그 => 내적의 의미 비교적 쉽게 정리

 

내적은 여러 연산(더하기, 빼기, 곱하기, 나누기)중 하나,

벡터와 벡터의 연산이고 결과값은 스칼라


대개의 경우 벡터 + 벡터 = 벡터, 스칼라 + 스칼라 = 스칼라 인데,

내적이라는 연산은 벡터와 벡터의 연산이 = 스칼라


내적의 정의, 성질, 물리학 관점, 정사영 관점 등은 나중에 알아보자..

 

[문제설명]

길이가 같은 두 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 이하입니다.

=> a, b 배열의 각 index의 해당하는 값을 곱하고, 그 곱한값들을 모두 더한 값 

예시

a = [1, 2, 3, 4]

b = [5, 6, 7, 8]

1*5 + 2*6 + 3*7 + 4*8 =

5 + 12 + 21 + 32 =

70

function solution(a, b) {
  let answer = 0;
  for (let i = 0; i < a.length; i++){
    answer += a[i]*b[i]
    console.log(answer)
  }
  return answer
}


[접근방식]

- for 반복문

- += 더하기 할당 연산자

 

[풀이]

1. answer를 기본값 0으로 둔다.

2. for 반복문으로 a배열의 길이만큼(문제는 a와 b의 배열길이가 동일함.) 반복을 돌린다.

3. 반복된 a[i]의 값들과 b[i]의 값들을 곱한다.

4. 곱한 값들을 더하기 할당연산자로 모두 더해준다.

5. 값을 리턴한다.


[문제링크]
[다른사람풀이]


수박수박수박수박수박수? [19번 문제]

[문제설명]

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요.

예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
[제한조건]

n은 길이 10,000이하인 자연수입니다.

=> 수박수박수박수박수박... 문자열에서 n의 수만큼 문자열 추출하자.

function solution(n) {
    let waterMelon = '수박';
    let answer = waterMelon.repeat(5000).slice(0,n)
    return answer;
}


[접근방식]

- 문자열 반복 => 문자 반복 자바스크립트 => repeat()

- 문자열 추출 => slice()


[풀이]

1. 반복할 문자(수박)를 waterMelon 변수에 담는다.

2. 제한조건(n은 10,000 이하의 자연수)에 맞게 출력할 수 있도록 repeat()을 사용하여 waterMelon을 5000번 반복한다.

3. slice()를 사용하여 첫번째 인덱스부터 n번째 인덱스 까지 추출한 값을

4. answer에 담고 값을 리턴한다.


[문제링크]
[다른사람풀이]


두 정수 사이의 합 [4번 문제]

[문제설명]

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
[제한조건]

a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.

=> a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴, 같을 경우 a, b 아무 수나 리턴.

function solution(a, b) {
    let answer = 0;
    let arr = [];
    if (a === b) {
        answer = a
    } else {
        arr.push(a,b);
        arr.sort((a,b)=>a-b); // 배열을 오름차순 해주는 코드
        for (let i = arr[0]; i <= arr[1]; i++) { // i는 배열의 첫번째, i가 배열의 두번째와 같거나 작을때까지 반복문
            answer += i // 반복해서 나온 i 값들을 더하기 할당 연산자로 모두 더함
        }
    }
    return answer
}

[접근방식]

- ===연산자

- if else 반복문

- 배열에 push()

- 배열 인덱스


[풀이]

1. solution 인자를 두개(a, b) 받는다.

2. answer는 0을 기본값으로 변수 선언한다.

3. num 배열을 만든다.

4. 만약 a, b가 같다면, 둘 중 아무수나 괜찮지만 그냥 a를 리턴한다.

5. a, b가 다르다면, push()로 배열에 a, b를 넣고

6. 뒤바뀌어 있는 경우엔 오름차순 코드인 num.sort((a,b)=>a-b) 를 사용해서 정렬 한다.

7. for 반복문으로 i는 배열의 첫번째, i가 배열의 두번째와 같거나 작을때까지 반복한다.

8. 반복해서 나온 값 i 들을 더하기할당 연산자로 모두 더한다.

9. 더한값 answer를 리턴한다.


[문제링크]
[다른사람풀이]


문자열 내 p와 y의 개수 [16번 문제]

[문제설명]

대문자와 소문자가 섞여있는 문자열 s가 주어집니다.

s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True,

다르면 False를 return 하는 solution를 완성하세요.

'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다.

단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
[제한조건]
문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.

function solution(s){
  var str = s;
  var regexpP = /p/gi;
  var regexpY = /y/gi;
  return ((str.match(regexpP)||[]).length === (str.match(regexpY)||[]).length)
}

[접근방식]

- 비교 연산자

- 삼항 연산자?

- //gi

- match()


[풀이]

1. 배열을 가지고온다

2. //gi로 p 문자열만 가져온다.

3. //gi로 y 문자열만 가져온다.

4. 둘을 비교하여 같으면 true 다르면 false

 

[문제링크]
[다른사람풀이]

'항해99' 카테고리의 다른 글

TIL 12 알고리즘 공부하자  (0) 2021.11.13
TIL 11 알고리즘 공부하자  (0) 2021.11.10
TIL 10 알고리즘 공부하자  (0) 2021.11.09
TIL 8 알고리즘 공부하자  (0) 2021.11.08
WIL 1  (0) 2021.11.07