connecting dots

프로그래머스 | 나이 출력, 숫자 비교하기, 두 수의 합, 두 수의 나눗셈, 각도기 본문

Coding Test

프로그래머스 | 나이 출력, 숫자 비교하기, 두 수의 합, 두 수의 나눗셈, 각도기

dearsuhyun 2024. 6. 9. 21:03

1) 나이 계산

머쓱이는 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 2022년 기준 선생님의 나이 age가 주어질 때, 선생님의 출생 연도를 return 하는 solution 함수를 완성해주세요.

 

# solution.js

function solution(age) {
    const answer = (2022 - age + 1);
    return answer;
}

console.log(solution(48))
💡 2022년 기준이라고 해서 2022에서 age를 빼고 + 1을 해줌
age는 나이이니까 정수일 것이라 따로 다른 코드를 넣는다던가 ? (Math.floor 같은 ..)
하지 않아도 될 것이라고 생각함

 

# 다른 사람의 풀이

function solution(age) {
    return new Date().getFullYear() - age + 1;
}

// 문제는 2022년 기준이므로 2024년인 지금 이렇게 풀면 틀리지만
// 2022년에 이 문제 출제자는 이걸 의도한게 아닐까 하는 다수 의견 ..

—> 생성자 함수 ? getFullYear ?

 

new Date().getFullYear()는 현재 날짜와 시간을 나타내는 Date 객체를 생성하고,
그 객체의 getFullYear() 메서드를 호출하여 현재 연도를 반환하는 코드입니다.

  1. new Date() 객체 생성
  2. const now = new Date(); // 현재 날짜와 시간을 나타내는 Date 객체를 생성
  3. 객체의 메서드 호출:

• 생성된 Date 객체에는 날짜와 시간을 다룰 수 있는 여러 메서드가 포함되어 있습니다. getFullYear()도 그 중 하나입니다.

getMonth, getDay, getTime … etc

• .은 객체의 속성이나 메서드에 접근하기 위한 연산자입니다.

const year = now.getFullYear(); 
// 현재 Date 객체의 연도를 가져옴



연결:

• new Date().getFullYear()는 new Date()로 새로운 Date 객체를 생성하고, 바로 그 객체의 getFullYear() 메서드를 호출합니다.

• 이렇게 하면 중간에 변수를 선언하지 않고도 현재 연도를 가져올 수 있습니다.

// 현재 날짜와 시간을 나타내는 Date 객체를 생성하고, 해당 객체의 연도를 가져옴
const currentYear = new Date().getFullYear();

console.log(currentYear); // 현재 연도가 출력됩니다, 예: 2024

 

 

2) 숫자 비교하기

정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.

 

# solution.js

function solution(num1, num2) {
    if (num1 === num2) {
        return 1
    }
    else {
        return -1
    }
}

console.log(solution(2,10))
💡 if 조건문 사용. 조건이 두 수가 같거나 다른 두 가지 경우 밖에 없어서
if / else 사용 (else if 사용 x)
* 비교 연산자 사용 주의 (처음에 습관대로 =만 쳤다가 오답이어서 멘붕 .. ㅎ)

 

# 다른 사람의 풀이

function solution(num1, num2) {
    var answer = num1 === num2 ? 1 : -1;
    return answer;
}

 

--> 삼항연산자 ?

조건문을 간결하게 작성할 수 있는 유용한 도구
- 기본 형태
조건 ? 참일 때의 값 : 거짓일 때의 값​

const age = 20;
const status = (age >= 20) ? "성인" : "미성년자";
console.log(status);

// ? 앞에 있는 값이 true이면 :의 앞 부분 실행
// 거짓이면 :의 뒤 부분 실행
// 출력: "성인"


 

 

 

3) 두 수의 합

정수 num1과 num2가 주어질 때, num1과 num2의 합을 return하도록 soltuion 함수를 완성해주세요.

 

# solution.js

function solution(num1, num2) {
    const answer = (num1 + num2);
    return answer;
}

console.log(solution())
💡 두 수의 합 ‘+’ 이용

—> 괄호 안에 인수를 제공하지 않아도 되는건가 ?

 

solution 함수가 두 개의 매개변수 num1과 num2를 필요로 하기 때문에, 이 함수를 호출할 때는 두 개의 인수를 제공해야 합니다. 만약 인수를 제공하지 않고 호출하면, num1과 num2가 undefined로 설정되어 undefined + undefined를 계산하게 되므로 결과는 NaN이 됩니다.

function solution(num1, num2) {
    const answer = (num1 + num2);
    return answer;
}

console.log(solution()); // NaN 출력, num1과 num2가 undefined로 설정됨
console.log(solution(3, 4)); // 7 출력, num1은 3, num2는 4

 

인수를 제공하지 않고 함수를 호출하면 NaN이 반환되므로, 항상 필요한 인수를 제공하는 것이 중요합니다.

// 잘못된 호출 - 인수가 제공되지 않음
console.log(solution()); // NaN 출력

// 올바른 호출 - 인수가 제공됨
console.log(solution(3, 4)); // 7 출력



 

 

