공부/javascript

javascript - 알고리즘 연습

기묜몬 2024. 1. 21. 18:59

정리보다는 그때그때 풀이를 올리는 식으로 올려보겠다.

 

문제1 :

제곱근 구하는 문제

- 자바스크립트 제곱 표현 방법은 Math.pow()메서드를 사용한다.

- 음수의 소수 지수는 허수로 NaN을 반환한다. 

- 계산 가능 범위를 넘어서면 Infinity를 반환한다. 

 

ex)

2^3 = 8 

==========

var num1 = Math.pow(2,3)

- 앞 자리 숫자는 밑, 뒷자리 숫자는 지수를 의미한다 (2의 3제곱)

 

 

문제2 : 
유주는 놀이공원 아르바이트 중입니다. 그런데 놀이기구마다 키 제한이 있습니다.
유주가 담당하는 놀이기구는 키가 150cm 이상만 탈 수 있습니다.

입력으로 키가 주어지면
키가 150이 넘으면 YES를 틀리면 NO를 출력하는 프로그램을 작성하세요.

const msg = prompt("키를 입력하세요.");

if (msg <= 150) {
  console.log("yes");
} else {
  console.log("no!!");
}

 

 


문제3 :
영하네 반은 국어, 수학, 영어 시험을 보았습니다. 영하는 친구들의 평균 점수를 구해주기로 했습니다.

공백으로 구분하여 세 과목의 점수가 주어지면 전체 평균 점수를 구하는 프로그램을 작성하세요. 
단, 소숫점 자리는 모두 버립니다.

const scores = prompt('세 과목의 점수를 입력하세요.').split(' ');
let sum = 0;
for(i=0; i<3; i++){
  sum += parseInt(scores[i], 10)
}
console.log(Math.floor(sum/3));



문제4 :

공백으로 구분하여 두 숫자 a와 b가 주어지면, a의 b승을 구하는 프로그램을 작성하세요.

const numbers = prompt('두개의 수를 입력하세요.').split(' ');
console.log(Math.pow(parseInt(numbers[0], 10), parseInt(numbers[1], 10)));

 

 

문제5 : 
공백으로 구분하여 두 숫자가 주어집니다.
두번째 숫자로 첫번째 숫자를 나누었을 때 그 몫과 나머지를 공백으로 구분하여 출력하세요.

const msg = prompt('두개의 수를 입력하세요.').split(' ');
const result = Math.floor(parseInt(msg[0], 10) / parseInt(msg[1], 10));
const result2 = Math.floor(parseInt(msg[0],10) % result);
console.log(result, result2);




문제6 :
대문자 변환
민지는 국제 포럼에서 아르바이트를 하게 되었습니다. 민지는 각 국에서 온 참가자들의 명단을 엑셀로 정리하고 있는데 참가자들 이름이 어떤 이는 전부 소문자, 어떤 이는 전부 대문자로 써져 있는 등 형식이 제각각이었습니다.

민지를 위해 이름이 입력되면 전부 대문자로 출력되는 프로그램을 만들어주세요.

const name = prompt('이름을 영어로 입력해주세요');
const revert = name.toUpperCase();
console.log(revert);



문제7 :
원의 넓이는 반지름의 길이 x 반지름의 길이 x 3.14로 구할 수 있습니다.
함수를 사용하여 원의 넓이를 구하는 코드를 작성해봅시다.

입력으로 반지름의 길이 정수 n이 주어지면 원의 넓이를 반환하는 함수를 만들어 주세요.

function circle(n){
  const result = n * n * 3.14;
  
  return result
}
const n = prompt('정수를 입력하세요.');
console.log(circle(n));



문제8 :
우리 태양계를 이루는 행성은 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성이 있습니다.
이 행성들의 영어 이름은 Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune입니다.

행성의 한글 이름을 입력하면 영어 이름을 반환하는 프로그램을 만들어 주세요.

