5일차 알고리즘

태권·2022년 8월 5일
0

알고리즘

목록 보기
1/8

알고리즘 시작

prompt()

프로그래머스? 입력값 넣기

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    console.log(a);
    console.log(b);
});

1번문제

별만들기

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
  const n = data.split(" ");
  const a = Number(n[0]), b = Number(n[1]);
  const star = `${'*'.repeat(a)}\n`;

  console.log(star.repeat(b));
});

2번째 방법

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
  const n = data.split(" ");
  const a = Number(n[0]), b = Number(n[1]);
  
  for(var i=0; i<b; i++){
    console.log('*'.repeat(a))
  }
});

실습과제

let b = 1;
const a = 1;

function hi () {


let b = 100;

b++;

console.log(a,b);

}

console.log(a);

console.log(b);

hi();

console.log(b);

처음 a가 안찍힌건 지역변수라서

2번문제

x만큼 간격있는 n개의 숫자

function solution(x, n) {
    var answer = [];
    for(let i=0; i<n; i++){
        answer[i] = x*(i+1)
    }
    return answer;
}
2번째 방법
function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}

fill() 메서드는 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채웁니다.arr.fill(value, start, end)
map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.
function solution(n) {
return Array(n)
}
console.log(solution(4)) 해보니 array(n)은 n개 갯수의 인덱스르 가지는 리스트를 만들었다
array.map(callbackFunction(currenValue, index, array), thisArg) 인데
map(v,i)인데 그럼 v는 현재값 x 일테고 i는 x의 인덱스 일터 그럼 (i+1)*v는 처음 i는 0이고 x를 곱해주는거니까
각 index의 값의 value에 x를 곱해주는데 fill로 전부 index의 값을 x로 만들었으니 잘 해결이 된다

3번문제

가운데 글자 가져오기

function solution(s) {
    let str = s
    let n = str.length;
    let answer =''
    if (n%2 == 0){
        answer = str.substring(n/2-1,n/2+1)
    }else{
       answer = str.substring(n/2,n/2+1)
    }return answer
}
console.log(solution('abcde'))
  1. split() : 구분자로 문자열 분리하여 배열로 리턴
  2. substr() : 특정 Index에서 원하는 길이만큼 잘라서 문자열로 리턴
  3. substring() : 시작 Index에서 끝 Index 전까지 문자열을 잘라서 리턴
  4. slice() : substring과 비슷하지만 살짝 다른 메소드

2번째 방법

function solution(s) {
    const mid = Math.floor(s.length/2);
    return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}

Math.floor() : 소수점 이하를 버림한다.
Math.ceil() : 소수점 이하를 올림한다.
Math.round() : 소수점 이하를 반올림한다.

3번째 방법

function solution(s) {
    const mid = parseInt(s.length/2);
    return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}
console.log(solution('abcdefg'))

parseint를 이용한다

4번문제

평균 구하기

function solution(arr) {
    let arrsum = 0
    for(let i=0; i<arr.length; i++){
        arrsum += arr[i]
        answer = arrsum/arr.length
    }
    return answer;
}

2번째 방법 reduce 이용

const arr = [1, 2, 3, 4, 5];
const result = arr.reduce((acc, cur, idx) => { return acc += cur; }, 0);
console.log(result);  // 15

const arr2 = [1, 2, 3, 4, 5];
const result2 = arr2.reduce((acc, cur, idx) => { return acc += cur; }, 10);
console.log(result2);  // 25

일때 acc 누산기 즉 값이 저장되는곳이라 생각하고
cur는 현재의 값 인텍스 값마다의 값이다 맨뒤에 0, 10이라고 적힌부부은 intial value 로 처음에 더해진다
이걸 이용하면

function solution(arr) {
    let sum = arr.reduce((acc,cur)=>{return acc += cur},0)
    return sum/arr.length
    }

로 사용할 수 있다.
다른 사람이 쓴거는 요것

function average(array){
  return array.reduce((a, b) => a + b) / array.length;
}

요는 a,b 안의 변수 뭐든 상관없이 다 더한다고 생각하면된다.

5번문제

2016년의 어느날의 요일 구하기

function solution(a, b) {
  let count = 0;
  const day = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
  const month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  for (let i = 1; i < a; i++) count += month[i];
  count += b;
  return day[(count + 4) % 7]; // 금요일 부터 1일 이므로
}

다른 풀이

function getDayName(a,b){
  var date = new Date(2016, (a - 1), b);
    return date.toString().slice(0, 3).toUpperCase();
}

https://devjhs.tistory.com/80를 참조하면 된다.

또다른 풀이

