https://school.programmers.co.kr/learn/courses/30/lessons/176963

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

function solution(name, yearning, photo) {
    const map = new Map();
    for(let i=0;i<name.length;i++){
        map.set(name[i],yearning[i]);
    }

    var answer = [];
    for(let pdx in photo){
        let sum = 0;
        for(let idx in photo[pdx]){
            if(map.get(photo[pdx][idx]))
                sum+= map.get(photo[pdx][idx]);
        }
        answer.push(sum);
    }
    return answer;
}

해시 사용하니까 너무쉽다 하면서 풀었는데 

다른사람의 풀이 보니까 더 멋지게 푼 분이 있더라 허걱 ;;;

 

 

 

return photo.map((v)=> v.reduce((a, c)=> a += yearning[name.indexOf(c)] ?? 0, 0))

 

이렇게 푸셨음 헐 ......

 

https://school.programmers.co.kr/learn/courses/30/lessons/176963/solution_groups?language=javascript&type=all

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

아직 reduce 쓰는게 어색해서 잘 안 쓰게되는 것 같다 공부가 부족해서 그런거겠지!! 

예제 보면서 공부 하자잣 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12946#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

학생때 풀었던 문제죠? 

근데 기억안나서 게시판에서 해설 보고 이해했다...재귀 공부 하자 .. 

 

function solution(n) {
 
    var answer = [];
    
    function hanoi(n,start,end,mid){
        if(n==1){
            answer.push([start,end]);
            return;
        }
        else{
            hanoi(n-1,start,mid,end);
            answer.push([start,end]);
            hanoi(n-1,mid,end,start);
        }
    }
    hanoi(n,1,3,2);
    return answer;
}

 

예제에서나오는 원반이 2개 있을때

작은 원반을 중간으로, 큰원반을 끝으로 보낸 다음, 다시 작은 원반을 끝으로 보내는 과정을

예로 들어 설명하면, 

 

 

1. hanoi(n-1,start,mid,end) = hanoi(1,1,2,3)

> n==1 이므로 [1,2] push 후 return

 

2.answer.push([start,end])  

>처음의 hanoi(n,1,3,2)에서 start end인 [1,3] push

 

3.hanoi(n-1,mid,end,start) = hanoi(1,2,3,1)

>n==1이므로 [2,3] push 후 return 

 

https://school.programmers.co.kr/learn/courses/30/lessons/147355

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

function solution(t, p) {
    var answer = 0;
    var lastIdx = t.length;
    var len = p.length; //잘라야하는 문자열 크기 
    var now = 0;
    while(lastIdx-len>=now){
        let copy = t.slice(now,len+now)
        if(Number(copy)<=Number(p)){
            answer++;
        }
        now++;
    }
    return answer;
}

 

파이썬으로도 공부를 해야하나 하는 고민.... 파이썬 안 한지 오래됐는데말이지 

 

가장 많은 석유를 시추할 수 있는 열을 찾아야 하는 문제 

지나가는 석유 덩어리 전부를 추출해야 하므로 너비 검색을 위해 bfs를 사용했다. 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/250136

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

정확도 테스트는통과했으나 효율성 부분 4개테스트에서 시간초과가 발생했다. 

gpt4o의 힘을 빌려봐도 마땅한 답이 나오지 않는다... 역시 파이썬이 답인가............

function solution(land) {
    var answer = 0;
    var col = land[0].length;
    var row = land.length;
    
    var visited = Array.from({ length: row }, () => Array(col).fill(false)); // 외부에서 초기화
    
    const bfs = (land, visited, start) => {
        var directions = [[0, -1], [0, 1], [-1, 0], [1, 0]]; // 상하좌우
        var queue = [start];
        visited[start[0]][start[1]] = true; // 시작점을 방문 처리
        let oilCheck = 1;
        
        while (queue.length > 0) {
            const [x, y] = queue.shift(); // 선입선출 방식으로 꺼내기 
            for (let [dx, dy] of directions) {
                const nx = x + dx;
                const ny = y + dy;
                if (nx >= 0 && nx < land.length && ny >= 0 && ny < land[0].length && !visited[nx][ny] && land[nx][ny] === 1) {
                    queue.push([nx, ny]);
                    visited[nx][ny] = true;
                    oilCheck++;
                }
            }
        }
        return oilCheck;
    };
    
    // 석유 크기 계산
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            if (land[i][j] === 1 && !visited[i][j]) {
                bfs(land, visited, [i, j]);
            }
        }
    }
  
    const getMaxSize = (colIndex) => {
        let maxSize = 0;
        let visited = Array.from({ length: row }, () => Array(col).fill(false)); // 초기화
        for (let i = 0; i < row; i++) {
            if (land[i][colIndex] === 1 && !visited[i][colIndex]) {
                maxSize += bfs(land, visited, [i, colIndex]);
            }
        }
        return maxSize;
    };
    
    for (let j = 0; j < col; j++) { // 열을 탐색
        let res = getMaxSize(j);
        if (res > answer) answer = res;
    }
    
    return answer;
}

답이 나올때까지 좀 더 고민해봐야겠다. 

https://school.programmers.co.kr/learn/courses/30/lessons/178871

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

처음 작성한 코드 (시간초과)

