728x90

알고리즘/PS - 프로그래머스 46

[프로그래머스 - Java] 가장 먼 노드

https://programmers.co.kr/learn/courses/30/lessons/49189 코딩테스트 연습 - 가장 먼 노드 6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3 programmers.co.kr 풀이 BFS 알고리즘을 이용해서 쉽게 풀이 가능한 문제 입니다. 주어진 edge배열을 처리하기 쉽도록 ArrayList를 이용해 양방향으로 저장합니다. 큐에 이동 횟수 = 0, 시작 위치 = 1인 시작점을 넣고 BFS탐색을 시작합니다. 방문 여부와 이동 횟수를 고려하면서 큐에 넣고 빼면서 최대 이동횟수와 해당 노드의 갯수를 업데이트하며 문제를 해결합니다. import java.util.*; class Solution { public..

[프로그래머스 - Java] 디스크 컨트롤러

https://programmers.co.kr/learn/courses/30/lessons/42627 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를 programmers.co.kr 풀이 이 문제는 우선순위큐 2개를 사용해서 풀이하였습니다. 작업의 요청 시간을 기준으로 오름차순 정렬되는 우선순위 큐 : pq1 작업의 소요 시간을 기준으로 오름차순 정렬되는 우선순위 큐 : pq2 이렇게 두가지 우선순위 큐를 적절하게 이용하면서 문제를 해결해야 합니다. 모든 작업들을 요청 시간을 기준으로하는 pq1에 넣어줍니다. 현재 시간 = 0인 시점부..

[프로그래머스 - Java] 조이스틱

https://programmers.co.kr/learn/courses/30/lessons/42860# 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr 풀이 상하 이동에 대한 횟수는 쉽게 생각할 수 있습니다. 위의 그림에서 알 수 있듯, 각각의 알파벳을 나타내기 위한 이동 횟수가 'N'을 기준으로 증가하다가 감소하는 것을 알 수 있습니다. 'A' ~ 'N' : (문자 - 'A') 번 위로 이동 'M' ~ 'Z' : ('Z' - 문자 + 1) 번 아래로 이동 문제는 좌우 이동에 대한 횟수입니..

[프로그래머스 - Java] 5주차

https://programmers.co.kr/learn/courses/30/lessons/84512 코딩테스트 연습 - 5주차 사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니 programmers.co.kr 풀이 사전의 단어 순서대로 재귀를 이용해서 단어를 생성하면서 dfs 방식으로 문제를 해결했습니다. 재귀를 이용하면 재귀의 호출 횟수와 해당 문자열이 사전에 나오는 순서가 동일하기 때문에 쉽게 문제 해결이 가능합니다. 단어가 하나도 추가되지 않은 상태인 dfs(0, "", word)를 호출하는 것으로 재귀를 시작합니다...

[프로그래머스 - Java] 가장 큰 정사각형 찾기

https://programmers.co.kr/learn/courses/30/lessons/12905 코딩테스트 연습 - 가장 큰 정사각형 찾기 [[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9 programmers.co.kr 풀이 이 문제는 브루트포스로 푸는 경우 절대 효율성을 통과할 수가 없는 문제입니다. 대충 DP를 써야겠다 라는 생각은 했지만 어떤 방식으로 값을 저장해나갈지 생각할 수가 없어서 질문하기를 보고 풀이했습니다. 우선은 표의 모든 숫자가 0으로 이루어져 있는지 확인해야 합니다. 0으로 이루어진 경우 1조차도 될 수 없기 때문입니다. 0으로 이루어진 경우엔 바로 0을 return해 필요없는 연산이 더이상 일어나지 않도록 합니다 이제 본격적으로 가장 큰 정사각형..

[프로그래머스 - Java] 베스트앨범

