알고리즘🅰/프로그래머스

[프로그래머스] 두 정수 사이의 합

개발조각 2022. 2. 17. 13:16
728x90
반응형

2022.01.04에 푼 문제입니다.

 

이번 문제는 쉬운 편인데 어떻게 간결하게 푸는지에 대한 문제인 것 같아요.

 


이번 문제 해결방안은 두 가지 방법에 대해 설명하겠습니다.

  1. a는 작은 수, b는 큰 수로 바꾼 뒤에 for문을 사용해서 값을 구해주는 방법
  2.  Math에 min, max를 사용하여 for문에 초기값에 작은 값 조건식에 큰 값을 넣어 구하는 방법

 

 

방법 1. a는 작은 수, b는 큰 수로 바꾼 뒤에 for문을 사용해서 값을 구해주는 방법

function solution(a, b) {
    var answer = 0;
    
    if(a > b) [a, b] = [b, a]; // a>b일 경우 a는 b가 되고, b는 a가 됩니다.
    for(let i=a; i<=b; i++) answer += i;
    return answer;
}

해결방안 순서

  1. 구조 분해 할당을 이용하여 a, b를 비교하여 a는 작은 수, b는 큰 수로 정렬하기
  2. for문을 이용해서 a부터 b 사이의 합 구하기

 

1단계. 구조 분해 할당을 이용하여 a, b를 비교하여 a는 작은 수, b는 큰 수로 정렬하기

if(a > b) [a, b] = [b, a];

  • [a, b] = [b, a] : 구조 분해 할당
MDN Web Docs
구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식입니다.
// 구조 분해 할당 예제
var a, b, rest;
[a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20

[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]

({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20

({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
console.log(a); // 10
console.log(b); // 20
console.log(rest); // {c: 30, d: 40}

여기서 설명을 더 붙이자면

구조 분해 할당은 ES6에 추가가됬습니다. 익스플로러에선 지원하지 않지만 많은 사람이 추천하고 있다고 합니다.

위에 설명은 아래 블로그에서 읽은 내용입니다.

https://velog.io/@jinyongp/%EB%91%90-%EA%B0%92%EC%9D%84-Swap-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

두 변수를 swap하는 방법은?

JavaScript에서 두 값을 바꾸는 방법들은 무엇이 있을까

velog.io

 

제가 구조 분해 할당을 사용하고 싶은 이유는

  • a=5, b=3 -> a=3, b=5

로 바꾸고 싶은데 가장 쉬운 방법이 구조 분해 할당이라 생각해서 써주었습니다.

 

// MDN Web Docs 구조 분해 할당으로 변수 값 교환하기
var a = 1;
var b = 3;

[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1

딱 위에 예제처럼 구조 분해 할당을 사용해서 두 변수 값을 교한하고 싶은 거죠.

그래서 if(a > b) [a, b] = [b, a]; -> 만약 a>b이면 a, b의 변수 값을 교환하라

이렇게 해주었습니다.

 

if(a > b) [a, b] = [b, a];

테스트 1 (a=3, b=5)
a > b -> 3 > 5 -> false임으로 그대로
a=3, b=5

테스트 2 (a=3, b=3)
a > b -> 3 > 3 -> false임으로 그대로
a=3, b=3

테스트 3 (a=5, b=3)
a > b -> 5 > 3 -> true임으로 구조 분해 할당 [a, b] = [b, a] 실행
[a, b] = [b, a]; -> a=3, b=5

 

2단계. for문을 이용해서 a부터 b 사이의 합 구하기

for(let i=a; i<=b; i++) answer += i;

1단계에서 구한 값을 이용하여 더해주었습니다.

 

테스트 1 (a=3, b=5)
1단계. a=3, b=5
for(let i=a; i<=b; i++) -> 3, 4, 5까지 반복
answer += i; -> 3+4+5 =12

테스트 2 (a=3, b=3)
1단계. a=3, b=3
for(let i=a; i<=b; i++) -> 3까지 반복
answer += i; -> 3 =3

테스트 3 (a=5, b=3)
1단계. a=3, b=5
for(let i=a; i<=b; i++) -> 3, 4, 5까지 반복
answer += i; -> 3+4+5 =12

 

방법2. Math에 min, max를 사용하여 for문에 초기값에 작은 값 조건식에 큰 값을 넣어 구하는 방법

 

 

function solution(a, b) {
    var answer = 0;
    
    for(let i = Math.min(a, b); i<=Math.max(a, b); i++) answer += i;
    return answer;
}

 

MDN Web Docs
Math.min() 함수는 주어진 숫자들 중 가장 작은 값을 반환합니다.

문법 : Math.min([value1[, value2[, ...]]])

  • value1, value2, ... : 숫자형
// Math.min() 예제
var x = 10, y = -20;
var z = Math.min(x, y); // -20

 

MDN Web Docs
Math.max() 함수는 입력값으로 받은 0개 이상의 숫자 중 가장 큰 숫자를 반환합니다.

문법

Math.max()
Math.max(값0)
Math.max(값0, 값1)
Math.max(값0, 값1, ... , 값N)

  • 값1, 값2, ... : 가장 큰 값을 선택하고 반환할 0개 이상의 숫자입니다.
// Math.max 예제
Math.max(10, 20);   //  20
Math.max(-10, -20); // -10
Math.max(-10, 20);  //  20

 

테스트 1 (a=3, b=5)
for(let i = Math.min(a, b); i<=Math.max(a, b); i++)
for(let i = a; i<=b; i++) -> for(let i = 3; i<=5 i++) -> 3, 4, 5까지 반복
answer += i -> 3 + 4 +5 = 12

테스트 2 (a=3, b=3)
for(let i = Math.min(a, b); i<=Math.max(a, b); i++)
for(let i = a; i<=b; i++) -> for(let i = 3; i<=3 i++) -> 3까지 반복
answer += i -> 3

테스트 3 (a=5, b=3)
for(let i = Math.min(a, b); i<=Math.max(a, b); i++)
for(let i = a; i<=b; i++) -> for(let i = 3; i<=5 i++) -> 3, 4, 5까지 반복
answer += i -> 3 + 4 +5 = 12

여기까지 프로그래머스 두 정수 사이의 합 해결방안에 대해 설명해보았습니다.

728x90
반응형