22.9.23

커피 내리는 그냥 사람·2022년 9월 23일
0

항해99

목록 보기
12/108

마라톤 1~12

예전에 풀었던 파이썬 코드를 참고하면서 풀었다.

1. 직사각형 별찍기

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
  // [2, 2]
    const a = Number(n[0]), b = Number(n[1]);
  // 각 item 분리하여 숫자로 표현, "2, 2"
    for (i=0;i<b;i++){
      // 바깥쪽부터 돌기
        let star = ""
        // *이 들어갈 값 먼저 지정
        for(j=0;j<a;j++){
          // 안쪽 루프
            star += "*"
          // 들어갈 값 지정
        }
        console.log(star)
      // 출력

    }
});

2. 짝수와 홀수

function solution(num) {
  //num을 매개변수로 받는 solution 함수
    var answer = '';
    if (num % 2 === 0){
        answer = "Even"
      // num의 나머지가 0이면 짝수
    }else{
        answer = "Odd"
      // num의 나머지가 1이면 홀수      
    }
    return answer;
}

3. 가운데 글자 가져오기

function solution(s) {
    var answer = '';
    let newS = Array.from(s)
    //  먼저 입력된 s 를 배열로 변경
    let first = newS.indexOf(newS[0]);
  	// 첫번째 배열의 인덱스 넘버 = 0
    let last = newS.length -1;
    // 마지막 배열의 인덱스 넘버
    //첫 인덱스 + 마지막 인덱스의 반값이 가운데 이므로 구했음.
    if (newS.length % 2 === 1) {
      // 나머지가 홀수, 즉 배열이 홀수개일 때 하나만 출력
        answer = newS[(first + last) / 2]
    }else{
        answer = ([newS[(first + last) -2], newS[(first + last)-1]]).join("")
      // 짝수 개일 때, 두 글자가 나와야 하므로 인덱스 게산하여 조인으로 문자열 만들기
    }
    return answer;
}

하지만 틀렸다. 그럼 어떻게 접근해야하나?

짝수인 경우 / 홀수인 경우가 반환되는 값이 다름(if) -> 자바스크립트 문자열 길이 체크하기

function solution(s) {
    var answer = '';
    
    if(s.length % 2 === 0){
        const firstIndex = s.length/2 -1;
        const secondIndex = s.length/2;
        
        const firstWord = s[firstIndex]
        const secondWord = s[secondIndex]
        
        answer = firstWord + secondWord
        // 짝수일 때
    }else{
        const index = Math.floor(s.length/2)
        
        const word = s[index]
        answer = word
        // 홀수일 때
    }
    return answer;
}

너무 복잡하게 생각했다. 인덱스로만으로도 간단히 풀 수 있는 문제였다.

4. 두 정수 사이의 합

function solution(a, b) {
    var answer = 0;
    
    if (a > b){
      // a가 b보다 크다면
    let newArray = Array(a - b + 1).fill().map((d, i) => i + b);
      // 배열로 먼저 만들어준다. 두 수 빼기 1을 해야 전체 수가 나오고 이를 fill로 채운 뒤 map해준 화살표 함수로 값을 지정해준다. 파이썬에 range(b, a)와 유사
    for (let i=0;i<newArray.length;i++){
        answer += newArray[i]
    } // 반복문 이용하여 모두 더한다. sum 함수가 있으면 편하게 할 수 있으나 js에는 없으니 이걸 사용한다.
    }else if (a === b){
        return a
      // 값이 같으면 한 값만 리턴한다. a건 b건 상관 없다.
    }else{
       let newArray = Array(b - a + 1).fill().map((d, i) => i + a);
      // 위와 동일
       for (let i=0;i<newArray.length;i++){
        answer += newArray[i]
    }
    }
    

    return answer;
}

5. 문자열을 정수로 바꾸기

function solution(s) {
    var answer = 0;
    answer = Number(s)
  // Number : Number 는 37이나 -9.25와 같은 숫자를 표현하고 다룰 때 사용하는 원시 래퍼 객체입니다.(by MDN)

    return answer;
}

6. 없는 숫자 더하기

function solution(numbers) {
    var answer = 0;
  // 초기값 0으로 세팅
    let originArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    // 먼저 원래 배열 설정. 0~9까지라고 했으니 이렇게 설정
    let newArray = originArray.filter(x => !numbers.includes(x))
    // 차집합 구하기 : 원래 배열에서 필터를 건 후 numbers에서 includes된 건 !하기
    for (let i = 0; i < newArray.length; i++){
        answer += newArray[i]
    }
  // 배열의 합 구하기
    
    return answer;
}

7. 음양 더하기

