JavaScript 100제 chapter1-4

크롱·2023년 9월 6일
0

코딩테스트

목록 보기
4/61

💖keywords💖
문제31 - 자료형의 복잡도, 빅 오 표기법
문제32 - split(' ')
문제33 - 거꾸로 출력하기 arr.reverse()
문제34 - sort() / 오름차순 / join(' ')
문제35 - Math.pow 제곱
문제36 - 반복문 구구단 / substring
문제37 - 반장선거 / reduce
문제38 - 점수 3등까지 사람 수 / sort, slice
문제39 - q를 e로 바꾸자 / replaceAll / split & join
문제40 -

문제31 : 자바스크립트 자료형의 복잡도

다음 배열 내장함수의 시간 복잡도가 O(1)이 아닌 것을 모두 고르시오.

1)  arr[i]
2)  arr.push(5) //arr 맨 끝자리에 el추가
3)  arr.slice()
4)  arr.pop()
5)  arr.includes(5)


✨답✨
3)  arr.slice()
5)  arr.includes(5)

정답은 '3번', '5번' 입니다.

빅 오 표기법에서 O(1)는 입력되는 값이 변하거나 arr의 원소의 개수가 늘어나도, 속도가 항상 일정한 코드.



문제32 : 문자열 만들기

취업 준비생인 혜림이는 자기소개서를 쓰고 있습니다. 열심히 자기소개서를 작성하던 도중 혜림이는 자기가 지금까지 단어를 얼마나 적었는지 궁금하게 됩니다.

혜림이를 위해 문자열을 입력받으면 단어의 갯수를 출력하는 프로그램을 작성해 주세요.


입력 : 안녕하세요. 저는 제주대학교 컴퓨터공학전공 혜림입니다.
출력 : 5


const 문장 = prompt('문장을 입력하세요').split(' ')
console.log(문장.length)


문제33 : 거꾸로 출력하기

한 줄에 여러개의 숫자가 입력되면, 역순으로 그 숫자들을 하나씩 출력하는 프로그램을 작성하시오.

입출력

입력 : 1 2 3 4 5
출력 : 5 4 3 2 1

입력 : 2 4 6 7 8
출력 : 8 7 6 4 2



🐳내 풀이🐳
const 문장 = prompt('숫자를 입력하세요')

let result ='';
for (let i=문장.length-1;i>=0;i--){
  result += 문장[i];
}
console.log(result)


🌈알게된 것🌈 arr.reverse()
var arr = ['hi','hell','world']
arr.reverse() // ['world', 'hell', 'hi']


문제34 : sort 구현하기

민주는 체육부장으로 체육시간이 되면 반 친구들이 제대로 키 순서대로 모였는지를 확인해야 한다. 그런데 요즘 민주는 그것이 너무 번거롭게 느껴져 한 번에 확인하고 싶어한다.

민주를 위해 키가 주어지면 순서대로 제대로 섰는지 확인하는 프로그램을 작성해보자.
(키는 공백으로 구분하여 입력됩니다.)

입출력

입력 : 176 156 155 165 166 169
출력 : NO

입력 : 155 156 165 166 169 176
출력 : YES

---------------------------------------------------------------

const 키모음 = prompt('키를 입력하세요').split(' ')

const 복사키모음 = [...키모음]
if(키모음.toString() ==복사키모음.sort().toString()){
  console.log('YESS') 
}else{
console.log('NOOO')
}

근데 여기서 sort의 문제점이, ['140', '95']이렇게 되어있으면
문자열이기떄문에 95가 더 큰걸로 여겨진다

두 배열 원소가 같은지 궁금할땐, toString()을 사용하자!

정석풀이도 살펴보자.

const unsorted = prompt('키를 입력하세요');//ex. '170 130 160'
let sorted = ""; //정렬이 잘 된 키

sorted = unsorted
  .split(" ")
  .sort(function(a, b) {
    return a - b;
  })
  .join(" ");

if (unsorted === sorted) {
  console.log("Yes");
} else {
  console.log("No");
}

sort의 문제점이, ['140', '95']이렇게 되어있으면
문자열이기떄문에 95가 더 큰걸로 여겨진다.
그래서

sort(function(a,b){
	return a - b; //오름차순 정렬
  	return b - a; //내림차순 정렬
})

이렇게 sort( ) 안에 함수 넣어줌.

🌈알게된 것🌈 arr.join()

['110', '123', '150'].join(' ')
==> '110 123 150'

['110', '123', '150'].join('')
==> '110123150'


문제35 : Factory 함수 사용하기

2제곱, 3제곱, 4제곱을 할 수 있는 Factory 함수를 만들려고 합니다.
<pass>에 코드를 작성하여 two함수를 완성하세요.

