알고리즘 문제를 풀며 정리가 필요했던 문제를 정리한다.
<문제1> 정수 제곱근 판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
입출력 예
n | return |
121 | 144 |
3 | -1 |
입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
- 내가 만든 코드
function solution(n) {
var answer = 0;
for(let x=1; (x*x) <= n; x++){
if(n === x*x){
answer = (x+1)*(x+1)
} else{
answer = -1
};
};
return answer;
}
for문에 조건을 넣어줄 때 x는 양의 정수이기 때문에 1부터 시작하며, 제곱근을 판별하고있기때문에 x의 제곱이 n보다 작거나 같다는 조건을 넣어주었다. 그다음부터는 직관적인 코딩으로 구성하였다.
- 다른 풀이
function solution(n) {
var answer = 0;
let sqrt = Math.sqrt(n);
if (sqrt % 1 !== 0) { // 나머지를 이용해 소숫점 판별, 제곱근이 아닐 경우
answer = -1;
} else {
answer = Math.pow(sqrt+1,2); // 제곱근일 경우
}
return answer
}
Math.sqrt를 통해 x값을 let으로 sqrt로 정의내린다
if 조건문을 통해 x값이 양수가 맞는지를 1로 나눴을 때 나머지 값이 존재하는가로 판별
Math.pow를 사용하여 (x+1) 제곱을 리턴시킨다
- Math.sqrt() : 숫자의 제곱근을 반환
Math.sqrt(2); // 1.414213562373095
Math.sqrt(9); // 3 - Math.pow() : 밑의 거듭제곱 값을 반환
Math.pow(7, 2); // 49
Math.pow(7, 3); // 343
- 다른 풀이
function solution(n) {
// 삼항 연산자를 이용한 풀이
return Math.sqrt(n) % 1 == 0 ? Math.pow(Math.sqrt(n)+1,2) : -1
}
위 풀이를 삼항연산자로 표현했을 경우
<문제2> 정수 내림차순으로 배치하기
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
제한 조건
- n은 1이상 8000000000 이하인 자연수입니다.
입출력 예
n | return |
118372 | 873211 |
- 내가 만든 코드
function solution(n) {
var answer = 0;
let arr = n.toString().split("").sort().reverse().join('');
answer = Number(arr);
return answer;
}
내 코드를 풀어가며 어려웠던 부분은 '.join('')' 이 메서드를 사용해야한다는 것을 인지하지 못했었다.
문자 배열인 상태를 바로 숫자형태로 만들 수는 없기 때문에 join() 메소드를 통해 하날로 합쳐준 후 수자형으로 바꿔주어야 한다.
- Array.prototype.join() : 열의 모든 요소를 쉼표나 지정된 구분 문자열로 구분하여 연결한 새 문자열을 만들어 반환
- 다른 풀이
function solution(n) {
const newN = n + "";
const newArr = newN
.split("")
.sort()
.reverse()
.join("");
return +newArr;
}
모두 동일한 풀이지만 'n'을 문자로 만들 때 '+ ""'을 사용했으며, 숫자형으로 만들 때는 +를 붙여주었다.
<문제3> 두 정수 사이의 값
두 정수 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 | b | return |
3 | 5 | 12 |
3 | 3 | 3 |
5 | 3 | 12 |
- 내가 만든 코드
function solution(a, b) {
var answer = 0;
if(a > b) {
for(let i = b; i<=a;i++){
answer += i
}
} else if(a < b){
for(let i = a; i <= b; i++ ){
answer += i
}
} else {
answer = a
}
return answer;
a와 b 중 어느 수가 더 클지 모르기 때문에 각 상황에 대한 조건문을 만들어주었다.
작은 수를 i 값의 시작점으로 두고 큰수까지 더하며 answer 값을 구했다.
- 다른 풀이
function adder(a, b){
var result = 0
//함수를 완성하세요
return (a+b) * (Math.abs(a-b)+1) / 2;
}
내가 이 공식을 알지 못해 만들 수 없던 풀이
두 수 사이의 합을 구할 때 = (a + b) * ((절댓값 a-b) + 1) / 2
- Math.abs : 주어진 숫자의 절댓값을 반환
- 다른 풀이
function solution(a, b) {
if(a===b) return a;
let small = a < b ? a : b;
let big = a > b ? a : b;
for(let i = small+1; i < big+1; i++)
small += i;
return small;
}
삼항연산식을 통해 a와 b의 작은수와 큰 수를 정의해준 후 직접 작은 값에서 큰 값까지를 더해주는 풀이법.
'개발 기초 다지기' 카테고리의 다른 글
내일배움캠프 19일차 : 대표적인 HTTP 상태 코드 정리 (0) | 2024.05.15 |
---|---|
내일배움캠프 18일차 : forEach 정리 (0) | 2024.05.09 |
내일배움캠프 16일차 : 클로저 개념 (0) | 2024.05.07 |
내일배움캠프 15일차 : TMDB에서 API로 출연진&감독 정보 가져오기 (0) | 2024.05.05 |
내일배움캠프 14일차 : 알고리즘 문제 (평균값, 각 자릿수 합, x씩 증가하는 수) (1) | 2024.05.02 |
댓글