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

 

프로그래머스

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

programmers.co.kr

bfs로 문제를 구하는 방법은 정해져잇으니 외워두자 ~.~

 

function solution(maps) {
    var answer = 0;
    const n = maps.length;
    const m = maps[0].length;
    
    const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]; 
    const queue = [[0,0,1]]; //시작지점도 이동한걸로 보기 때문에 1 Q
    
    const visited = Array.from({length:n},()=>Array(m).fill(false));
    visited[0][0]=true;
    
    while(queue.length>0){
        let [x,y,dist]=queue.shift();
        
        if(x===n-1&&y===m-1)return dist;
        
        for(let [dx,dy] of directions){
            let nx = x+dx;
            let ny = y+dy;
            
            if(nx>=0 && nx<n && ny>=0 && ny<m && maps[nx][ny]!==0 && !visited[nx][ny]){
                  queue.push([nx,ny,dist+1]);//다시 이동한 위치 넣어줌 
                  visited[nx][ny]=true; //방문했으니 true로바꿈 
            }
              
        }
    }
    return -1;
}

 

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

 

프로그래머스

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

programmers.co.kr

 

 

function solution(numbers) {
   return numbers.filter(n=>n===0).length === numbers.length ? "0" :
     numbers.sort((a,b)=>{
        const order1 = `${b}${a}`
        const order2 = `${a}${b}`
        return order1.localeCompare(order2);
    }).join('');

}

 

 

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

 

String.prototype.localeCompare() - JavaScript | MDN

localeCompare() 메서드는 참조 문자열이 정렬 순으로 지정된 문자열 앞 혹은 뒤에 오는지 또는 동일한 문자열인지 나타내는 수치를 반환합니다.

developer.mozilla.org

.localeCompere() 를 사용해 문자열의 순서를 비교해서 해결했다. 

 

테스트케이스 11번만 통과를 못해서 질문창을 읽어보니

11번은 numbers 값으로 0만 들어있는 (e.g [0,0,0,0,0,0,0]) 케이스 라는 것이었다 ㅂㄷㅂㄷ.... 

그래서 배열안에 들어있는 0의개수가 배열의 길이와 동일하면 문자열 0을 리턴하게끔 수정했더니 통과 할 수 있었다. 

 

 

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

function solution(array, commands) {
    var answer = [];

    for(i of commands){
        let larray = [...array];
        let trim = larray.slice(i[0]-1,i[1]).sort((a,b)=>a-b);
        var num = trim[i[2]-1];
        answer.push(num);
    }

    return answer;
}

 

slice와 sort 같은 자바스크립트 메서드를 쓸 줄 안다면 쉽게 풀 수 있는 문제

**splice는 원본 배열을 변경하는 메서드로 이 문제에서는 사용하면 안 됨! 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

function solution(nums) {
    var max = nums.length/2;
    var ponkemon = new Map();
    for(i of nums){
        if(!ponkemon.has(i))
            ponkemon.set(i,1);
        else 
            ponkemon.set(i,ponkemon.get(i)+1);
    }
    if(ponkemon.size<max)return ponkemon.size;
    else return max;
}

해시맵으로 각 폰켓몬별 마릿수를 구하고, 

폰켓몬 / 2 값보다 폰켓몬 종류값이 큰 경우 폰켓몬 / 2 값을, 

아닐 경우 폰켓몬의 종류값을 .size로 구해서 리턴하면 된다. 

 

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Map

 

Map - JavaScript | MDN

Map 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억합니다. 모든 값(객체 및 원시 값 모두)은 키 또는 값으로 사용될 수 있습니다.

developer.mozilla.org

자바스크립트의 해시맵을 사용할 줄 안다면 쉽게 풀 수 있는 문제다! 

 

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 

 

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

지나가는 석유 덩어리 전부를 추출해야 하므로 너비 검색을 위해 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를 사용하는것은 비효율적이란 생각이 들었다. 

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

+ Recent posts