function solution(players, callings) {
    var answer = [];
    var ph = new Map();
 
    for(let idx in players){
         ph.set(players[idx],idx);
    }
    
    answer = players;
    let ans = []; 
    callings.forEach((val)=>{
        let idx = ph.get(val);
        ph.set(answer[idx-1],idx);
        
        answer.splice(idx,1);
        answer.splice(idx-1,0,val);
        
        ph.set(val,idx-1)
    
    })
    
    return answer;
   
}

 

 

시간소요를 줄이기 위해서 findIndex 대신 해시맵을 사용해 플레이어들의 등수를 인덱싱 한 것 까진 괜찮았으나,

여전히 splice를 사용한 탓에 4개의 테스트에서 시간초과가 떴다. 

 

 

통과한 코드

function solution(players, callings) {
    var answer = [];
    var ph = new Map();
 
    for(let idx in players){
         ph.set(players[idx],idx);
    }
    
    answer = players;
    callings.forEach((val)=>{
        let idx = ph.get(val);
        ph.set(answer[idx-1],idx);
        let tempt = answer[idx-1]
        
        answer[idx]=tempt;
        answer[idx-1]=val;
        ph.set(val,idx-1)
    
    })
    
    return answer;
}

생각해보니 중간에 뭔가를 삽입할 일이 없는데 splice를 사용하는것은 비효율적이란 생각이 들었다. 

그래서 단순하게 생각하니 문제가 풀렸다 ~.~ 몇시간이나 고민했네 ... 

https://school.programmers.co.kr/learn/courses/30/lessons/181188

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

function solution(targets) {
    var answer = 0;
    targets.sort((a,b)=>a[1]-b[1]);
    console.log(targets)
    var max = 0;
    for(let i = 0; i<targets.length;i++){
        let [s,e]=targets[i];
        if(s>=max){max=e; answer++;}
        // console.log(" max",max,"ans",answer,s,e)
    }
    return answer;
}

처음 정렬을 할 때 start 기준으로 했더니 오류가 났는데 

end 기준으로 했더니 다시 정답이 나왔다 ㅎㅎ .. 그리디알고리즘(탐욕법)공부를 하자 !!!

 

 

 

 

그리고 단속 카메라 문제 

 

https://school.programmers.co.kr/learn/courses/30/lessons/42884

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

질문창에서 거의 같은문제라고 해서 봤더니 범위기준만 다르고 똑같더라 

function solution(routes) {
    var answer = 0;
    var max = -30000;
  
    routes.sort((a,b)=>a[1]-b[1]);
    console.log(routes);
    for(let i in routes){
        if(routes[i][0]>max){
            max=routes[i][1];
            answer++;
        }
    }
    return answer;
}

https://school.programmers.co.kr/learn/courses/30/lessons/258711

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

헐..어렵다..!!

function solution(edges) {
    var [dot,dounut,bar,eight]=[0,0,0,0];
    var graph =edges.reduce((map,key)=>{
        if(!map.has(key[0])){
            map.set(key[0],[1,0])
        }else{
           const [give,receive]=map.get(key[0]);
            map.set(key[0],[give+1,receive]);       
        }
        if(!map.has(key[1])){
            map.set(key[1],[0,1])
        }else{
            const [give,receive]=map.get(key[1]);
            map.set(key[1],[give,receive+1]);
        }
       
        
        return map;
    },new Map())
   
 
    
    for(let [key, value] of graph){
        const [give,receive]=value;
        
        if(give>1&&receive==0){
            dot = key; //정점 찾기 (정점은 give>=2, receive ==0)
        }
        else if(give==0&& receive>0)bar++; //막대그래프 찾기 (최상단의 막대그래프는 give==0, receive>0)
        
        else if(give>=2&& receive>=2)eight++;
    }
    
    dounut = graph.get(dot)[0]-eight-bar; //전체 그래프 개수: 정점과 이어진 선(give) 개수
    //전체 - 막대 - 8자그래프 = 도넛그래프 개수 
    
    return [dot,dounut,bar,eight];
}

 

그림을 잘 보고 그래프마다의 특성을 찾아내야 하는구만 

 

 

 

 

 

 

참고  : https://velog.io/@naro-kim/%EA%B7%B8%EB%9E%98%ED%94%84-2024-Kakao-winter-internship-%EB%8F%84%EB%84%9B%EA%B3%BC-%EB%A7%89%EB%8C%80-%EA%B7%B8%EB%9E%98%ED%94%84-Javascript

function solution(bandage, health, attacks) {
    var answer = 0;
    var success = 0;
    var now = health;
    var keep = 0;
    var last_attack = attacks[attacks.length-1][0];
    var time = bandage[0];
    var heal = bandage[1];
    var bonus = bandage[2];
    
    for(let i=1; i<=last_attack; i++){
       if(i == attacks[0][0]){
            now = now - attacks[0][1]
            attacks.shift();
            keep=0;
            console.log("attack",now)
           if(now<1){
               now = -1;
               break;
           }
       }
        else{
            if(now+heal>health)
                now = health;
            else now = now+heal;
            keep++;
            
            if(time==keep){
                keep=0;
                now +bonus < health? now = now + bonus : now = health;
            }
            
        }
       
        
    }
    
    
    return now;
}

삼항연산자 쓰면 심심찮게 오타나서 계속 틀리는데도 

깔끔해보여서 자꾸 쓰게된다 헷 

+ Recent posts