function one(n){
    function two(){
        //pass
    }
    return two;
}

const a = one(2);
const b = one(3);
const c = one(4);

console.log(a(10));
console.log(b(10));
console.log(c(10));

풀이
function one(n) {
  function two(value) {
    return Math.pow(value, n);
    
  }
  return two; //Math.pow(value, n);
}
 
const a = one(2); //Math.pow(value, 2);
const b = one(3);
const c = one(4);

console.log(a(10)); // 100
console.log(b(10)); //1000
console.log(c(10)); //10000

문제36 : 구구단 출력하기

1~9까지의 숫자 중 하나를 입력하면 그 단의 구구단 결과를 한 줄에 출력하는 프로그램을 작성하세요.

입출력

입력 : 2
출력 : 2 4 6 8 10 12 14 16 18



✨풀이✨
const num = prompt('1 ~ 9까지의 숫자 중 하나를 입력하세요.')
let result = '';

for (let i=1; i<=9; i++){
  result += i*num + ' ';
}

console.log(result);




🌈알게된 것🌈 str.substring
var str = 'ABCDEF';

// 1번째 인덱스에서 마지막 위치까지 문자열을 반환합니다.
console.log(str.substring(1));
// BCDEF

// 1번째 인덱스에서 4번째 인덱스 전 까지 문자열을 반환합니다.
console.log(str.substring(1, 4));
// BCD

문제37 : 반장 선거

새 학기를 맞아 호준이네 반은 반장 선거를 하기로 했습니다. 그런데 표를 하나씩 개표하는 과정이 너무 번거롭게 느껴진 당신은 학생들이 뽑은 후보들을 입력받으면 뽑힌 학생의 이름과 받은 표 수를 출력하는 프로그램을 작성하기로 하였습니다.

입력
원범 원범 혜원 혜원 혜원 혜원 유진 유진

출력
혜원()가 총 4표로 반장이 되었습니다.


✨풀이✨ 
const array = prompt('이름을 입력해주세요.').split(' ');
//['크롱','크롱','원범','원범','원범','아롱']
let result = {};
let winner = "";

for(let index in array){ //인덱스 순환
  let val = array[index]; 
  result[val] = result[val] === undefined ? 
    1 : result[val] = result[val] + 1;
}


result = {'크롱':2,'원범':3,'아롱':1};



			["크롱","원범","아롱"]
winner = Object.keys(result).reduce(function(a, b){
  return result[a] > result[b] ? a : b
});

a,b엔
크롱 원범
원범 아롱
이렇게 들어간다.

마지막에 반환된 winner는 원범.

console.log(
  `${winner}(이)가 총 ${result[winner]}표로 반장이 되었습니다.`
);



🌈알게된 것🌈 
arr.filter 
Object.values(obj)
Math.max.apply(null, nums)

나는 set을 이용해서 어렵게풀었따 ㅠ
전체적인 로직은 많이 비슷했다.

const 입력 = prompt('후보들을 입력해주세요.').split(' ')
//["원범","원범","혜연","크롱","크롱","크롱"]

const 사람 = new Set(입력) 
//{"원범","혜연","크롱"}


let obj = {};
for (const name of 사람) {
   obj[name]= 입력.filter(e => e === name).length
  
}


const nums = Object.values(obj)
// [2,1,3];
const maxNum = Math.max.apply(null, nums);

const names = Object.keys(obj) //["원범", "혜연", "크롱"]

for (const i of names) {
  
   if(obj[i]===maxNum) {
     console.log(`${i}이 총 ${maxNum}표로 반장이 되었습니다.`)
   }
 
  
}


문제38 : 호준이의 아르바이트

호준이는 아르바이트로 영어 학원에서 단어 시험지를 채점하는 일을 하고 있다. 호준이가 일하는 학원은 매번 1위부터 3위까지의 학생에게 상으로 사탕을 준다. 그런데 오늘은 마침 사탕이 다 떨어져서 호준이가 채점을 하고 점수를 보내면, 당신이 아이들의 숫자만큼 사탕을 사러 가기로 했다.

1위 ~ 3위 학생은 여러명일 수 있고 1~3위 학생 중 중복되는 학생까지 포함하여 사탕을 사기로 한다.
학생들의 점수를 공백으로 구분하여 입력을 받고 사탕을 받을 학생의 수를 출력하세요.

입출력

입력 : 97 86 75 66 55 97 85 97 97 95
출력 : 6


✨풀이✨ 
const 점수들 = prompt('점수입력해주세요').split(' ')
//  ['97', '86', '75', '66', '55', '97', '85', '97', '97', '95']