—> console.log(solution()) 과 console.log(solution)의 차이

console.log(solution()): 함수 호출 후 그 반환 값을 출력. console.log(solution): 함수 자체를 출력. (함수의 정의 출력)
console.log(solution()): 
• solution()는 함수를 호출하는 것을 의미합니다. 즉, num1과 num2의 값을 더한 결과를 반환하는 함수를 실행하게 됩니다. 
• 예를 들어, console.log(solution(3, 4))라고 하면, solution(3, 4)는 3 + 4를 계산하여 7을 반환하므로 console.log(7)이 실행됩니다. 
• 결과적으로 7이 출력됩니다.

 

 

4) 두 수의 나눗셈

정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

 

# solution.js

function solution(num1, num2) {
    const answer = Math.floor((num1 / num2)*1000);
    return answer;
}

console.log(solution(10,2))
💡 ‘num1을 num2로 나눈 값’에 1000을 곱하라고 해서 나누기 계산이 우선할 수 있게 ( )로 감싸줌
정수 부분을 return 하라고 해서 나눗셈과 곱셈으로 나온 값에 Math.floor 사용하여 소수점 이하를 버릴 수 있게 함

 

Math.floor:

• 양수: 소수점 이하를 내림.

• 음수: 소수점 이하를 더 작은 정수로 내림.

• 사용 예: 가격 계산에서 버림 처리, 음수의 절대값 계산에서 더 작은 정수로 내림 처리 필요할 때.
Math.trunc:
• 소수점 이하를 단순히 버림 (양수와 음수 모두 동일하게 처리).
• 사용 예: 좌표 계산에서 소수점 이하를 버릴 때, 부호에 관계없이 정수 부분만 필요할 때.
상황에 따라 둘 중 어느 것이 더 적합한지 판단하여 사용하면 됩니다. 예를 들어, 음수 처리 방식이 중요한 경우에는 Math.floor를 사용하고, 단순히 정수 부분만 필요할 때는 Math.trunc를 사용하는 것이 좋습니다.

 

# 다른사람의 풀이

function solution(num1, num2) {
    return ~~(num1/num2*1000);
}

 

--> ~~ 연산자

자바스크립트에서 ~~ 연산자는 이중 틸드(Double Tilde) 연산자로, 숫자의 소수 부분을 제거하고 정수 부분만 남기기 위해 사용됩니다. 이 연산자는 비트 연산자로 작동하며, 그 기능을 이해하기 위해 먼저 비트 연산에 대해 알아볼 필요가 있습니다.

비트 연산자
자바스크립트에는 여러 비트 연산자가 있습니다. ~ 연산자는 비트 NOT 연산자입니다. 숫자의 각 비트를 반전시킵니다. 예를 들어, 5의 비트 표현은 0101이고, ~5는 모든 비트를 반전시켜 1010이 됩니다. 그러나 자바스크립트에서 이 결과는 2의 보수를 취하여 -6이 됩니다.

이중 틸드 연산자 (~~)
~~ 연산자는 ~ 연산자를 두 번 사용하여 숫자의 소수 부분을 제거하는 편리한 방법입니다. 이는 비트 연산자의 특성을 활용한 것으로, 다음과 같은 과정으로 동작합니다:

1. 첫 번째 틸드 (~):
• 숫자의 비트를 반전시킵니다.
2. 두 번째 틸드 (~):
• 다시 한 번 비트를 반전시켜 원래 숫자에 근접한 값을 만듭니다.
• 이때, 소수점 이하의 값은 제거되고 정수 부분만 남게 됩니다.

결과적으로, 이중 틸드 연산자는 소수점 이하를 버리고 정수 부분만 반환합니다. 이는 Math.floor()나 parseInt()와 유사한 역할을 합니다.

let num = 5.78;
let result = ~~num;
console.log(result);  // 출력: 5

let num = -5.78;
let result = ~~num;
console.log(result);  // 출력: -5​
let num = 5.78;

console.log(~~num);         // 출력: 5
console.log(Math.floor(num)); // 출력: 5
console.log(parseInt(num));  // 출력: 5​


 

 

5) 각도기

각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

 

# solution.js

function solution(angle) {
    if (0 < angle && angle < 90) {
        return 1
    } 
    else if (angle === 90) {
        return 2
    }
    else if (90 < angle && angle < 180) {
        return 3
    }
    else if (angle === 180) {
        return 4
    }
}

 

처음 시도했을 때는 '0 < angle < 90'라고 설정했는데 자바스크립트에서는 위 조건을
두개로 분리해야 한다는 것을 배우게 됨. 수정함 !
그리고 마지막에 4를 출력해야 하는 부분에서 'else'를 사용했는데 오류.
이 문제의 경우 angle이 180이어야 한다는 분명한 조건이 있으니 else if일까 ? 하며 수정.

 

--> else if와 else의 차이점은 뭘까 ?

• else if 조건문은 첫 번째 if 조건이 거짓(false)일 때, 다른 조건을 평가하고 그 조건이 참일 때 실행되는 코드를 정의합니다. 여러 개의 else if 조건문을 사용할 수 있습니다.
• else 조건문은 모든 if와 else if 조건이 거짓일 때 실행되는 코드를 정의합니다. else는 조건을 가지지 않습니다.