https://programmers.co.kr/learn/courses/30/lessons/42579 코딩테스트 연습 - 베스트앨범 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 programmers.co.kr 풀이 이 문제에선 속한 음악의 재생수가 가장큰 장르부터 answer에 넣어주며, 해당 장르 안에서는 가장 많이 재생된 2곡을 순서대로 넣어줍니다. 만약 재생횟수가 동일하다면 인덱스가 작은것을 먼저 넣어주는 문제입니다. 우선 각 장르별로 총 재생수를 구합니다 HashMap을 이용해 key는 장르, value는 총 재생 수로 하여 중복없이 총합이 구해지도록 합니다..

[프로그래머스 - Java] 삼각 달팽이

https://programmers.co.kr/learn/courses/30/lessons/68645 코딩테스트 연습 - 삼각 달팽이 5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11] programmers.co.kr 풀이 삼각 달팽이 문제는 규칙을 찾는것이 가장 어려웠다. 이 문제를 푸는데 가장 중요한 아이디어는 정삼각형 형태인 주어진 수들을 왼쪽으로 몰아 2차원배열에 직각삼각형 형태로 놓는다고 생각하는 것이다. 이렇게 생각을 바꾸고 나면 쉽게 풀이가 가능하게 된다. 적히는 숫자들의 총 갯수는 n*(n+1)/2 (등차수열의 합)이므로 answer배열의 크기를 n*(n+1)/2로 설..

[프로그래머스 - Java] 이중우선순위큐

https://programmers.co.kr/learn/courses/30/lessons/42628 코딩테스트 연습 - 이중우선순위큐 programmers.co.kr 풀이 최댓값과 최솟값의 삭제를 모두 고려해야하는 문제입니다. 사실 큐 하나로 최솟값 삭제와 최댓값 삭제를 모두 구현하는게 정석일 것 같지만 코테는 빠른시간안에 코드를 구현해야하니까... 저는 그냥 우선순위 큐 2개를 사용해서 문제를 풀었습니다. 우선 순위큐를 2개 선언합니다. 하나는 최댓값이 맨위에 오는 우선순위 큐(pq1) / 다른 하나는 최솟값이 맨위에 오는 우선순위 큐(pq2) 삭제와 삽입을 반복하면서 큐에 몇개의 수가 남게 되는지 확인하는 변수 cnt 사용 그런 뒤 operations를 하나씩 읽어오면서 해당하는 연산을 수행합니다...

[프로그래머스 - Java] N으로 표현

https://programmers.co.kr/learn/courses/30/lessons/42895 코딩테스트 연습 - N으로 표현 programmers.co.kr 풀이 프로그래머스에는 이 문제가 DP로 분류되어 있지만 왜 그런지 이해가 가지 않습니다... DP로 대체 어떻게 푸는 걸까 하고 삽질하다가 검색해보니 다들 DFS로 풀어서 저도 DFS로 풀이하였습니다! 최대 8개의 N으로 number를 나타내야 하므로 걸리는 시간이 그리 크지 않은 선에서 해결 가능합니다. 이 문제에서 중요한 것은 NN....N을 고려해서 처리하는 것입니다. 따라서 dfs호출시에 재귀로 사칙연산만 수행하는게 아니라 같은 경우도 풀이가능하도록 코드를 구현해야 합니다. 저는 이부분이 너무 어려웠어요ㅠㅠㅠ class Solutio..

[프로그래머스 - Java] 입국심사

https://programmers.co.kr/learn/courses/30/lessons/43238 코딩테스트 연습 - 입국심사 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 programmers.co.kr 풀이 이분탐색을 이용해서 해결하는 문제입니다. 이문제에서 중요한 것은 long형을 잘쓰는것!!! 저는 제 코드에서 9번째 줄에 long maxT = (long)n * (long)times[len-1]; 이부분에 처음에 (long)을 안붙였다가 계속 반타작하더니 붙이고 맞았습니다... 우선 최소로 걸리는 시간은 1이고, 최대로 걸리는 시간은 가장오래걸리는 심사관에게..

728x90
반응형