let obj ={}
for(let index in 점수들){ //인덱스 순환
  let val = 점수들[index]; 
  obj[val] = obj[val] === undefined ? 
    1 : obj[val] = obj[val] + 1;
}

 console.log(obj)
 {
   "55": 1,
   "66": 1,
   "75": 1,
   "85": 1,
   "86": 1,
   "95": 1,
   "97": 4
 }


 const nums = Object.keys(obj).slice(-3) 
//  마지막3가지만 가져옴. ["86","95","97"]

 let result = 0;
 for(let i of nums){
  result = result + parseInt(obj[i])
 }

 console.log(result)

선생님 풀이도 보자.

🌞선생님풀이🌞

const scores = prompt('점수입력해주세요').split(' ')

scores.sort((a, b) => {
  return a-b; //오름차순 정렬
});

console.log(scores)
//['55', '66', '75', '85', '86', '95', '97', '97', '97', '97']

let count = 0;
let arr = []; // top3 점수넣을거임.

while (arr.length < 4) { //조건식이 true일때 반복됩니다
  let n = scores.pop();
  if (!arr.includes(n)){
    arr.push(n);
  }
  count++;
  console.log(arr)
}

console.log(count -1);

문제39 : 오타 수정하기

혜원이는 평소 영타가 빠르고 정확한 것을 친구들에게 자랑하고 다녔습니다. 반 친구들이 혜원이의 타자 속도가 빠르다는 것을 모두 알게 되자 혜원이는 모두의 앞에서 타자 실력을 보여주게 됩니다.

그런데 막상 보여주려니 긴장이 되서 문장의 모든 e를 q로 잘못 친 것을 발견했습니다.
혜원이는 프로그램을 돌려 재빠르게 모든 q를 e로 바꾸는 프로그램을 작성하려고 합니다.

문장이 입력되면 모든 q를 e로 바꾸는 프로그램을 작성해 주세요.

입출력

입력 : querty
출력 : euerty

입력 : hqllo my namq is hyqwon
출력 : hello my name is hyewon
----------------------------------------------------------------------
✨풀이✨ 

const 문장 = prompt('영어문장을 입력하세요')

console.log(문장.replaceAll('q','e'))


🌞선생님풀이🌞

1. 정규식 사용
const word = prompt('입력하세요.');

console.log(word.replace(/q/gi, 'e'));

2. split과 join 활용
const word =  "hqllo my namq is hyqwon"

word.split("q").join("e")


먼저 word.split("q")
["h","llo my nam"," is hy","won"]

만약  word.split("q").join() 하면
"h,llo my nam, is hy,won"

word.split("q").join("e")
"hello my name is hyewon"

문제40 : 놀이동산에 가자

테마파크에 온 원범이와 친구들은 놀이기구를 타려고 합니다. 모든 놀이기구는 한번에 타는 인원수에는 제한이 없지만 제한 무게를 넘으면 무조건 다음 기구를 타야 합니다.

원범이와 친구들이 총 몇 명 탈 수 있는지 알 수 있는 프로그램을 작성해 주세요.

첫번째 입력으로 제한 무게가 주어지고 두번째 입력으로는 함께한 친구들의 수 n이 주어집니다.
그 다음 차례대로 탑승할 친구들의 몸무게가 주어집니다. 몸무게는 무작위로 주어집니다.

입력
50
5
20
20
20
20
20

출력
2

전체적으로 로직은 비슷했는데, 나는 컴퓨터가 무게를 랜덤하게 제공하도록 코드를 짰다.

---------------------------------------------------------------------
🌞선생님풀이🌞

const kiloLimit = prompt('무게제한')
const member = prompt('총 몇명 타나요?)

let count = 0;
let totalWeight = 0;
                      
for(let i =0; i< member; i++){
	totalWeight =totalWeight + parseInt(prompt("몸무게입력plz"),10);
  if(totalWeight<= kiloLimit){
	  count++ 
  }
}
console.log(count)

✨내 풀이✨ 


const limit = parseInt(prompt('제한 무게를 입력하세요.')); //100
const n = parseInt(prompt('인원수를 입력하세요.')); //4
let 몸무게합 = 0;
let kilo = []; //랜덤 몸무게
let possibleKilos =[];

//랜덤 몸무게
for(let i=0;i<n;i++){
  kilo.push(Math.floor(Math.random() * limit)) 
}

kilo.sort((a, b) => {
  return a-b; //오름차순 정렬
})

console.log(kilo) //[3,28,59,90]


 let i =0;
                
while(몸무게합<=limit) {

  몸무게합 = 몸무게합 + kilo[i]
 // console.log(kilo[i])
  possibleKilos.push(kilo[i])
  i++

}
console.log(possibleKilos.length-1)

문법

hi
profile
👩‍💻안녕하세요🌞

0개의 댓글