=> 내 방식대로 더 풀어봄 (한글로 입력하면 영어가 나오게, 영어로 입력하면 한글이 나오게 풀이)

const planets = {
  수성: "Mercury",
  금성: "Venus",
  지구: "Earth",
  화성: "Mars",
  목성: "Jupiter",
  토성: "Saturn",
  천왕성: "Uranus",
  해왕성: "Neptune",
};

// 사용자로부터 입력 받기
const name = "토성";
// const name = "목성";

// 입력한 이름에 해당하는 행성 이름 출력
console.log(translatePlanetName(name));

// 입력 받은 이름을 번역하는 함수
function translatePlanetName(name) {
  // 입력 받은 이름을 소문자로 변환
  const lowerCaseName = name.toLowerCase();

  // 입력한 이름이 행성 객체에 있는 경우
  if (planets[lowerCaseName]) {
    return planets[lowerCaseName];
  } else {
    // 입력이 영어인 경우 한글 이름 찾기
    const koreanName = Object.keys(planets).find(
      (key) => planets[key].toLowerCase() === lowerCaseName
    );

    // 찾은 한글 이름이 있는 경우 반환
    if (koreanName) {
      return koreanName;
    } else {
      return "해당하는 행성 이름이 없습니다.";
    }
  }
}

 

 

문제9 :

첫번째 입력에서는 학생의 이름이 공백으로 구분되어 입력되고, 두번째에는 그 학생의 수학 점수가 공백으로 구분되어 주어집니다.
두 개를 합쳐 학생의 이름이 key이고 value가 수학 점수인 객체를 출력해주세요.

const keys = prompt('이름을 입력하세요.').split(' ');
const values = prompt('점수를 입력하세요.').split(' ');
let obj = {};

for (let i=0; i<keys.length; i++){
  obj[keys[i]] = parseInt(values[i],10)
}
console.log(obj);



문제10 : 
2-gram이란 문자열에서 2개의 연속된 요소를 출력하는 방법입니다. 
예를 들어 'Javascript'를 2-gram으로 반복해 본다면 다음과 같은 결과가 나옵니다.

입력
Javascript


출력
J a
a v
v a
a s
s c
c r
r i
i p
p t

const a = prompt('단어를 입력하세요.');
for (let i=0; i<a.length; i++){
  console.log(a[i], (a[i + 1] !== undefined)
              ? a[i + 1] : '*');
}

****

2gram?

N-gram이란?

임의의 개수를 정하기 위한 기준을 위해 사용하는것

n개의 연속적인 단어 나열을 의미한다. n개의 단어 뭉치 단위로 끊어서 출력 

 

시간복잡도

빅 오란?

무언가를 실행하는데 필요한 단계의 수를 나타내는 것

단계의 수가 1인것과 100인것을 비교했을때, 당연히 100개의 단계보다 1개의 단계가 더 빠른속도로 진행된다.

 

O(1) : 빅 오1 이라고 읽음

O(n) : 빅 오 엔 이라고 읽음

괄호 안의 숫자는 단계의 수를 나타냄

n의 경우 자료구조의 길이만큼 걸린다는 뜻

 

ex) const arr = [1,2,3,4,5];

arr이라는 배열이 있을때, 이 배열에 숫자 3이 들어있는지 확인하는 방법은 반복문을 통해 순서대로 값을 하나씩 확인하는 방법이 있다.

즉, 맨 처음 인덱스 0번부터 시작해서 숫자가 3인지 확인하고, 아니라면 그 다음 인덱스로 넘어가서 확인한다. 

이것을 O(n) 이라고 함.



문제 11 : 
진구는 영어 학원 아르바이트를 하고 있습니다. 반 아이들은 알파벳을 공부하는 학생들인데 오늘은 대문자 쓰기 시험을 봤습니다.
알파벳 하나만을 입력하고 그 알파벳이 대문자이면 YES를 아니면 NO를 출력하는 프로그램을 만들어 주세요.

