2025 / 01 / 22
오늘은 수업에서 내장 메소드와 for문 복습을 하였습니다.
그리고 어제 실습 예제에서 더 간단하게 풀 수 있는 내장 메소드를 알려주셔서 제가 작성한 코드에 적용하는 시간도 가졌습니다.
교수님꼐서 주신 실습 예제가 오늘은 3문제였는데, 문제 이해를 잘못해서 소수가 아닌 수를 구하는게 어려웠습니다..
하지만~ 결국은 답을 찾아서 기분이 좋았습니다.
자바스크립트 엔진에 의해 제공되는 미리 정의된 함수들을 의미합니다.
개발자가 별도로 구현하지 않고도 바로 사용할 수 있는 함수들입니다.
다양한 객체와 데이터 타입(배열, 문자열, 수학 계산 등)에 대해 유용한 작업을 할 수 있도록 제공됩니다.
① 자바스크립트 엔진에 의해 제공됩니다.
② 객체와 연관되어있습니다.
③ 표준화되어있습니다.
④ 다양한 데이터 타입에 적용할 수 있습니다.
① Array
② String
③ Math
④ Object
⑤ Date
- 자바스크립트에서 사전 정의되어 있기 때문에, 객체나 데이터 타입에 속하는 메소드들을 호출하는 방식으로 사용합니다.
- ex) 배열에 push() 메소드를 호출하면 배열에 새로운 값을 추가할 수 있습니다.
- 인스턴스 메소드 형태로 존재하며, 특정 객체의 인스턴스에서 호출할
- ex) arr.push()는 배열 arr의 인스턴스에서 호출되고, 그 배열을 변경합니다.
배열의 각 요소에 대해 주어진 함수를 실행하고 그 결과를 새로운 배열로 반환합니다.
배열을 변형하는 데 유용하며, 원본 배열을 변경하지 않고 새로운 배열을 반환하는 점이 특징입니다.
① 목적
② 반환값
③ 원본 배열 변화 여부
① 기본 사용법
const numbers = [1, 2, 3, 4];
const doubledNumbers = numbers.map(num => num * 2);
console.log(doubledNumbers); // [2, 4, 6, 8]
console.log(numbers); // [1, 2, 3, 4] (원본 배열은 변하지 않음)
② 인덱스를 사용하는 예시
const numbers = [10, 20, 30, 40];
const result = numbers.map((num, index) => num + index);
console.log(result); // [10, 21, 32, 43]
① 불변성
② 배열 크기
③ 다른 자료형 반환
const strings = ["hello", "world"];
const lengths = strings.map(str => str.length);
console.log(lengths); // [5, 5]
구구단 출력 프로그램 만들기
- 사용자에게 구구단 단을 입력받습니다.
- 해당 단까지의 구구단을 출력합니다.
- 0이나 1이 입력이 된다면 예외처리를 합니다.
- ex) 입력 : 3 / 출력 : 2 X 1 = 2 .... 3 X 9 = 27
사용자에게 구구단 단을 입력받습니다.
- 사용자가 구구단의 단을 입력하도록 prompt()를 사용하여 값을 입력받습니다.
let gugu = prompt("입력받고 싶은 구구단의 단을 입력해주세요!");
해당 단까지의 구구단을 출력합니다.
- 입력받은 단에 대해 for 루프를 이용해 구구단을 출력합니다.
- i는 구구단의 단을 나타내며, j는 1부터 9까지의 곱셈 결과를 출력합니다.
// 구구단 출력 (2단부터 입력받은 단까지) for(let i = 2; i <= gugu; i++){ document.write(`${i}단 <br>`); for(let j = 1; j < 10; j++){ document.write(`${i} * ${j} = ${i*j} <br>`); // 마지막 곱셈 후 줄바꿈 if(j == 9){ document.write(`<br>`); } } }
0이나 1이 입력이 된다면 예외처리를 합니다.
- 사용자가 0 또는 1을 입력했다면, 구구단의 범위로 적합하지 않기 때문에 경고 메시지를 띄우고, 올바른 값이 입력될 때까지 while 루프에서 계속해서 값을 받습니다.
while(true){ gugu = prompt("입력받고 싶은 구구단의 단을 입력해주세요!"); // '0' 또는 '1'을 입력받으면 다시 입력을 요구 if(gugu == "0" || gugu == "1"){ alert("다시 입력해주세요!"); continue; }else{ break; } }
- 위에서 작성한 코드를 하나로 합쳐 놓은 것입니다.
<script>
let gugu;
// 사용자로부터 구구단의 단을 입력받음
while(true){
gugu = prompt("입력받고 싶은 구구단의 단을 입력해주세요!");
// '0' 또는 '1'을 입력받으면 다시 입력을 요구
if(gugu == "0" || gugu == "1"){
alert("다시 입력해주세요!");
continue;
}else{
break;
}
}
// 구구단 출력 (2단부터 입력받은 단까지)
for(let i = 2; i <= gugu; i++){
document.write(`${i}단 <br>`);
for(let j = 1; j < 10; j++){
document.write(`${i} * ${j} = ${i*j} <br>`);
// 마지막 곱셈 후 줄바꿈
if(j == 9){
document.write(`<br>`);
}
}
}
</script>
소수 구분 프로그램 만들기
- 사용자에게 숫자를 입력받습니다.
- 소수인지 아닌지 판별합니다.
- 소수인 숫자와 소수가 아닌 숫자를 나눠서 출력합니다.
- ex) 입력 : 1,2,3,4,5,6,7,8
- ex) 출력 : 소수가 맞는 숫자 : 2,3,5,7 / 소수가 아닌 숫자 : 1,4,6,8
사용자에게 숫자를 입력받습니다.
- 사용자에게 prompt로 숫자를 입력받습니다.
- 기본 값으로 "1,2,3,4,5,6,7,8,9,10"를 넣어주었습니다.
let user = prompt("숫자를 입력해주세요", "1,2,3,4,5,6,7,8,9,10");
비교를 쉽게 하기 위해 새로운 배열에 숫자를 (",")을 기준으로 담아줍니다.
let num = user.split(",").map(item => parseInt(item, 10));
소수인지 아닌지 판별합니다.
- 소수가 맞는 숫자는 result라는 배열에 아닌 숫자는 result2라는 배열에 push합니다.
- num 배열을 순회하면서 각 숫자에 대해 소수 여부를 확인합니다.
- num[i]는 각 숫자를 나타내며, 이를 검사하기 위해 isPrime 변수를 true로 초기화합니다.
- 먼저 숫자가 1 이하인 경우 소수가 아니므로 isPrime을 false로 설정합니다.
- 그 외의 숫자에 대해서는 2부터 그 숫자보다 작은 수들로 나누어 떨어지는지 확인합니다.
- 나누어 떨어지면 소수가 아니므로 isPrime을 false로 설정하고 반복문을 종료합니다.
let result = []; // 소수만 저장할 배열 let result2 = []; // 소수가 아닌 수를 저장할 배열 // num 배열을 순회하면서 각 숫자에 대해 소수 여부를 확인 for (let i = 0; i < num.length; i++) { let isPrime = true; // 현재 숫자가 소수라고 가정 // 1 이하의 숫자는 소수가 아니므로 false 처리 if (num[i] <= 1) { isPrime = false; } else { // 2부터 num[i] - 1까지 나누어 떨어지는지 확인 for (let j = 2; j < num[i]; j++) { if (num[i] % j === 0) { // 나누어떨어지면 소수가 아님 isPrime = false; break; // 나눠 떨어졌으므로 더 이상 검사할 필요 없음 } } } // 소수일 경우 result 배열에 추가 if (isPrime) { result.push(num[i]); } else { // 소수가 아닌 경우 result2 배열에 추가 result2.push(num[i]); } }
소수인 숫자와 소수가 아닌 숫자를 나눠서 출력합니다.
- result와 result2를 각각 출력해줍니다.
document.write(`소수가 맞는 숫자는? ${result} <br><br>`); document.write(`소수가 아닌 숫자는? ${result2} <br>`);
- 위에서 작성한 코드를 하나로 합쳐 놓은 것입니다.
<script>
// 사용자로부터 숫자 입력 받기
let user = prompt("숫자를 입력해주세요", "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15");
// 입력받은 문자열을 배열로 변환하고, 각 항목을 정수로 변환
let num = user.split(",").map(item => parseInt(item, 10));
let result = []; // 소수만 저장할 배열
let result2 = []; // 소수가 아닌 수를 저장할 배열
// 숫자 배열을 순회하면서 소수 여부 확인
for (let i = 0; i < num.length; i++) {
let isPrime = true; // 현재 숫자가 소수라고 가정
// 1 이하의 숫자는 소수가 아니므로 false 처리
if (num[i] <= 1) {
isPrime = false;
} else {
// 2부터 num[i] - 1까지 나누어 떨어지는지 확인
for (let j = 2; j < num[i]; j++) {
if (num[i] % j === 0) { // 나누어 떨어지면 소수가 아님
isPrime = false;
break; // 더 이상 검사할 필요 없음
}
}
}
// 소수일 경우 result 배열에 추가
if (isPrime) {
result.push(num[i]);
} else {
// 소수가 아닌 경우 result2 배열에 추가
result2.push(num[i]);
}
}
// 소수인 숫자들을 출력
document.write(`소수가 맞는 숫자는? ${result} <br><br>`);
// 소수가 아닌 숫자들을 출력
document.write(`소수가 아닌 숫자는? ${result2} <br>`);
</script>
랜덤한 비밀번호 만들기
- 각각 글자 / 숫자 / 문자가 저장되어있는 배열을 생성합니다.
- prompt를 통해 각각의 글자, 숫자, 특수문자의 개수를 입력받습니다.
- 입력 받은 갯수에 따라 랜덤으로 출력합니다.
- 출력 받은 글자 / 숫자 / 문자를 다시 섞어서 랜덤으로 배치합니다.
- 랜덤으로 섞인 비밀번호를 출력합니다.
각각의 글자 / 숫자 / 문자가 저장되어있는 배열을 생성합니다.
- letters - 알파벳 소문자를 저장한 배열
- numbers - 0부터 9까지의 숫자를 저장한 배열
- symbols - 특수문자들을 저장한 배열
const letters = [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ]; const numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const symbols = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")"];
prompt를 통해 각각의 글자, 숫자, 특수문자의 개수를 입력받습니다.
- 비밀번호에 섞고 싶은 개수를 작성받습니다.
let letter = Number(prompt("몇 개의 글자를 섞으실건가요?")); let number = Number(prompt("몇 개의 숫자를 섞으실건가요?")); let symbol = Number(prompt("몇 개의 문자를 섞으실건가요?"));
입력 받은 갯수에 따라 랜덤으로 출력합니다.
- 랜덤으로 나온 숫자를 배열의 인덱스로 사용하여 값을 출력합니다.
- 나온 값을 Allresult라는 빈 배열에 담아줍니다.
let Allresult = []; for (let i = 0; i < letter; i++) { let result = Math.floor(Math.random() * letters.length); Allresult.push(letters[result]); } for (let i = 0; i < number; i++) { let result = Math.floor(Math.random() * numbers.length); Allresult.push(numbers[result]); } for (let i = 0; i < symbol; i++) { let result = Math.floor(Math.random() * symbols.length); Allresult.push(symbols[result]); }
출력 받은 글자 / 숫자 / 문자를 다시 섞어서 랜덤으로 배치합니다.
1) Fisher-Yates Shuffle 알고리즘 사용(셔플)
- 처음 배열의 인덱스 i와 무작위 인덱스 j의 자리를 교환하여 배열을 섞습니다.
for (let i = Allresult.length - 1; i > 0; i--) { let j = Math.floor(Math.random() * (i + 1)); // i와 j의 값을 swap [Allresult[i], Allresult[j]] = [Allresult[j], Allresult[i]]; } console.log(Allresult.join(''));
2) splice 내장 메소드 사용
- 랜덤으로 받은 값을 넣을 Allresult2라는 빈 배열을 선언합니다.
- randomIndex에 해당하는 번호를 가진 Allresult의 배열의 내용을 Allresult2 배열에 추가합니다.
- splice( )는 Allresult 배열에서 randomIndex 위치에 있는 요소를 삭제합니다.
- 두 번째 인자로 1을 넘기면, 하나의 요소만 삭제됩니다.
let Allresult2 = []; while (Allresult.length > 0) { let randomIndex = Math.floor(Math.random() * Allresult.length); Allresult2.push(Allresult[randomIndex]); Allresult.splice(randomIndex, 1); }
랜덤으로 섞인 비밀번호를 출력합니다.
- 섞인 글자 / 숫자 / 문자가 담긴 Allresult2라는 배열을 출력해줍니다.
document.write(`당신의 비밀번호는 ${Allresult2} 입니다.`);
- 위에서 작성한 코드를 하나로 합쳐 놓은 것입니다.
<script>
const letters = [
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
];
const numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const symbols = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")"];
let letter = Number(prompt("몇 개의 글자를 섞으실건가요?"));
let number = Number(prompt("몇 개의 숫자를 섞으실건가요?"));
let symbol = Number(prompt("몇 개의 문자를 섞으실건가요?"));
document.write(`글자는 ${letter}개 <br>`);
document.write(`숫자는 ${number}개 <br>`);
document.write(`문자는 ${symbol}개 <br>`);
let Allresult = [];
let Allresult2 = [];
for (let i = 0; i < letter; i++) {
let result = Math.floor(Math.random() * letters.length);
Allresult.push(letters[result]);
}
for (let i = 0; i < number; i++) {
let result = Math.floor(Math.random() * numbers.length);
Allresult.push(numbers[result]);
}
for (let i = 0; i < symbol; i++) {
let result = Math.floor(Math.random() * symbols.length);
Allresult.push(symbols[result]);
}
document.write(`선정된 문자는 ${Allresult} 입니다. <br>`);
console.log(Allresult);
/*
// Fisher-Yates Shuffle 알고리즘을 이용하여 배열 섞기
for (let i = Allresult.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
// i와 j의 값을 swap
[Allresult[i], Allresult[j]] = [Allresult[j], Allresult[i]];
}
console.log(Allresult.join(''));
*/
while (Allresult.length > 0) {
let randomIndex = Math.floor(Math.random() * Allresult.length);
Allresult2.push(Allresult[randomIndex]);
Allresult.splice(randomIndex, 1);
}
document.write(`당신의 비밀번호는 ${Allresult2} 입니다.`);
console.log(Allresult2);
</script>
15일차 후기
- 내장 메소드가 어떤 자료형에 무엇이 적용되는지 따로 알 수 있었습니다.
- 사용해보면서 내가 안써본 메소드가 진짜 많다는게 느껴졌다.
- 소수가 아닌 수를 구하는 문제에서 소수가 아니란 뜻은 합성수랑 1을 포함하는건데 말그대로 1은 합성수도 아니라 빼려고 하다가 시간이 진짜 많이 걸렸다.
- 제한 시간 내에는 제출하지 못했지만 결국은 끝까지 해서 완성했다.
- 마지막 실습예제는 메소드를 안쓰고 배열을 섞으려고 하니까 좀 어려웠다..
- 메소드 없는 것도 구현을 했는데 반복을 많이 돌리다보니 로딩이 너무 오래 걸리길래 그냥 놔두고 편한대로 셔플이나 내장 메소드로 다시 구현했다.
- 오늘 머리를 너무 썼나.. 머리가 너무 아팠다. へ( ̄ ∇  ̄へ)