function solution(absolutes, signs) {
    var answer = 0;
  
  // answer값 초기화
  
  // 먼저 true, false값을 1, -1로 바꿔준느 것이 중요하다.
    
       
    for (let i = 0; i<signs.length; i++){
    if(signs[i] === true) {
        signs[i] = 1
    }else {
        signs[i] = -1
    }     
    }
  // 바꿔준 다음 이를 array의 item끼리 곱해준다. 이후 곱셈값을 바로 더해준다.
    for (let j = 0; j < absolutes.length; j++){
        answer += absolutes[j] * signs[j]   
}
    return answer;
}

8. 평균 구하기

function solution(arr) {
    var answer = 0;
    temp = 0;
  // 임시의 합 값 temp로 고정
    for (let i = 0; i < arr.length; i++){
        temp += arr[i]
      // item의 합을 구함
        answer = temp / arr.length
      // 이를 리스트의 length로 나눔
    }
    return answer;
}

9. 핸드폰 번호 가리기

시도해본 것 : substring, substr, replace, 정규표현식....

고민해서 만든 코드 그러나 정답이 아닌 것

function solution(phone_number) {
    var answer = '';
    let temp_reverse = Array.from(phone_number, Number).reverse()
    // 번호 역순으로 해서 숫자 데이터 타입으로 배열 받음
    let temp = temp_reverse.splice(4).reverse()
    // 변하면 안 되는 4자리만 짜름
    for (let i = 0; i < temp.length; i++){
        temp[i] = "*"
      // 나머지는 "*"로 만들어줌
    }
    answer = temp.join("") + temp_reverse.join("")
  // 이후 합쳐줌
    return answer;
}

3시간 넘게 고민하다가 찾은 정답

참고블로그

substr, substring 설명 블로그


function solution(phone_number) {
    var answer = '';
  
  // 번호 뒷 4자리 가져오기
    let back = phone_number.substr(-4,4);
    console.log(back);
  
  // 번호 뒷 4자리를 제외한 앞부분을 가져오기
    let front = phone_number.substring(0,phone_number.length-4);
    console.log(front);

  // 뒷 4자리를 제외한 앞부분을 * 문자로 변환해주기
    let result = front.replace(/[0-9]/g,'*');
    console.log(result);
    
  // * 문자로 변환해 준 부분과 뒷자리를 더해서 값을 구하기
    answer = result + back

    return answer;
}

substr vs substring

str.substr(시작 인덱스, 추출 갯수)
substr은 시작 인덱스번호, 몇개를 추출할것인지를 입력받는 반면에

str.substring(시작 인덱스번호, 끝 인덱스번호)
substring은 시작 인덱스 번호, 끝 인덱스번호를 입력받는다

찾아본 건 다 들어가있다. 조합의 문제였나.. 여하튼 반은 이해 되었다.

10. 행렬의 덧셈 : 다시 풀어봄

function solution(arr1, arr2) {
    var answer = [];
    // answer 재설정
    
    for (let i = 0; i < arr1.length; i++){
        // 행렬 먼저 풀기
        let row = []
        // 임의의 row array 생성
        for (let j = 0; j < arr1[0].length; j++){
            // 이중 for문 arr1 다시 풀기
            row.push(arr1[i][j] + arr2[i][j]);
            // push로 행렬 만들기
        }
        answer.push(row)
        // 마무리
    }
    
    return answer;
}

이것도 좀 공식처럼 외워두는게 좋을 듯...

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

function solution(x, n) {
    var answer = [];
    let sum = 0
    // answer안에 들어갈 숫자
    for (let i = 0; i <= n-1; i++){
      // n-1 : index가 0부터 시작하므로
        sum += x
      // x만큼 계속 더해서
        answer.push(sum)
      // answer안에 push 시키기
    }
    return answer;
}

12. 부족한 금액 계산하기

내가 짠 코드

function solution(price, money, count) {
    var answer = 0;
    for (let i = 0; i <= count; i++) {
     let new_price = price*(i*(i+1))/2
     // keypoint : price가 등차수열로 올라가서 쓴 수학공식
     answer = new_price - money
    }

    
    return answer;
}

그러나 테스트 4에서 걸렸다. 그래서 답안을 찾아봤다.

function solution(price, money, count) {
    let total_price = 0;
  // answer을 잡는 것이 아니라 total_price를 잡고 감

    for (let i = 0; i <= count; i++) {
      // 여기까진 거의 동일
        total_price += price * i;
      
      // 거의 다 온 식. 비슷하게 갔음
    }
    return money > total_price ? 0 : total_price - money;
  // 3항 연산자는 잘 몰라서 안 썼음. 이번 기회에 참고할 수 있게 둠.
}

오늘은 여기까지.. 머리 쥐나겠다

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글