if (조건1) {
    // 조건1이 참일 때 실행되는 코드
} else if (조건2) {
    // 조건1이 거짓이고 조건2가 참일 때 실행되는 코드
} else {
    // 조건1과 조건2가 모두 거짓일 때 실행되는 코드
}​

 

# 다른 사람의 풀이

function solution(angle) {
    return [0, 90, 91, 180].filter(x => angle>=x).length;
}

 

--> Array.prototype.filter() 메서드

 

자바스크립트의 `Array.prototype.filter()` 메서드는 배열에서 특정 조건을 만족하는 요소들만을 포함하는 새로운 배열을 만듭니다. 즉, 원본 배열의 요소를 하나씩 검사하여 주어진 조건에 맞는 요소들만 모아서 새로운 배열을 반환합니다.

### 동작 방식
`filter` 메서드는 배열의 각 요소에 대해 주어진 함수(콜백 함수)를 호출하여, 그 함수가 `true`를 반환하는 요소들만 포함하는 새로운 배열을 반환합니다. 원본 배열은 변경되지 않습니다.

## 예제: 짝수만 걸러내기
let numbers = [1, 2, 3, 4, 5, 6];
let evenNumbers = numbers.filter(function(number) {
    return number % 2 === 0;
});

console.log(evenNumbers);  // 출력: [2, 4, 6]

 

이 예제에서 `filter` 메서드는 각 숫자가 짝수인지(`number % 2 === 0`)를 검사하여 `true`인 요소들만 새로운 배열에 포함합니다.

## 화살표 함수 사용
let numbers = [1, 2, 3, 4, 5, 6];
let evenNumbers = numbers.filter(number => number % 2 === 0);

console.log(evenNumbers);  // 출력: [2, 4, 6]​

## 특정 문자열을 포함하는 요소 필터링
let words = ['apple', 'banana', 'grape', 'kiwi', 'mango'];
let wordsWithA = words.filter(word => word.includes('a'));

console.log(wordsWithA);  // 출력: ['apple', 'banana', 'grape', 'mango']​

이 예제에서는 문자열에 'a' 문자가 포함된 요소들만 필터링합니다.

### 요약
- `filter` 메서드는 배열의 각 요소를 검사하여 조건을 만족하는 요소들만을 포함하는 새로운 배열을 만듭니다.
- 원본 배열은 변경되지 않습니다.
- 조건을 정의하는 함수(콜백 함수)를 인수로 받아 각 요소를 검사합니다.

 

--> .length

자바스크립트에서 배열(Array), 문자열(String) 등의 길이나 크기를 반환하는 속성입니다. 이는 메서드가 아니라 속성이기 때문에 괄호 ()를 사용하지 않습니다.

1) 배열의 length 속성: 배열에 있는 요소의 개수 반환
let fruits = ['apple', 'banana', 'cherry'];
console.log(fruits.length); // 출력: 3​

2) 문자열의 length 속성: 문자열에 포함된 문자의 개수 반환
let text = "hello, world";
console.log(text.length); // 출력: 12​

3) 객체에서의 length
let person = {
	name: "Alice",
    age: "23",
    city: "Geneva"
};

// 객체의 키의 개수를 구할 때 Object.keys()를 사용
console.log(Object.keys(person).length); // 출력 3​

 

--> 화살표 함수 (축약형이 가능한 함수)

// 일반 함수
const double = function (x) {
	return x * 2
};
console.log('double: ', double(7))

// 화살표 함수
const doubleArrow = (x) => x * 2;
console.log('doubleArrow: ', doubleArrow(7))

 

const double = function(x, y) {
	return x * 2
}
console.log('double: ', double(7))

const doubleArrow = (x, y) => x * 2
console.log('doubleArrow: ',doubleArrow(7))

const doubleArrow = x => x * 2
console.log('doubleArrow: ',doubleArrow(7))
// 매개변수가 하나일 때는 소괄호도 생략 가능

 

//화살표 함수로 객체데이터를 반환할 때는 ({소괄호로 중괄호를 감싸줘야 함})
const doubleArrow = x => ({name: 'suhyun'})
console.log('doubleArrow', doubleArrow (7))

// 출력: doubleArrow { name: 'heropy' }

 

const rollDie = () => (
	Math.floor(Math.random() * 6) + 1;
)
// 임시적 반환(implicit return) return 없어도 소괄호로 감싸면 오류없이 출력
// 표현식이 단 하나라서 반환할 값이 분명할 때 쓰임

const add (a, b) => a + b;
// 한줄 코드
Math.random()
- 0과 1 사이의 무작위 소수를 반환

Math.floor(Math.random() * 6)
- 0에서 5 사이의 정수를 반환

Math.floor(Math.random() * 6) + 1
- 1을 더하여 결과 값을 1에서 6 사이의 정수로 만듦.
==> 1부터 6까지의 무작위 정수가 생성됨
반응형