문제 설명

문제 링크

[프로그래머스[Level2] 주식가격]
(https://school.programmers.co.kr/learn/courses/30/lessons/42584)

접근 방법

  1. 스택/큐
  2. 첫번째 원소를 기준으로 나머지 원소들보다 작은 경우 answer 에 푸시!
function solution(prices) {
    var answer = [];
    let len = prices.length;

    let idx = 0;

    while(len --) {

        let price = prices[idx];

        let cnt = 0;

        for(let i=idx+1;i<prices.length;++i){
            cnt++;
            if(price > prices[i]) break;
        }

        answer.push(cnt);

        idx++;
    }
    return answer;
}

문제 설명

문제 링크

[프로그래머스[Level2] 마법의 엘리베이터]
(https://school.programmers.co.kr/learn/courses/30/lessons/148653)

접근 방법

  1. 그리디 알고리즘
  2. JS는 /(나누기) 사용시 소수점 아래의 값까지 다 나오기 때문에 floor를 적절하게 활용해주어야함.
  3. -1,1,-10,10,-100,100 등과 같이 버튼이 구성되어 있다. => 17 같은 경우는 20으로 0층을 내려가는 것이 더 빠름.
  4. 그래서 5보다 큰경우, 5인 경우, 5보다 작은 경우를 나눠서 구분지어 If문을 구성

    코드

function solution(storey) {
    var answer = 0;
    answer = makeResult(storey);
    return answer;
}

function makeResult(storey){
    let num = storey;
    let answer =0;
    while(num!=0){
        let tmp = num%10;
        if(tmp>5) {
            num+=(10-tmp);
            answer+=(10 - tmp);
        }
        else if(tmp == 5&&Math.floor(num/10)%10>=5) {
            num+=10-tmp
            answer+=10-tmp;
        }
        else {
            answer+=tmp;
        }
        num =Math.floor((num/10));
    }
    return answer;
}

문제 설명


문제 링크

프로그래머스[Level1] 신고 결과 받기

접근 방법

(key,value) 형식의 문제로 접근함.

  1. id_list.map을 통해 userList를 key,value로 만들어 줍니다.
    => userList 는 신고당한 사람들이 key로 value에는 신고를 한 사람들을 저장해줍니다.
  2. report.map 을 통해 report로 부터 받은 string을 split 하여 가공 가능한 자료로 바꾸어 줍니다.
    => user_id,report_id 로 신고한 사람과 신고 당한 사람을 각각 분류
  3. "한 유저를 여러번 신고할 수도 있지만, 동인한 유저에 대한 신고 횟수는 1회로 처리됩니다." 의 조건을 해결
    => userList[신고당한 사람]이 신고한 사람이랑 같지 않게 조건식을 만들어 줍니다.
  4. userList(신고 당한 사람)의 length 가 k의 값과 같거나 클 때 -> 해당 userList[key]에 해당하는 value는 object 형식이기 때문에 for문이나 map을 사용하여 id_list.indexOf()를 이용해 answer인덱스에 해당하는 값을 더해줍니다.

코드

function solution(id_list, report, k) {
    const answer = new Array(id_list.length).fill(0);
    let userList = [];
    id_list.map((value)=>{
        userList[value]= [];
    })
    report.map(value=>{
        const [user_id,report_id]=value.split(' ');
        if(!userList[report_id].includes(user_id))userList[report_id].push(user_id);
    })
    for(const key in userList){
        if(userList[key].length>=k){
            userList[key].map(v=>{
                answer[id_list.indexOf(v)]++;
            })
        }
    }
    return answer;
}

문제 설명

문제 링크

[프로그래머스[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;
}

문제 설명

문제 링크

프로그래머스[Level2] 무인도 여행

접근 방법

1. 연결되어 있는 섬 찾아서 더해주기
2. dfs,bfs 문제
3. (현재 x좌표,현재 y좌표)를 기준으로 상하좌우 탐색 해서 연결이 되어 있는지 연결이 되어있다면 Sum에 +해주기

코드

function solution(maps) {
    var answer = [];
    let map = initMap(maps);
    // 연결되어 있는 공간이 없으면 -1 리턴
    if(map ==-1) return [-1];
    let visited = initVisited(maps);

    let dx = [1,0,-1,0];
    let dy = [0,1,0,-1];

    for(let col=0;col<maps.length;++col){
        for(let row =0;row<maps[col].length;++row){
            if(!visited[col][row]){
                let result = bfs(row,col,visited,map,dx,dy,map[col][row]);
                if(result>0) answer.push(result);
            }
        }
    }
    return answer.sort((a,b)=> a-b);
}

// bfs 구현
function bfs(x,y,visited,map,dx,dy,sum){
    let queue = [];
    queue.push([x,y]);
    visited[y][x]= true;
    while(queue.length!=0){
        let q = queue.shift();
        let x = q[0];
        let y = q[1];

        for(let dir = 0;dir<4;++dir){
            let nx = x+dx[dir];
            let ny = y+dy[dir];

            if(nx>=0&&nx<map[0].length&&ny>=0&&ny<map.length&&map[y][x]!=-1){
                if(!visited[ny][nx]&&map[ny][nx]!=-1){
                    sum+=map[ny][nx];
                    visited[ny][nx]=true;
                    queue.push([nx,ny]);
                }
            }
        }
    }
    return sum;   
}

// map을 X라면 -1로 바꿔주었습니다. 작성하는 사람마다 다르지만 저는 int형식으로 하고 싶어서 init함수 만들어 줬습니다.
function initMap(maps){
    let map = [];
    let isTrue = false;
    for(let col=0;col<maps.length;++col){
        let m = [];
        for(let row = 0; row<maps[col].length;++row){
            if(maps[col][row]==='X') m[row]=-1;
            else {
                m[row] = parseInt(maps[col][row]);
                isTrue = true;
            }
        }
        map.push(m);
    }
    if(!isTrue) return -1;
    else return map;
}
// visited 방문했는지 여부를 초기화 해주었습니다.
function initVisited(maps){
    let visited = [];
    for(let col=0;col<maps.length;++col){
        let visit = [];
        for(let row= 0;row<maps[col].length;++row){
            visit[row]=false;
        }
        visited.push(visit);
    }
    return visited;
}

문제 설명


문제 링크

프로그래머스[Level1] 신고 결과 받기

접근 방법

(key,value) 형식의 문제로 접근함.

  1. id_list.map을 통해 userList를 key,value로 만들어 줍니다.
    => userList 는 신고당한 사람들이 key로 value에는 신고를 한 사람들을 저장해줍니다.
  2. report.map 을 통해 report로 부터 받은 string을 split 하여 가공 가능한 자료로 바꾸어 줍니다.
    => user_id,report_id 로 신고한 사람과 신고 당한 사람을 각각 분류
  3. "한 유저를 여러번 신고할 수도 있지만, 동인한 유저에 대한 신고 횟수는 1회로 처리됩니다." 의 조건을 해결
    => userList[신고당한 사람]이 신고한 사람이랑 같지 않게 조건식을 만들어 줍니다.
  4. userList(신고 당한 사람)의 length 가 k의 값과 같거나 클 때 -> 해당 userList[key]에 해당하는 value는 object 형식이기 때문에 for문이나 map을 사용하여 id_list.indexOf()를 이용해 answer인덱스에 해당하는 값을 더해줍니다.

코드

function solution(id_list, report, k) {
    const answer = new Array(id_list.length).fill(0);
    let userList = [];
    id_list.map((value)=>{
        userList[value]= [];
    })
    report.map(value=>{
        const [user_id,report_id]=value.split(' ');
        if(!userList[report_id].includes(user_id))userList[report_id].push(user_id);
    })
    for(const key in userList){
        if(userList[key].length>=k){
            userList[key].map(v=>{
                answer[id_list.indexOf(v)]++;
            })
        }
    }
    return answer;
}

+ Recent posts