알고리즘 문제풀이 23

프로그래머스 level 2 - 롤케이크 자르기(Javascript)

(롤케이크 자르기)[https://school.programmers.co.kr/learn/courses/30/lessons/132265] 배운 것, 유의할 것 Set을 활용한 풀이 해당 문제는 형과 동생이 각자 중복된 토핑을 갖고 있다면 하나로 보기 때문에 배열로 풀 경우 중복 값을 삭제해주는 별도의 연산이 필요로 하기 때문에 Set을 사용했다. 평소 잘 활용하지 않던 Set의 메소드들 간단 정리 add const set1 = new Set(); set1.add(1); set1.add(2); console.log(set1); // Set(2) { 1, 2 } clear, size const set1 = new Set(); set1.add(1); set1.add('foo'); console.log(set1..

프로그래머스 level 2 - 미로 탈출(Javascript)

프로그래머스 level 2 - 미로 탈출 배운 것, 유의할 것 레버를 방문했다가 방문 배열과 큐를 초기화한 후 출구로 가는 것만 생각할 수 있다면 전형적인 그래프 탐색 문제였고, BFS로 어렵지않게 풀 수 있었다. 그렇지만 방문배열과 큐를 초기화하는 과정에서 break 가 아닌 continue 를 쓰는 바람에 한참의 시간을 쏟아버림… 문제의 코드는 상하좌우를 확인하면서 레버를 방문하면 방문배열과 큐를 초기화해주는데, 코드를 짜면서 처음에는 continue를 사용했다. 다음 while문이 시작될 것 처럼 생각했던 것 같다. 그치만 이 때문에 위쪽 통로를 탐색하면서 레버를 발견해서 초기화되면서 '하좌우’에서 통로를 만나면 바로 방문처리를 해버리면서 문제가 발생했었다. for(let i = 0; i < 4; ..

프로그래머스 level 1 - 신고 결과 받기(Javascript)

신고 결과 받기 배운 것, 유의할 것 객체를 사용한 문제 풀이 문제 자체는 이해안되는 점도, 구현의 어려운 점도 없었다. 객체를 사용해서 풀어서 뿌듯 배열에서 중복 값 삭제 const array = [1, 2, 3, 3, 4, 4, 5]; const set = new Set(array); const newArray = [...set] 객체에서 값만 뽑아 배열로 const obj = { a:1, b:2, c:3, d:4, } Object.valuse(obj) // [1, 2, 3, 4] 정답코드 function solution(id_list, report, k) { // 유저가 받은 결과 메일 수 var answer = []; // 동일인이 같은 유저를 여러번 신고해도 중복되지 않으므로 중복 제거 rep..

프로그래머스 level 2 - 두 큐 합 같게 만들기(Javascript)

두 큐 합 같게 만들기 배운 것, 유의할 것 시간초과와의 싸움(했다치고!) 문제 해결 방법을 찾는 것은 전혀 어려움이 없었다. 하지만 제한사항이 아래와 같아서 시간초과 등의 문제가 있을 것이 분명하긴 했다. 제한사항 1 ≤ queue1의 길이 = queue2의 길이 ≤ 300,000 1 ≤ queue1의 원소, queue2의 원소 ≤ 109 이런 저런 시도를 해본결과 정답케이스를 늘릴 수는 있었지만 모두 해결할 수 없어서 다른 분의 풀이를 보고 참고했다. 시간초과를 줄이기 위해 개선한 부분을 일부 적어보면, // 1. 큐 배열의 합계 업데이트 방식 // 매 반복에서 queue1과 queue2의 합을 업데이트 해주는 부분 // 최초에는 매 반복마다 추출과 삽입 이후 reduce를 써서 q1Sum과 q2Su..

프로그래머스 level 2 - 마법의 엘리베이터(Javascript)

마법의 엘리베이터 배운 것, 유의할 것 배열로만 풀 필요 없다 ㅠㅠ 왜 그런지 모르겠는데 알고르즘 문제는 배열로 푸는게 편하다. 정답만 구하면된다? 라는 생각도 많이 하긴 하는데, 다른 메소드들에 익숙해지지 못하는 경우도 많고 생각의 틀도 닫힌다는 느낌이 들 때도 있다. 그리고 문제에서 주어지는 자료를 가공해서 푸는 경우가 많은데, 현업에서 raw 데이터를 내 입맛대로 가공하면 협업이나 데이터 관리에도 문제가 될 수 있겠다는 생각이 든다… 별도의 공부를 하든 다른 분들의 코드를 참고해서 나의 방식과 비교해서 더 나은 방법을 고민해야겠다. 재귀로 푼 코드 function solution(storey) { if (storey < 5) return storey; const r = storey % 10; con..

프로그래머스 level 2 - 리코쳇 로봇(Javascript)

리코쳇 로봇 배운 것, 유의할 것 그래프 풀이 시 방문 체크 배열 생성 평소에 그래프 문제에서 방문 여부를 체크할 때 이중 배열을 만드는 경우가 많은데, 항상 수동으로 만들어 줬었다. 방문 여부를 체크하는 이중 배열은 그래프의 배열과 사이즈가 같기 때문에 map 메소드를 활용해서 간단하게 만들어봤는데 잘 적용되었다. 기억할 것. // 이중배열의 그래프가 있다면 const board = [[1, 2], [3, 4]]; // 아래와 같이 방문 여부를 나타내는 이중 배열을 만들 수 있다. const visited = board.map(a=>a.map(b=>false)); 배열에서 함수를 담고 꺼내쓰기…? 이번문제는 한칸 이동이 아니라 상하좌우 네 방향으로 쭉 이동하면서 장애물이나 벽을 만나는지를 체크해줘야하고..

프로그래머스 level 3 - 정수 삼각형(Javascript)

정수 삼각형 문제 설명 위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다. 삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요. 제한사항 삼각형의 높이는 1 이상 500 이하입니다. 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다. 입출력 예 triangle result 7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5 30 나의 풀이 ..

프로그래머스 - 게임 맵 최단거리(DFS, BFS)

프로그래머스 - 타겟 넘버(DFS, BFS) 나의 풀이 function solution(maps) { // 세로 및 가로 칸의 수 const n = maps.length; const m = maps[0].length; // 상,하,좌,우 탐색 const dx = [-1, 1, 0, 0]; const dy = [0, 0, -1, 1]; const queue =[]; function bfs(startX,startY){ // 시작 지점을 거리 1로 시작 queue.push([startX, startY,1]); // 큐에 원소가 있는 동안 반복 while(queue.length){ // 현재 탐색하는 지점의 좌표와 거리 const [x, y, distance] = queue.shift(); // 현재 탐색지가 ..

프로그래머스 - 카펫(완전탐색)

프로그래머스 - 카펫(완전탐색) 문제 설명 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한사항 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다. 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다. 카펫의 가로 길이는 세로..