2023.03.20 알고리즘

정승원·2023년 3월 21일
0
post-thumbnail

📒 목차

  • 🌈 같은 숫자는 싫어
  • 🌈 짝수와 홀수
  • 🌈 평균 구하기
  • 🌈 핸드폰 번호 가리기
  • 📌 삼항연산자
  • 📌 reduce()
  • 📌 padStart()
  • 📌 slice()

🌈 같은 숫자는 싫어

// todo: 같은 숫자는 싫어
// 문제 설명
// 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 
// 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 
// 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

// arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
// arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
// 배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 
// return 하는 solution 함수를 완성해 주세요.

// ! 제한사항
// - 배열 arr의 크기 : 1,000,000 이하의 자연수
// - 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

// ? 예상결과
// arr [1,1,3,3,0,1,1]
// answer [1,3,0,1]

//* 나의 풀이
function solution(arr) {
  var answer = [arr[0]]; // arr의 첫번째 값 answer변수에 넣기
  for (let i = 1; i < arr.length; i++) {
    // 위에서 answer 배열에 arr배열의 첫번째 값을 넣어주었기 때문에 i=1부터 시작
    if (arr[i] !== arr[i - 1]) {
      // arr[i]의 값과 arr[i]의 이전값 비교하여,
      answer.push(arr[i]); // 값이 서로 같다면 answer 배열에 push 하기
    }
  }
  console.log(answer);

  return answer;
}

🌈 짝수와 홀수

//todo: 짝수와 홀수
//문제 설명
//정수 num이 짝수일 경우 "Even"을 반환하고,
//홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

//제한사항
//num은 int 범위의 정수입니다.
//0은 짝수입니다.

//예상결과
//num = 3;
//return "Odd"

//solution
//if...else 활용

function solution1(num) {
  let answer = "";
  if (num % 2 === 0) {
    // num이 짝수인지 홀수인지 확인 (나머지를 활용)
    answer = "Even";
  } else {
    answer = "Odd";
  }
  return answer;
}

// 삼항연산자 활용
function solution2(num) {
  let answer = "";
  return answer % 2 === 0 ? "Even" : "Odd";
  //삼항연사자를 활용하여 나머지 연산이 짝수인지 홀수인지 한줄에 적용.
}

🌈 평균 구하기

// todo: 평균 구하기
// 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

// ! 제한사항
// - arr은 길이 1 이상, 100 이하인 배열입니다.
// - arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

// ? 예상결과
// arr = [1,2,3,4]
// return 2.5

//* solution 1
// for문 활용
function solution(arr) {
  var answer = 0;
  for (let i = 0; i < arr.length; i++) {
    answer += arr[i]; // answer 변수에 arr 배열의 값들의 합 구하기
  }
  answer = answer / arr.length; // arr 배열의 길이, 즉 값들의 갯수만큼 나누어 평균 구하기
  return answer;
}

//* solution 2
// reduce() 활용
function solution(arr) {
  const sum = arr.reduce((acc, cur) => {
    // reduce 메서드를 활용하여, arr배열의 값들의 합을 구하기
    return acc + cur;
  });
  return sum / arr.length; // arr 배열의 길이, 즉 값들의 갯수만큼 나누어 평균 구하기
}
let arr = [1, 2, 3, 4];
solution(arr);

🌈 핸드폰 번호 가리기

// todo: 평균 구하기
// 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
// 전화번호가 문자열 phone_number로 주어졌을 때, 
//전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수,
//solution을 완성해주세요.

// ! 제한사항
// phone_number는 길이 4 이상, 20이하인 문자열입니다.

// ? 예상결과
// phone_number : "01033334444"
// return :  "*******4444"

