문제 설명

문제 링크

[프로그래머스[Level2] 조이스틱]
(https://school.programmers.co.kr/learn/courses/30/lessons/42860)

접근 방법

  1. ▲ ▼ 알파벳 최소 이동

    name[i]번째 value - 65('A'의 아스키 코드값) 으로 값을 구하기
    알파벳의 총 개수 : 26개 / 2 를 통해 13보다 큰 값은 'Z'로 시작하는게 더 최소임

  2. ◀ ▶ 커서 최소 이동

    해결되지 않아 구글링을 통해 직접 수기로 작성하며 이해함.

코드

function solution(name) {
    // 'A'~'Z' : 65~90
    let answer = 0;
    let answer = 0; 
    const nameLength = name.length;
    let move = nameLength - 1;
    let move = nameLength - 1; //오른쪽으로 모두 이동하였을 때의 count
    for(let i=0;i<nameLength;++i){
        let howManyClickButton = name.charCodeAt(i)-65;
        if(howManyClickButton>13) howManyClickButton = (26- howManyClickButton);
        // ▲ ▼ 부분

        //name.charCodeAt(i) => name의 i번째 인덱스의 아스키 코드값 - 65('A'의 아스키 코드값) 
        let howManyClickButton = name.charCodeAt(i)-65; 
        // 알파벳의 개수 26개, 반으로 나누어 13보다 큰 값이면 'Z'부터 count하는게 더 최소.
        if(howManyClickButton>13) howManyClickButton = (26- howManyClickButton); 
        answer+=howManyClickButton;

        // ◀ ▶ 부분
        let x = i+1;
        while(x<nameLength &&name[x]=='A') x++;

        move = Math.min(move,i+nameLength-x+Math.min(i,nameLength-x));
    }
    answer+=move;
    return answer;
}

문제 설명

문제 링크

[프로그래머스[Level2] 큰 수 만들기]
(https://school.programmers.co.kr/learn/courses/30/lessons/42883)

접근 방법

  1. 매 순간 최적을 생각하는 그리디로 일정 범위 내에서 가장 큰 수를 찾기(테케10,시간 초과)

    for문을 0~numberOfDigits 필요한 범위만큼 설정
    안쪽의 for문에서는 k+i만큼 범위를 설정 (why?)
    startIndex의 변화로 현재 가장큰수 찾고 그 다음 인덱스를 시작 Index로 설정

  2. 최소한의 변수 선언으로 최적의 해 도출하기

    주어진 number 배열의 길이만큼 for문을 구성
    while문을 사용하여
    1)k>0 -> 주어진 k만큼 while문을 돌리며
    2)answer[answer.length-1] < number[i]

    -> answer 배열의 맨뒤 원소값을 현재 number[i]와 계속해서 비교하여
    number[i]보다 작은경우 빼주기 위해서 ex) 4 1 7 ...=> 4 7  => 7

    answer.join("")으로 배열형식을 String 형식으로 조절
    .slice(0,number.length-k) 는 ex) "666","44444",... 등 연속되는 숫자인 경우
    while문 루프를 돌지 않고 push만 하기 때문에 원하는 자릿수만큼 결과를 리턴하기 위함

    코드

function solution(number, k) {
    var answer = '';
    // return 받을 자리수 
    let numberOfDigits =  number.length - k ;
    let startIndex = 0;

    for(let i=0;i<numberOfDigits; ++i){
        let maxValue = -1;
        let maxIndex = 0;
        // 범위 설정 이유 :
         ex) "4177952841" ,k = 4 인 경우 원하는 자릿수 6으로
             4 1 7 7 9 | 5 2 8 4 1
                     ↑  
             앞쪽에서 k+1 범위 내에서 가장 큰 수 : 9 , index : k+1 나머지 5자리를 붙여서 만들어야 하기때문에
        for(let j=startIndex; j<=k+i;++j){
            if(maxValue<parseInt(number[j])){
                maxValue = number[j];
                maxIndex = j;
            }
        }
        startIndex = maxIndex+1; 
        answer+=maxValue
    }
    return answer;
}
// 테케 10 : 시간 초과
function solution(number, k) {
    var answer = [];
    for (let i=0;i<number.length;++i){
        while(k>0&&answer[answer.length-1]<number[i]){
            answer.pop();
            k--;
        }
        // answer : 1  number[1] = 9
        // answer : (1) 9  number[2] = 2
        // answer : (1) 9 2 number[3] = 4
        // answer : (1) 9 (2) 4
        answer.push(number[i]);
    }
    // ex) 똑같은 수 나올 경우 "333" while 문에 들어가지 않고 "333"을 전부 return 하게 되기 때문에 원하는 문자열 만큼을 리턴하게 만들어줌 
    return answer.join("").slice(0,number.length-k);
}

