makeDigits2
문제
수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴해야 합니다.
입출력 예시
let output = makeDigits2(5);
console.log(output); // --> "1-2-3-4-5"
output = makeDigits2(7);
console.log(output); // --> "1-2-3-4-5-6-7"
---
function makeDigits2(num) {
//수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴해야 합니다.
//숫자(number string) 사이를 '-'로 구분합니다. ('1-2-3-4-5')
let result = '1' //string 타입을 리턴 이때 1부터 시작
let i = 2 // while문 시작
while (i<=num){
result = result + `-${i}`;
i++;
}
return result
}
// for문과 while문 차이 숙지
// 백틱``사용
getMaxNumberFromString
문제
숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.
주의 사항
- 반복문(for)문을 사용해야 합니다.
- str.split 사용은 금지됩니다.
- 빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.
입출력 예시
let output = getMaxNumberFromString('53862');
console.log(output); // --> '8'
output = getMaxNumberFromString('4321');
console.log(output); // --> '4'
---
function getMaxNumberFromString(str) {
//숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.
//string 타입을 리턴해야 합니다.
//str.split 사용은 금지됩니다.
//빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.
let str = '0';
for (let i=0; i<str.lenght; i++){
if
}
}
// *****************************
// 해석본듣고 수정하기
// 페어랑 문제 해결
function getMaxNumberFromString(str) {
//숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.
//string 타입을 리턴해야 합니다.
//str.split 사용은 금지됩니다.
//빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.
let result= '0';
for (let i=0; i<str.length; i++){
if (str[i] > result) { // 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.
result = str[i];
}
}
return result;
}
선생님 해석 본
function getMaxNumberFromString(str) {
// 문자열을 입력 받는다 '53862'
// 출력 '8'
// 문제가 있다. 문자열끼리 비교가 가능????? 안된다.
// 숫자끼리 비교해야 하는데, 어떻게 비교하죠?
// Tip!
// 컴퓨터에게 가장 긴 거, 가장 큰 거 판단하게 하는 방법
// 기준을 하나 만들어 놓고,
// 그 기준과 비교해서 더 크면(또는 길면) 기준 교체
// 기준은 0
let max = 0;
for(let i = 0; i < str.length; i++) {
// str[0]가 max보다 크면, max는 지금부터 str[0]
if (Number(str[i]) > max) {
max = Number(str[i]); // Number () 를 붙여야 숫자값으로 반환
}
}
// 8
return String(max); // 문제에서 문자열로 리턴해야 했기 때문에
} // String() 사용
// 여러분이 나중에 코드를 짜실때
// 이런 암묵적 형변환을 생각하지 않고 짜는게 더 좋은 코드
// 장점보단 단점이 훠어어어어어얼씬
// 오류가 나야 되는데 안나요.
replaceAll
문제
문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴해야 합니다.
입출력 예시
let output = replaceAll('loop', 'o', 'e');
console.log(output); // --> 'leep'
----
function replaceAll(str, from, to) {
// 문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴해야 합니다.
// string 타입을 리턴해야 합니다.
let result = ''
for (i=0; i<str.length; i++) {
if (str[i] === from) {
result = result + to
} else {
result = result + str[i]
}
}
return result
}
// ******
// 해설 듣고 수정하기
// 페어랑 문제해결
function replaceAll(str, from, to) {
let result = ''; // string 타입의 문자열
for (let i = 0; i<str.length; i++){ // 문자열은 0부터 시작
if (str[i] === from) { // 문자 중 from과 같다면
result = result + to; // ''+ to로 변경 -> 'to' 로 변경
} else { // 그 외
result = result + str[i]; // '' + 원래 문자
}
}
return result;
}
isPrime
문제
1 이상의 자연수를 입력받아 소수(prime number)인지 여부를 리턴해야 합니다.
입출력 예시
let output = isPrime(2);
console.log(output); // --> true
output = isPrime(6);
console.log(output); // --> false
output = isPrime(17);
console.log(output); // --> true
----
//페어랑 문제해결
function isPrime(num) {
if (num === 1){ // 소수는 1보다 커야한다.
return false;} // 2를 제외한 짝수는 소수가 아니다. (2는 소수)
if (num === 2){
return true;}
if (num%2 === 0){
return false;}
let result = Math.sqrt(num); //Math.sqrt(x) x의 제곱근
for (let i=3; i<result; i++){ // 소수의 정의 1하고만 나눠지는 숫자
if(num%i === 0){
return false;
}
}
return true; //****************
}
선생님 해석
// 수학에서 1과 그수 자신 이외에는 자연수로 나눌 수 없는, 1보다 큰 자연수
// 1. 소수는 1보다 커야 한다.
// 2. 2를 제외한 짝수는 소수가 아니다 (2는 소수)
// 3. 3부터 자기 자신 '전'까지 나누어 떨어지는 수가 하나라도 있으면, 소수가 아니다.
function isPrime(num) {
// 제곱근 Math.sqrt()
let sqrt = Math.sqrt(num);
// 1이면 소수가 아니다.
if (num === 1) {
return false;
}
// 짝수는 소수가 아니다 (2를 제외하고)
if (num === 2) {
return true;
}
if (num % 2 === 0) {
return false;
}
// 3. 3부터 자기 자신 '전'까지 나누어 떨어지는 수가 하나라도 있으면, 소수가 아니다.
for (let i = 3; i < sqrt; i++) {
// num = 12
// 1 * 12
// 2 * 6
// 3 * 4
// 12의 제곱근 * 12의 제곱근
// 4 * 3
// 6 * 2
// 12 * 1
if (num % i === 0) {
return false;
}
}
return true;
}
listPrimes
문제
2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 합니다.
입출력 예시
let output = listPrimes(2);
console.log(output); // --> '2'
output = listPrimes(6);
console.log(output); // --> '2-3-5'
output = listPrimes(18);
console.log(output); // --> '2-3-5-7-11-13-17'
선생님 해석 본
function listPrimes(num) {
// 이중반복문
// 9번 문제는 그냥 어떤 수가 소수인지 판단
// 문자열을 리턴
// ex) num = 12, '2-3-5-7-11'
// 외부 반복문 : 2부터 자기자신(num)까지 반복하면서 이 수가 소수인지 판단
// 내부 반복문 : 이 수가 소수인지 판단 (9번 문제)
let result = '2';
for (let i = 3; i <= num; i += 2) {
let isPrime = true;
// sqrt 사용해도 됩니다.
for (let j = 3; j < i; j++) {
if (i % j === 0) {
isPrime = false;
}
}
// isPrime인 true인 경우도 있고, false인 경우도 있음
// 조건을 다시 분기해서, 만약에 true면, (소수면) result에 더해준다.
if (isPrime === true) {
result = `${result}-${i}`
}
}
return result;
}
makePermutations
문제
문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴해야 합니다.
입출력 예시
let output = makePermutations('ab');
console.log(output); // --> 'aa,ab,ba,bb'
output = makePermutations('123');
console.log(output); // --> '11,12,13,21,22,23,31,32,33'
output = makePermutations('');
console.log(output); // --> ''
// 페어랑 문제 풀이
function makePermutations(str) {
let result = ''; // string 타입으로 리턴
for (let i = 0; i<str.length; i++){ // string 타입 이기 때문에 str.legth
for (let j = 0; j<str.length; j++){ // 00,01 두자리 숫자 사용하기 위한 이중반복문
result = result + `${str[i]}${str[j]},`; // '' + 문자 + ,
// i = 0 j = 0 -> '11,'
// i = 0 j = 1 -> '11,12,'
// i = 0 j = 2 -> '11,12,13,'
// i = 1 j = 0 -> '11,12,13,21,'
}
}
return result.slice(0,result.length -1); // 결과 값에 slice(0,길이) 사용
// 잘라내기 마지막 ,를 없애기 위해 마지막 -1 를 넣어준다.
}
선생님 해석 본
function makePermutations(str) {
// 문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴해야 합니다.
// 입력: '123'
// 출력: '11,12,13,21,22,23,31,32,33'
// 주사위 생각나면 good!
let result = '';
for(let i = 0; i < str.length; i++) {
for(let j = 0; j < str.length; j++) {
result = result + `${str[i]}${str[j]},`
// i = 0, j = 0 -> '11'
// i = 0, j = 1 -> '11,12'
// i = 0, j = 2 -> '11,12,13'
// i = 1, j = 0
// i = 1, j = 1
// i = 1m
}
}
// '1234' -> 길이 4
// '1234'.slice(0, 3)
return result.slice(0, result.length - 1);
// 잘라내기
}
hasRepeatedCharacter
문제
문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴해야 합니다.
입출력 예시
let output = hasRepeatedCharacter('abcdefg');
console.log(output); // --> false
output = hasRepeatedCharacter('codestates');
console.log(output); // --> true
output = hasRepeatedCharacter('');
console.log(output); // --> false
// 페어랑 해결 본
function hasRepeatedCharacter(str) {
for (let i = 0; i<str.length; i++){ // 스트링 타입 str.length
for (let j = 1+i; j<str.length; j++){ // 두개의 검사를 위한 이중 반복문
if (str[i] === str[j]){ // i = j 이면 안됨
return true; // i 랑 j 랑 동일하지 않을경우, 영문이 같으면 트루
}
}
}
return false; // 아닐경우 false
}
//********** *
선생님 해석 본
function hasRepeatedCharacter(str) {
// 입력: 'codestates'
// 출력: boolean타입
// 첫번째 문자랑, 두번째 문자 비교
// 첫번째 문자랑, 세번째 문자 비교
// 첫번째 문자랑, 네번째 비교...
// ...
// 마지막에서 앞 문자랑, 마지막 문자 비교
for (let i = 0; i < str.length; i++) { // str전체 순회
// i = 0, str[0] => 'c'
// j = 4, str[0] => 's'
// ..
for (let j = i + 1; j < str.length; j++) {
// i = 9
// j = 10
if(str[i] === str[j]) {
return true;
}
}
}
return false;
}
makeMarginalString
문제
문자열을 입력받아 해당 문자열을 처음부터 한 글자(letter)씩 다시 작성하려고 합니다. 이 때, 한 글자를 추가할 때마다 부분적으로 완성된 문자열을 전부 이어붙인 문자열을 리턴해야 합니다.
입출력 예시
let output = makeMarginalString('abc');
console.log(output); // --> 'aababc'
output = makeMarginalString('flower');
console.log(output); // --> 'fflfloflowfloweflower'
output = makeMarginalString('');
console.log(output); // --> ''
function makeMarginalString(str) {
let result = '';
for (let i = 0; i<str.length; i++){
for (let j = 0; j<=i; j++){
result = result + str[j];
// i = 0, j = 0 -> str[j] 'f'
// i = 0 j = 1 -> str[j] => 내부 반복문 종료
// i = 1 j = 0 -> str[j] => 'f' -> 'ff'
// i = 1 j = 1 -> str[j] => 'l; -> 'ffl'
}
}
return result;
}
선생님 해석 본
function makeMarginalString(str) {
// 입력: 'flower' -> string타입의 문자열
// 출력: 'fflfloflowfloweflower' -> 한 글자를 추가할 때마다 부분적으로 완성된 문자열을 전부 이어붙여서 리턴
// 0: ''
// 1: 'f'
// 2: 'f' + 'fl'
// 3: 'f' + 'fl' + 'flo'
// ...
// 6: f + fl + flo + flow + flowe + flower
let result = '';
//첫번째 반복문은 반복횟수 결정 -> str의 길이
for (let i = 0; i < str.length; i++) {
//두번째 반복문 -> 몇 개의 문자를 더해줄건지
for(let j = 0; j <= i; j++) {
result = result + str[j]
// i = 0, j = 0 => str[j] 'f'
// i = 0, j = 1 => 내부 반복문 종료
// i = 1, j = 0 => str[j] 'f' 'ff'
// i = 1, j = 1 => str[j] 'l' 'ffl'
// i = 1, j = 2 => 내부 반복문 종료
// ...
// i = 5, j = 5 => str[j] 'r' 'fflfloflowfloweflower'
}
}
return result;
}
문제를 봤을 때 이해가 안가는 부분들이 많았지만 의사코드를 통해 어떻게 해결해 나갈지에 대해 꼭 생각해야겠다.
다양한 내장객체를 어떤식으로 사용할지에 대해 잘 생각해야 한다.
조건문과 반복문이 여러개가 쌓일 수록 어떻게 돌아가는 지 잘 생각해야 한다.
'Learn > Javascript' 카테고리의 다른 글
스코프 정리 (0) | 2023.01.03 |
---|---|
원시 자료형과 참조 자료형 정리 (0) | 2023.01.02 |
객체 정리 (0) | 2022.12.31 |
배열 정리 (0) | 2022.12.29 |
조건문 어려운 문제 피드백 (0) | 2022.12.19 |