< 목차 >
1. [09:00~10:00] 코드카타 문제 풀이
(1) 수박수박수박수박수박수?
(2) 내적
(3) 약수의 개수와 덧셈
2. Number.isInteger()
3. Math.sqrt
4. 오늘 작성한 코드
5. 금일 소감
1. [09:00~10:00] 코드카타 문제 풀이
(1) 수박수박수박수박수박수?
문제 설명
: 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하라. 예를 들어, n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 된다.
제한사항
: n은 길이 10,000이하인 자연수다.
문제를 보고 답안 작성하며 '뭐야.. 왜 이렇게 easy하지?.. 뭔가 이상해' 하면서 풀었다. 심지어 테스트 돌렸는데 통과됐길래 바로 제출도 '설마..!?' 하고 해봤더니 역시나 통과하지 못했다 ㅋㅋㅋㅋㅋ 표면적인 것만 해결한 것이었다.
내가 작성한 답안
function solution(n) {
return n === 4 ? "수박수박" : "수박수"
}
다시 작성한 답안
// 문자열을 split을 이용하여 "수박수"(3글자), "수박수박"(4글자)로 자른다
// 문자열을 반복해서 return하는 함수를 만든다
// 근데 반복되는 문자열을 리턴하라는 게 3이면 "수박수"이고, 33이면 "수박수박수박"인가?
function solution(n) {
let str = "수박수박수박수";
return n === 4 ? str.repeat(1) : "수박수"
}
다시 주석을 달아 어떤 걸 사용해서 풀어야 할지 곰곰이 생각하며 작성해봤다. 문제가 뭔가 애매해서 '내가 잘 이해한가 맞나?' 싶은 생각도 들었다. 일단 대충 이런 느낌으로 작성되지 않을까 해서 작성해두고, 답안을 보았다.
정답 코드
function solution(n) {
return "수박".repeat(n).substring(0, n)
}
아니 내가 쓴 것보다 더 간단한.... 와 substring 메서드랑 함께 사용하면 더 간단하게 풀 수 있구나... 싶었다. 그리고 숫자 크기에 따라서 한 글자씩 반복된다는 의미였다는 걸 알았다. 문제를 확실히 알고 정답도 이렇게나 명료하게 알게 되어 재밌었다.
(2) 내적
내적..? 뭐지 이게? 싶어서 당장 검색부터 했다. 수학을 마지막으로 한 지가 몇 년 되었더라... 내적은 기억도 안 나서 '내적? 그게 뭔데.. 그거 어떻게 하는 건데' 싶었다. 당장 알아봐
내적 | 內積
: 내적은 벡터를 마치 수처럼 곱하는 개념
적은 '쌓는다'는 뜻의 한자이고, 여기서는 '곱한다'는 뜻이다.
벡터에는 방향이 있으므로, 방향이 일치하는 만큼만 곱한다. 예를 들어 두 벡터의 방향이 같으면, 두 벡터의 크기를 그냥 곱한다. 두 벡터가 이루는 각이 90도일 땐, 일치하는 정도가 전혀 없기 때문에 내적의 값은 0이다. 내적은 한 벡터를 다른 벡터로 정사영시켜서, 그 벡터의 크기를 곱한다.
문제 설명
길이가 같은 두 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의 길이)
제한사항
(1) a, b의 길이는 1 이상 1,000 이하다.
(2) a, b의 모든 수는 -1,000 이상 1,000 이하다.
음... 곱해서 더하는 것 같은데 문제가 정확히 이해된 게 아니라서 정답 코드와 자료를 더 찾아봤다. 답안 코드는 다음과 같다. for in문으로 두 배열을 순회하였고, 각 n 번째의 값을 곱한 값들을 모두 더했다. 각 값에 접근한 후, 대소 비교가 아닌 곱하기 연산자를 이용하여 얻은 값에 누적한 값으로 구하였다. 정답을 아니 간단한 문제였다. 모르는 개념이 나와도 익숙하지 않은 것일 뿐이니 쫄지 말자
정답 코드
function solution(a, b) {
let result = 0;
for (let i in a) {
result += a[i] * b[i]
}
return result;
};
[Reference]
(1) '내적'의 정의: [위키독스] https://wikidocs.net/22384
(2) 답안 코드 및 해설
(3) 약수의 개수와 덧셈
문제 설명
두 정수 left와 right가 매개변수로 주어진다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해 보자.
제한사항
1 ≤ left ≤ right ≤ 1,000
문제를 읽고 주석으로 해야 할 것을 잘게 쪼개서 작성을 먼저 해보았다. 코딩을 할 때 가장 중요한 것 중 하나가 해야 할 것을 잘게 쪼개서 순서에 맞춰 작성하는 것이라고 생각해서 계속해서 트레이닝하는 중이다.
(1) left와 right의 약수를 먼저 구한다.
(2) 약수의 개수가 짝수면 더한다.
(3) 홀수면 뺀 결과를 반환한다.
(4) 약수를 구하는 코드와 for문 사용
약수를 구하는 코드를 작성하지 못하겠어서 정답 코드를 보며 이해했다. 그리고 내가 주석으로 작성한 1번에서 빠트린 게 있었다. 문제 설명에 'left부터 right까지의 모든 수들 중에서'라는 것에 집중했어야 했는데 left 수와 right 수를 나눠서 생각했다. 문제를 좀 더 꼼꼼히 여러 번 보는 것이 필요하겠다 싶었다. 그리고 문제를 확실하게 알아야 답안을 정확히 작성할 수 있으니 문제를 확실하게 이해하는 데에 집중 및 시간을 더 할애해야겠다 싶었다.
Math 함수.. 정말 자주 나온다. Math 함수 관련해서 오늘부터 꾸준히 공부해야겠다.
MDN | Math
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math
정답 코드
function solution(left, right) {
let answer = 0;
for(let i = left; i <= right; i++) {
if(Number.isInteger(Math.sqrt(i))) answer -= i;
else answer += i;
}
return answer;
}
[Reference]
답안 코드 및 해설
2. Number.isInteger()
: 주어진 값이 정수인지 판별
기본 형태
Number.isInteger(value);
매개변수
value: 정수인지 확인하려는 값
반환 값
주어진 값의 정수 여부를 나타내는 Boolean
설명
매개변수의 값이 정수면 true를, 아니면 false를 반환한다. 값이 NaN이거나 Infinity여도 false를 반환한다.
예시 코드
Number.isInteger(0); // true
Number.isInteger(1); // true
Number.isInteger(-100000); // true
Number.isInteger(99999999999999999999999); // true
Number.isInteger(0.1); // false
Number.isInteger(Math.PI); // false
Number.isInteger(NaN); // false
Number.isInteger(Infinity); // false
Number.isInteger(-Infinity); // false
Number.isInteger("10"); // false
Number.isInteger(true); // false
Number.isInteger(false); // false
Number.isInteger([1]); // false
[Reference]
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
3. Math.sqrt
: 숫자의 제곱근을 반환
만약 x가 음수라면 Math.sqrt() 함수는 NaN를 반환한다.
기본 형태
Math.sqrt(x);
예시 코드
Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095
Math.sqrt(1); // 1
Math.sqrt(0); // 0
Math.sqrt(-1); // NaN
4. 오늘 작성한 코드
interface Student {
name: string;
age: number;
scores: {
korean: number;
math: number;
society: number;
science: number;
english: number;
};
}
function assignGrade(average: number): string {
if (average >= 90) {
return 'A';
} else if (average >= 80) {
return 'B';
} else if (average >= 70) {
return 'C';
} else if (average >= 60) {
return 'D';
} else {
return 'F';
}
}
function calculateAverage(student: Student): number {
const sum =
student.scores.korean +
student.scores.math +
student.scores.society +
student.scores.science +
student.scores.english;
const average = sum / Object.keys(student.scores).length;
return average;
}
function createStudent(
name: string,
age: number,
korean: number,
math: number,
society: number,
science: number,
english: number
): Student {
return {
name,
age,
scores: {
korean,
math,
society,
science,
english,
},
};
}
function printResult(student: Student): void {
const average = calculateAverage(student);
const grade = assignGrade(average);
console.log(`${student.name} (${student.age}세) - 평균: ${average.toFixed(2)}, 학점: ${grade}`);
}
function main(): void {
const spartan = createStudent('Spartan', 30, 95, 89, 76, 90, 97);
printResult(spartan);
}
main();
5. 금일 소감
아 피곤하다,, 오늘은 타입스크립트 강의 들었고 과제를 하기 위해 환경 세팅했다. 강의 내용만으로는 과제에 적용이 어려울 것 같아서 특강도 듣고 다른 자료도 알아보며 공부하는 중이다. 내일까지 최대한 빨리 과제 끝내고 좀 쉬든가 해야겠다. 넘 피곤하다... 낼도 파이팅!!!
'[Front-end] 개발자 공부' 카테고리의 다른 글
[개발 공부 53일차] join, while, for...in, trim (0) | 2024.03.11 |
---|---|
[개발 공부 52일차] parseInt(), toUpperCase() | 문자열 다루기 기본 (2) | 2024.03.08 |
[개발 공부 50일차] substr(), Set | 가운데 글자 가져오기 (0) | 2024.03.06 |
[개발 공부 49일차] TypeScript, 왜 사용할까? | 하샤드 수 (6) | 2024.03.05 |
[개발 공부 48일차] Scope Chain, 재귀적 수행 | JS 문법 재청강 (2) | 2024.03.04 |