문제 설명

문제 링크

[프로그래머스[Level1] 크기가 작은 부분 문자열]
(https://school.programmers.co.kr/learn/courses/30/lessons/147355)

접근 방법

  1. t의 문자열을 index 0 부터 p.length만큼 잘라주기
  2. p.length만큼 자른 뒤에 pick라는 변수를 주고 한칸씩 이동하면서 다시 1의 과정을 반복
  3. parseInt를 통해 정수로 바꿔줘 비교한 뒤 조건에 적합하면 answer++

    코드

function solution(t, p) {
    var answer = 0;
    let pick = 0;

    while(pick+p.length!=t.length+1){
        if(parseInt(t.slice(pick,pick+(p.length))) <=parseInt(p)) answer++;
        pick++;
    }
    return answer;
}

문제 설명

문제 링크

[프로그래머스[Level1] 가장 가까운 같은 글자]
(https://school.programmers.co.kr/learn/courses/30/lessons/142086)

접근 방법

  1. 일단 기준을 잡은 상태에서 기준만큼 검사해주는 방식을 선택함
  2. 앞서 나온 것이 없다면 1번 반복

    코드

function solution(s) {
    var answer = [];
    let i=0;
    //visited를 따로 설정해 준 이유는 
    //ex) "banana" 처럼 a가 3개인 경우 먼거리에 있는 것도 answer에 push하기 때문에
    let visited = []; // 방문 여부 판단
    while(i!=s.length){
        let standard = s[i];
        let istrue = false;
        for(j=0;j<i;++j){
            if(standard===s[j]&&!visited[j]){
                answer.push(i-j);
                visited[j]= true;
                istrue = true;
            }
        }
        if(istrue===false) answer.push(-1);
        i++;
    }
    return answer;
}

문제 설명

문제 링크

[프로그래머스[Level2] 기능개발]
(https://school.programmers.co.kr/learn/courses/30/lessons/42586)

접근 방법

  1. success 배열을 만들어 배포가 이루어지는 일수 저장해주기 => success배열을 탐색하며 기준잡은 success[standard]보다 큰수가 나오기 전까지 cnt값을 ++해줘 기준보다 큰 수가 나올경우 answer에 푸시하기

    코드

function solution(progresses, speeds) {
    var answer = [];
    let cnt =1; //cnt는 앞 뒤 원소 비교후 앞의 원소가 다음으로 오는 원소보다 작을 때까지 ++ 
    let success = []; // success에 (100-progresses)/speeds = ?(일간 작업 후 배포가 가능한지에 대한 저장소)
    for(let i = 0,standard = 0;i<progresses.length;++i){
        success[i]= Math.ceil((100-progresses[i])/speeds[i]);
        if(success[standard]>=success[i]&& i!==0) cnt++; //i!==0 을 해준 이유는 0번째 원소가 기준되어 시작하기 때문에
        else if(success[standard]<success[i]&&i!==0){
            standard = i; //standard를 i번째 인덱스로 바꿔주고
            answer.push(cnt); //그동안 count 된 값 : cnt 를 answer에 push해주기
            cnt = 1; // 다시 같은 것을 반복해주기 위해 1로 초기화
        }
    }
    answer.push(cnt);
    return answer;
}

문제 설명

문제 링크

프로그래머스(Level1) 숫자 문자열과 영단어

접근 방법

  1. 0,1,2,3,... 각각 숫자를 영단어로 바꾸기

-> numbers 배열을 만들어 ["zero","one","two"...,"nine"]을 넣어줍니다.

  1. for문을 루프를 돌며 문자열 s에서 영단어로 되어 있는 numbers배열 탐색 후 split을 수행하고 join을 통해 문자열 s에서 split이 수행되어진 부분을 연결해줍니다.

  2. (1),(2) 과정을 수행한 후 주어진 문자열을 숫자로 return 해줍니다.

코드

function solution(s) {
    // numbers 라는 배열을 만들어 숫자에 해당하는 영단어 배열을 만들어 줍니다.
    const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    for(let i=0;i<numbers.length;++i){
        //문자열 s에서 영단어로 되어 있는 numbers 배열 탐색 후 split 수행합니다.
        let arr = s.split(numbers[i]); 
        //join 을 통해 split되어진 문자열 s를 i를 넣어주고 연결해줍니다.
        s = arr.join(i);
    }
    // 형변환을 통해 숫자로 return 합니다.
    return Number(s);
}

+ Recent posts