[프로그래머스] 두 정수 사이의 합
2022.01.04에 푼 문제입니다.
이번 문제는 쉬운 편인데 어떻게 간결하게 푸는지에 대한 문제인 것 같아요.
이번 문제 해결방안은 두 가지 방법에 대해 설명하겠습니다.
- a는 작은 수, b는 큰 수로 바꾼 뒤에 for문을 사용해서 값을 구해주는 방법
- 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;
}
해결방안 순서
- 구조 분해 할당을 이용하여 a, b를 비교하여 a는 작은 수, b는 큰 수로 정렬하기
- 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
여기까지 프로그래머스 두 정수 사이의 합 해결방안에 대해 설명해보았습니다.