function getDayName(a,b){
    var dayList = ['FRI','SAT','SUN','MON','TUE','WED','THU'];
  var monthArr = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  var daySum;
  if(a < 2) {
    daySum = b - 1;
  } else {
    daySum = monthArr.slice(0, a - 1).reduce((a, b) => a + b) + b - 1;
  }
    return dayList[daySum % 7];
}

6번 문제

짝수와 홀수

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

function solution(num) { return num%2 === 0 ? 'Even':'Odd'}

if문을 쓸까 했지만 삼황연산자가 더짧을꺼같아서 썻다.

7번 문제

두 정수 사이의 합

function adder(a, b){
    var result = (a<b)?a:b;
    while(a!=b){
      result += (a<b)?++a:++b;
    }    
    return result;
}
function adder(a, b){return (a+b)*(Math.abs(b-a)+1)/2;}

내가 푼 방법

function adder(a, b){
    let answer = []
    if (a ==b){ answer = a}
    else if(a<b){
        for(let i =0; i<Math.abs((b-a)+1); i++){
            let c = a+i
            answer.push(c)
        }
    }else{
        for(let i =0; i<Math.abs((b-a)+1); i++){
            let c = b+i
            answer.push(c)
        }
    }
    console.log(answer)
    return answer.reduce((f,g)=>f+g)
    
        
    }
function solution(a, b) {
    let minnum = Math.min(a,b)
    let maxnum = Math.max(a,b)
    let s =0
        for(let i=minnum; i<=maxnum; i++){
        s += i;   
        }return s
}

또 다른 방법으로 푼것

8번 문제

문자열 정수로 바꾸기

function solution(s) {return parseInt(s);}

9번 없는 숫자 더하기

ori = [0,1,2,3,4,5,6,7,8,9]
function solution(Num) {
    a = ori.reduce((c,d)=>c+d)       
    b = Num.reduce((f,g)=>f+g)
    return a-b
}

배열에서 배열을 뺄려다 시간을 버렸네
다른식

function solution(numbers) {
    let cnt = 0;
    for(let i=0; i<10; i++){
        if(!(numbers.includes(i))) cnt+= i
    }
    return cnt

}

10번 문제

음양 더하기
function solution(a, b) {
    let c = []
    for(let i=0; i<b.length; i++){ 
        if( b[i] == true) { c.push(a[i]) }
            else if(b[i]== false){c.push(-a[i])
         }} 
         return c.reduce((f,g)=>f+g)}

더좋은거

function solution(a, b) {
    return a.reduce((acc,cur, ind) => acc+(cur*(b[ind] ? 1 : -1)),0)
}

reduce 써서 true일때 1곱하고 false일때 -1 곱하기

11번문제

핸드폰번호 가리기

function solution(phone_number) {
    let back = phone_number.slice(-4)
    let front = phone_number.slice(0,-4)   
    return "*".repeat(front.length) + back
}
function hide_numbers(s){
  var result = "*".repeat(s.length - 4) + s.slice(-4);
  return result;
}

12번 문제

행렬의 덧셈

function solution() {
  let a = [[1,2],[5,6]]
  let b = [[3,4],[7,8]]
    return a[0][1] +b[1][1]
}
function solution(a,b) {
    const answer = [[]]
    for(let i=0; i<arr1.length; i++){
       answer[i] = []
       for(let j=0; j<arr2.length; j++){
        answer[i][j] = a[i][j] + b[i][j]
       }
    }return answer
}

vscode 에서 잘 되는데 프로그래머스에는 안된다 왤까

function solution(A,B){
return A.map((a,i) => a.map((b, j) => b + B[i][j]));
}

map으로 했을때
첫 A.map은 [], []를 나타내고 a.map은 []안의 숫자를 나타냄
그래서 위의 코드로는 행과 열이 아예 같지 않다면 시행이안된다

 let arr1 = [[1,2],[5,4],[2,3]]
  let arr2 = [[8,5],[11,6],[6,7]]

  
function solution(arr1, arr2) {
    var answer = [[]];
    for (var i=0; i<arr1.length; i++){
        answer[i] =[];
        for(var j=0; j<arr1[i].length; j++){
            answer[i].push(arr1[i][j] + arr2[i][j]);
        }
    }
    return answer;
}
console.log(solution(arr1, arr2))

j의 길이의 문제 였는데 여러번 고치다가 저거인걸알지만 안됬지만 결국 이해했다, j의 길이는 i의 길이여야헀던것

13번 문제

부족한 금액 계산하기

    function solution(price, money, count) {
        let sum =0
        for(let i=1; i<=count; i++){
            sum += i*price
        }
        let answer = money-sum > 0 ? result = 0 : result = Math.abs(money-sum) 
        return answer;
    }

가우스 공식

function solution(price, money, count) {
    const tmp = price * count * (count + 1) / 2 - money;
    return tmp > 0 ? tmp : 0;
}
profile
2022.08 개발자 시작

0개의 댓글