고양이와 코딩

[프로그래머스] 10월 27일 ~ 10월 30일 본문

javascript

[프로그래머스] 10월 27일 ~ 10월 30일

ovovvvvv 2023. 10. 27. 00:44
728x90

10월 27일

문자열 밀기 - javascript

 

내 코드 

function solution(A, B) {
    var answer = 0;

    if (A.length !== B.length) {
        return -1; 
    }

    while (A !== B) {
        A = A[A.length - 1] + A.substring(0, A.length - 1); 
        answer++;

        if (answer > A.length) {
            return -1; 
        }
    }

    return answer;
}

 

시행착오

더보기

시프트 연산을 써야겠다는 생각 + 시프트 연산을 1씩 반복해서 증가시키면서 확인

처음에 이렇게 생각을 했는데 shift횟수를 변수로 만들어서 관리하는게 별로 좋은 생각이 아니었던 것 같다(내가 잘 못해서 그런걸수도 ㅎㅎ)

while문 내에서, 예를들어 A가 hello이고 B가 ohell일때  A[A.length - 1]은 o가 되고 A.substring(0, A.length - 1)은 hell이 된다.

이걸 더하면 ohell이 된다. 시프트를 두번 이상 해야하는 경우에도 잘 작동한다! 

그리고 이렇게 짜면 A와 B가 같은 경우는 생각하지 않아도 된다. 

애초에 while문에 들어가지 않고 answer의 초깃값 0인 상태로 return되기 때문 

솔까말 좋은 코드는 아니지만... ㅎㅎ ...... 풀었다는것이 중요하지 않은가..

 

종이 자르기 - javascript

처음 코드

function solution(M, N) {
    var answerM = (M - 1);
    var answerN = (N-1) * M;
    var result = answerM + answerN;
    
    if (M == 1 && N == 1){
        return 0;
    }
    
    return result;
}

그냥 규칙을 찾아서 풀었다. 

근데 이렇게 하고 나서 생각해보니 그냥 ( M * N ) -1이 답임... ㅎㅎㅋㅋ;;;;

 

제출 코드

function solution(M, N) {
    var answer = (M * N) - 1;
    return answer;
}

휴 또 바보짓 할뻔 ㅎㅎ

 

연속된 수의 합 - javascript

 

내 코드

function solution(num, total) {
    let result = []

    const middle = Math.ceil(total / num);
    const x = Math.trunc(num / 2);
    const startNum = middle - x ;

    for(i = 0; i < num; i++){
        result.push(startNum + i)
    }
    
    return result
}

사실 잘 감이 안와서.. ㅎㅎ 구글링을 통해 답을 썼다!! 이해하는게 목표 ㅎㅎ

처음에 값들을 num만큼 더해도 total의 중간값보다 작다 + num까지 반복문 사용만 생각했는데 도저히~ 어떻게 시작값을 정해야 할지 감이 안왔다.

블로그에서 다른 분이 푼 풀이를 보고 이해했다!!(감사합니다)

Math.ceil함수를 사용해서 total의 중간 값을 구하고 Math.trunc함수를 사용해서 소수점을 잘라내고 중간 값의 정수만을 반환한다.

그리고 시작값은 middle에서 x를 뺌으로써 중간값을 기준으로 왼쪽에 위치한 연속된 정수를 나타낼 수 있다!

이런 류의 문제를 많이 연습해야겠다..

 

다음에 올 숫자 - javascript

 

처음 코드

function solution(common) {
    var that_num = common[common.length - 1];
    
    for (let i = 0; i < common.length; i++){ 
        if (common[i] - common[i-1] == common[1] - common[0]) {
            that_num += i;
        } else if (common[0] * i == common[1]){
            that_num *= i;
        }
    }
    
    return that_num;
}

등차수열을 판별하는 부분에서 계속 잘못된 값이 나왔다. 

등차가 1인 경우 for문이 계속 돌면서 that_num에 i가 더해져서 이상한 결과가 나오기 때문

 

제출 코드

function solution(common) {
    var that_num = common[common.length - 1];

    // 등차수열 판별 변수
    var isArithmetic = true;
    var commonDifference = common[1] - common[0];

    // 등비수열 판별 변수
    var isGeometric = true;
    var commonRatio = common[1] / common[0];

    for (let i = 2; i < common.length; i++) {
        if (common[i] - common[i - 1] !== commonDifference) {
            isArithmetic = false;
        }

        if (common[i] / common[i - 1] !== commonRatio) {
            isGeometric = false;
        }
    }

    if (isArithmetic) {
        // 등차수열인 경우 다음 값을 추가
        that_num += commonDifference;
    } else if (isGeometric) {
        // 등비수열인 경우 다음 값을 곱셈
        that_num *= commonRatio;
    }

    return that_num;
}

boolean값을 사용해서 등차, 등비가 맞는지 확인하고 계산한다! 끗

부울 값을 사용하는 방법도 잊지 말고 계속 사용해야겠따 ㅎㅎ

 

10월 29일

문자열 출력하기 - javascript

 

코드

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = [line];
}).on('close',function(){
    str = input[0];
    console.log(str);
});

입문 문제를 끝내니까 문제 형식이 조금 달라졌다. 간단한 문제!! 이지만 코드에 대한 설명을 적어놓자면

1. readline 모듈을 가져옴

2. readline 모듈을 사용하여 인터페이스 객체인 rl을 생성 

     - Input은 사용자 입력을 받는 스트림(process.stdin) , output은 결과를 출력하는 스트림(process.stout)

3. input 배열 선언

4. line 이벤트 리스너 등록 

     - 사용자가 엔터 키를 누르면 발생. 입력된 텍스트가 line 이벤트 핸들러로 전달되고, input 배열에 저장함

5. close 이벤트 리스너 등록

     - 사용자가 입력을 끝내고 프로그램을 종료할 때 발생 ==> 이 이벤트 핸들러 내에 console.log를 추가하면

        사용자의 입력이 모두 받아진 후에 str값을 출력 할 수 있음

 

 

 

a와 b출력하기 - javascript

 

코드

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    console.log("a = " + Number(input[0]));
    console.log("b = " + Number(input[1]));
});

 

 

문자열  반복해서 출력하기 - javascript

 

코드

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    str = input[0];
    n = Number(input[1]);
    
    let result = str;
    
    for (let i = 1; i < n; i++){
        result += str
    }
    console.log(result);
  
});

result의 초깃값을 str로 설정하고 1부터 n까지 반복하며 str을 더해서 이어붙여준다.

 

다른 사람의 풀이 !

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    str = input[0];
    n = Number(input[1]);
    console.log(str.repeat(n));
});

repeat 메서드 사용ㅎㅎ 알아두기!!

 

 

 

10월 30일

부분 문자열 - javascript

 

내 코드

function solution(str1, str2) {
    if (str2.includes(str1)){
        return 1;
    } else {
        return 0;
    }
    
}

다른 사람의 풀이

const solution = (str1, str2) => str2.includes(str1) ? 1 : 0;

화살표 함수 쓰는것에 익숙해져보자!

 

첫 번째로 나오는 음수 - javascript

 

내 코드

function solution(num_list) {
    for (let i = 0; i < num_list.length; i++) {
        if (num_list[i] < 0) {
            return i;
        }
    }
    return -1; 
}