본문 바로가기

알고리즘/프로그래머스

(20)
[프로그래머스] 다리를 지나는 트럭(Java, Lv2, 큐) programmers.co.kr/learn/courses/30/lessons/42583?language=java 코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이 programmers.co.kr ## 접근방법 모든 트럭이 다리를 지나는 시간을 구하면 된다. 트럭마다 무게가 다르고, 다리가 견딜 수 있는 하중 무게도 생각해야 한다. 큐를 이용하면, 트럭들의 무게와 다리를 지나는 시간을 저장할 수 있다 .큐를 사용하는 이유는, 큐의 후입선출 방식때문이다. 즉, 나중에 들어온 트럭들은 순차적으로 큐에 쌓이고, 큐의 포인터가 가리키는..
[프로그래머스] 섬 연결하기(Java, Greedy, Lv3) programmers.co.kr/learn/courses/30/lessons/42861 코딩테스트 연습 - 섬 연결하기 4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4 programmers.co.kr ## 접근방법 섬을 최소의 비용으로 연결해야 한다. 이 문제를 보자마자 최소 신장트리의 개념이 떠올랐다. 가장 거리가 짧은 것들 부터 추가하면, 최소의 비용으로 모든 섬들을 연결할 수 있다. 그리디에서 자주 출제되는 유형은, 가장 거리가 짧은 것부터 찾아서 전역적 최적해를 찾는 방식이 자주 나오는 거 같다. 본론으로 돌아가서, 크루스칼 알고리즘을 이용하면 쉽게 문제를 해결할 수 있다. 처음에 시행착오를 소개하자면, 다리 비용을 기준으로 오름차순으로 정렬을 마쳤지만, 섬을 방..
[프로그래머스] 큰 수 만들기(Java, Greedy, Lv2, 새로운 코드, 사고력) programmers.co.kr/learn/courses/30/lessons/42883# 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr ## 접근방법 주어진 문자열에서, K개만큼을 지워서 가장 큰 수를 만들어야 한다. 앞자리가 클수록 가장 큰 수에 가까워질 것이다. 그렇다면, 어떻게 앞자리를 크게 만들까? 앞에서 탐색하면서, 해당 수보다 큰 수가 존재한다면 그 수로 교체할 수 있다. 그 수로 교체하기 위해선 사이에 있는 수들은 모두 지워야 한다. 만약에 사이에 있는 수들을 모두 지웠는데 정답의 길이가 되지 않는다면, 찾은 큰 수를 선택할 수 없다. 매순간에 앞자리를 크게 만드는 것이 가장 큰 수를 만들 수 있는 방법이다. 어떤 수보다 큰 수의 후보들은 (해당 수 + 1 ~ 9)가 될 ..
[프로그래머스] 조이스틱(Lv2, Greedy, 사고력, Java) programmers.co.kr/learn/courses/30/lessons/42860 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr ## 접근방법 조이스틱을 이용해서, 최소의 조이스틱 조작 횟수로 원하는 문자열을 만들어야 한다. 우선, 특정 위치에서 A에서부터 특정 문자를 만드는 것은, 위 혹은 아래로 이동하면 만들 수 있다. 위 방향으로만 이동하거나 아래 방향으로만 이동해야 최소로 문자를 만들 수 있다. 두 방향중에 작은 이동횟수를 선택해서 만들어주면 된다. 핵심은, 어떤 순서로 문자..
[프로그래머스] 체육복(Greedy, Java, Lv1, 사고력) programmers.co.kr/learn/courses/30/lessons/42862# 코딩테스트 연습 - 체육복 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번 programmers.co.kr ## 문제접근 체육복을 최대한 많은 학생들에게 나눠주려고 한다. 어떻게 나눠줘야 할까? 여벌이 있는 체육복들을 탐색하면서, 앞이나 뒤 혹은 자신이 체육복을 잃어버린 목록에 포함된다면 제공하면 된다. 하지만, 앞이나 뒤 혹은 자신을 매번 선택해야 하는데, 어떻게 선택하는것이 가장 현명할까? 체육복 여벌이 있는 사람이 번호 순서대로 체육복을 임의로 나눠준다고 생각해보자. 낮은 번..
[프로그래머스] 단속카메라(Java, Greedy, 사고력, Lv3) programmers.co.kr/learn/courses/30/lessons/42884 코딩테스트 연습 - 단속카메라 [[-20,15], [-14,-5], [-18,-13], [-5,-3]] 2 programmers.co.kr ## 접근방법 그리디 문제는 항상 코드는 단순하지만, 생각해내기가 쉽지 않다. 이 문제는 최소의 단속카메라를 통해서, 모든 운전자들을 단속할 수 있어야 한다. 어떤 운전자부터 카메라를 배치해야할까? 단속이 안된 운전자중에서, 가장 도착 거리가 작은 운전자를 확인해야 한다. 가장 도착 거리가 작은 운전자도 카메라에 찍혀야 되므로 카메라는 두는 것은 자명하며, 가장 도착 거리가 작은 운전자부터 확인해야 다른 운전자들이 해당 단속카메라로 단속이 된다면, 카메라를 불필요하게 설치할 일이 ..
[프로그래머스] 네트워크(Lv3, BFS/DFS, 시간복잡도, Java, 정답, 코드) programmers.co.kr/learn/courses/30/lessons/43162?language=java 코딩테스트 연습 - 네트워크 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있 programmers.co.kr ## 접근방법 같은 네트워크들끼리는 무조건 연결되어 있다는 점을 착안해서 문제를 풀어보자. 어떤 컴퓨터에서 탐색을 시작하면, 연결된 컴퓨터들을 모두 찾을 수 있다. 완전 탐색 기법인, BFS와 DFS를 둘다 가능하며, 시간복잡도는 O(N * N)이다. 완전 탐색 시에, 네트워크가 정해진 컴퓨터는 방문하지 않도록 체크한다. 생각보다 간단한 문제이므..
[프로그래머스] 광고 삽입(Java, Lv3, 카카오, 누적합) programmers.co.kr/learn/courses/30/lessons/72414 코딩테스트 연습 - 광고 삽입 시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11 programmers.co.kr ## 접근방법 광고를 삽입해서, 가장 많은 시간이 누적되도록 하는 구간을 찾아야 한다. 시청자들의 출입에 관한 로그 정보들이 있다. 출입에 관한 로그 정보들을 이용해서, 1초동안 누적된 시간들을 구할 수 있다. 만약에 1초에 시청을 시작하고, 10초에 시청을 종료한다고 생각해보자. 1초의 순간에 한 명이 ..