//* solution 1
function solution(phone_number) {
  var answer = "";
  let star = phone_number.length - 4; // 휴대폰번호 끝에서 4자리 시작 인덱스 번호
  for (let i = 0; i < phone_number.length; i++) {
    if (i < star) {
      // 휴대폰번호 끝에 4자리 인덱스보다 작은 경우,
      answer += "*"; // "*"로 바꾸기
    } else {
      answer += phone_number[i]; // 끝에 4자리는 원래 번호 그래로 나타내기
    }
  }
  return answer;
}

//* solution 2
//2. lecture
// 메서드 사용 : padStart(), slice()
function solution(phone_number) {
  let answer = "";

  answer = answer.padStart(phone_number.length - 4, "*");
  // padStar()메서드 활용하여 번호의 *영역 바꾸기
  answer += phone_number.slice(phone_number.length - 4);
  // slice()메서드 활용하여 휴대폰번호 끝 4자리 나타내기
  console.log(answer);
  return answer;
}
let phone_number = "01033334444";
solution(phone_number);

📌 삼항연산자

조건식을 사용하는 상황에서 if문을 사용할때보다 효과적으로 코드양을 줄이고 가독성을 높일 수 있다.

✅ 구문

(조건식) ? 참일때 작동 : 거짓일때 작동

✅ 예시

let a= 3;
let b= 4;
let result = (a<b) ? 'true' : 'false'
console.log(result)
// true

📌 reduce()

배열에서 사용되는 메서드인데, 배열의 각 요소를 순회하며 callback 함수의 실행 값을 누적하여 하나의 결과를 반환한다.

✅ 구문

arr.reduce(누산값, 현재요소값, 현재요소의index, 현재배열)=>{
  return 다음누산값;
},초기누산값);

arr.reduce(callback(accumulator, currentValue, index, array), initialValue)
  • 누산값 (accumulator)
    누적되는 값이며, callback 함수의 반환값을 누적한다.
    초기누산값 (initialValue)를 설정한 경우, callback의 최초 호출시 initialValue 값으로 초기화
    초기누산값이 없는 경우, arr의 0번 인덱스로 초기화

  • 현재요소값 (currentValue)
    현재 배열의 요소

  • 현재요소의index (index)
    생략가능하다!!

  • 현재배열(array)
    reduce 함수를 호출한 배열

  • 초기누산값 (initialValue)
    생략가능하다!!
    callback의 최초 호출시의 누산값이다.

✅ 예시

// 1~10 배열의 모든 값 더하기
const num = [1,2,3,4,5,6,7,8,9,10];
const sum = num.reduce((acc, cur) =>{
  return acc + cur
})
console.log(sum)

📌 padStart()

padStart() 메서드는 현재 문자열의 시작을 다른 문자열로 채워, 원하는 문자열을 만들어 반환하는 것이다.

✅ 구문

str.padStart(targetLength, padString)

targetLength

목표 문장의 길이이다.
만약, 현재 문자열의 길이보다 작다면 채워넣지 않고 그대로 반환한다.

padString (선택)

현재 문자열에 채워넣을 다른 문자열이다.
기본값은 ""이다.

✅ 예시

cont test = 'abc'
test.padStart(10);         // "       abc"
test.padStart(10, "foo");  // "foofoofabc"
test.padStart(6,"123465"); // "123abc"
test.padStart(8, "0");     // "00000abc"
test.padStart(1);          // "abc"

📌 slice()

slice() 메서드는 어떤 배열의 begin부터 end까지에 대한 얕은 복사본을 추출한다.
즉, 원본 배열은 바뀌지 않는다.

✅ 구문

arr.slice(begin, end)

begin

0을 시작으로하는 추출 시작점에 대한 인덱스이다.
음수로 넣게 된다면, 오른쪽 끝에서부터 적용이 된다.
만약, begin이 undefined라면, 0부터 slice하게 된다.

end (선택)

추출을 종료 할 0기준 인덱스이다.
slice는 end를 제외하고 추출한다!!

✅ 예시

let fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
let citrus = fruits.slice(1, 3)

// fruits contains ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
// citrus contains ['Orange','Lemon']

0개의 댓글