const alphabet = prompt("알파벳 하나를 입력하세요.");
if (alphabet === alphabet.toUpperCase()) {
  console.log("YES");
} else {
  console.log("No~~");
}



문제 12 :
문자 pineapple에는 apple이라는 문자가 숨어 있습니다. 원범이는 이렇듯 문자열 속에 숨어있는 문자를 찾아보려고 합니다.
첫번째 입력에서는 문자열이 입력되고, 두번째에는 찾을 문자가 입력되어야 합니다.
그 문자가 시작하는 index를 반환하는 프로그램을 만들어 주세요

const data = prompt('문장을 입력하세요');
// my name is hyo
const word = prompt('찾을 단어를 입력하세요');
// name

const searchWord = data.indexOf(word);
console.log(searchWord); //3



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

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

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

 

 

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

const data = prompt("숫자를 입력하세요.");
const reverseData = data.split('').reverse().join('');
let result = "";

for (let i = 0; i < reverseData.length; i++) {
  result += reverseData[i];
}

console.log(result);

 

 

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

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

1. 배열 숫자 작은순으로 sort 

// const key = prompt("키를 입력하세요");
// let key = "11 2 5 20 8";
let key = "1 2 3 4 5";

let sortKey = "";

sortKey = key // 메소드들을 보기 편하게 세로 나열
.split(" ")
.sort((a, b) => {
return a - b;
})
.join(" ");

if (key === sortKey) {
console.log("yes");
} else {
console.log("no");
}
 

 

문제 16 : 
2제곱, 3제곱, 4제곱을 할 수 있는 Factory 함수를 만들려고 합니다. 

<pass>에 코드를 작성하여 two함수를 완성하세요.

function one(n) {
  function two(value) {
    //pass
    const mathPow = Math.pow(value, n); // 앞자리 숫자는 밑, 뒷자리 숫자는 지수를 의미한다 (value의 n제곱)
    return mathPow;
  }
  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));

 

** factory함수 : 함수를 선언해서 함수 내부에서 객체를 생성해 반환하는 함수를 말한다.  

처음 함수를 호출할때만 인수를 전달하고, 그 이후에는 함수 내부에 있는 객체에 접근할때 인수 전달이 필요하지않고, 

필요하다면 프로퍼티에 접근해서 값을 수정할 수 있다. 

 

 

문제 17 :
학생들이 뽑은 후보들을 입력받으면 뽑힌 학생의 이름과 받은 표 수를 출력하는 프로그램을 작성하기로 하였습니다.
입력 : 원범 원범 혜원 혜원 혜원 혜원 유진 유진 
출력 : 혜원이 총 4표로 반장이 되었습니다. 

1. 학생 이름 중복이 몇개인지 세기 foreach
2. 학생 이름과 중복된 갯수를 key, value로 짝짓기 foreach
3. 짝지어진 것 중 value가 제일 큰 값을 구해서 넣기 

let array = "원범 원범 혜원 혜원 혜원 혜원 유진 유진";
let arrConvert = array.split(" "); //공백제거
let arrMap = {};
arrConvert.forEach((name) => {
  arrMap[name] = (arrMap[name] || 0) + 1;
});
let arrKeys = Object.keys(arrMap);
console.log(arrKeys); //key만 뽑기
console.log("arrMap : ", arrMap);

// value가 제일 큰 학생 찾기
let maxVotes = 0;
let selectedStudent = "";
for (let name in arrMap) {
  if (arrMap[name] > maxVotes) {
    //arrMap의 value가 maxVotes보다 클때까지 돌아
    console.log(arrMap[name]);
    maxVotes = arrMap[name]; // 첫번재 반복문 돌면 원범 : 2 가 업데이트됨, 두번째 돌면 2 가 혜원 : 4로 바뀐다.
    selectedStudent = name; // 반복문 다 돌면 가장 많은 표를 받은 사람의 이름이 selectedStudent에 들어감
  }
}
console.log(`${selectedStudent}이(가) 총 ${maxVotes}표로 반장이 되었습니다.`);