Algorithm & Data Structure
[Data Structure] Priority Queue(우선순위 큐) Java로 구현하기
Priority Queue(우선순위 큐)란? 일반적인 큐의 구조 FIFO(First In First Out)을 가지면서, 데이터가 들어온 순서대로 데이터가 나가는 것이 아닌, 각 요소들이 각각의 우선순위를 갖고있고, 요소들의 대기열에서 우선순위가 높은 요소가 먼저 제공되는 자료구조 Priority Queue를 사용하기 위해서는 우선순위 큐에 저장할 객체는 필수적으로 Comparable Interface를 구현해야한다. Comparable Interface를 구현하면 compareTo 메서드를 오버라이드하게 되는데 해당 객체에서 처리할 우선순위 조건을 리턴해주면 Priority Queue가 알아서 우선순위가 높은 객체를 추출해주는 것이다. 우선순위 큐를 구현하는데 있어 대표적인 구현 방식이 힙을 이용하는 ..
[Java] 프로그래머스 Lv.2 : 주식가격
https://programmers.co.kr/learn/courses/30/lessons/42584 코딩테스트 연습 - 주식가격 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00 programmers.co.kr 풀이 for문으로 해당 초 단위의 주식가격과 그 이후의 주식가격을 비교하면서 가격이 떨어지기 전까지의 시간을 센다. for문이 끝나면 answer 시간(cnt)을 넣어주고 초기화 시켜준다. 큐에서 해당 초단위를 poll 시켜주고 해당 초 단위 위치(j)를 증가시킨다. import java.util.*; class Solu..
[Java] 프로그래머스 Lv2 : 프린터
https://programmers.co.kr/learn/courses/30/lessons/42587?language=java 코딩테스트 연습 - 프린터 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린 programmers.co.kr 풀이 인쇄물의 우선순위와 위치를 저장한 Print 클래스를 만들어 큐에 넣어준다. 우선순위가 들어있는 배열 priorities을 정렬하고, 현재 큐에 들어있는 인쇄물의 우선순위와 가장 큰 우선순위(priorities[j])와 비교한다. 현재 인쇄대기 문서의 우선순위가 가장 크다면 인쇄한다. ( j 와 answer 증가) 이때, 대기문서의 위..
[Java] 프로그래머스 Lv.2 : 위장
https://programmers.co.kr/learn/courses/30/lessons/42578?language=java 코딩테스트 연습 - 위장 programmers.co.kr 풀이 경우의 수 계산법만 알면 간단히 풀 수 있다. 예를 들어, 상의 A개, 하의 B개가 주어진다면 서로 다른 옷의 조합의 수는 다음과 같이 계산할 수 있다. 상의든 하의든 1개만 선택해서 입는 경우 = A+B 상의1개 하의 1개 선택해서 입는 경우 = A*B 아무것도 입지 않는 수 = 1 최종 공식 = A+B+(A*B)+1 = (A+1)*(B+1) 하지만 우리는 아무것도 입지 않는 수는 빼줘야하기 때문에 최종적으로 -1을 해주도록 한다. HashMap에 key값으로는 의상의 종류, value로는 그 개수를 넣어줄 것인데,..
[Java] 프로그래머스 Lv.2 > 조이스틱
https://programmers.co.kr/learn/courses/30/lessons/42860# 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr 풀이 조이스틱의 이동횟수만 구하면되기 때문에, 상하와 좌우 이동을 따로 계산한다. 상하이동은 A-Z의 알파벳이 총 26개로 이루어져있기 때문에 중간알파벳인 N을 기준으로 이동횟수를 더해주면 되었다. N보다 작으면 A를 빼주고 N보다 크다면 Z에서 빼준뒤 1을 더해 계산한다. 좌우이동은 2가지를 고려해야한다. 계속 오른쪽으로 이동 : 이동횟수..
[Java] 프로그래머스 Lv2 > 삼각 달팽이
https://programmers.co.kr/learn/courses/30/lessons/68645?language=java 코딩테스트 연습 - 삼각 달팽이 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차원 배열에 넣는다고 생각하자. 배열에 차례대로 넣는 동작을 살펴보면 3가지로 나눌 수 있다. 세로(아래)로 이동 가로(오른쪽)로 이동 대각선(왼쪽위)으로 이동 실제로 배열에 적용하며 확인하면 다음과 같다. 세로(아래)로 이동 : a[0][0]=1 -> a[1][0]=2 -> a[2][0]=3 같이 첫번째 인덱스 +1 증가 ..
[Java] 프로그래머스 Lv.2 > 전화번호 목록
https://programmers.co.kr/learn/courses/30/lessons/42577?language=java 코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조 programmers.co.kr 풀이 해시문제인데 아직 해시를 잘 모르겠어서 일단.. 마음대로 풀었다^^.. 처음에는 for문을 2번 돌려서 비교했는데, 효율성 테스트에서 실패가 떴다. => 배열을 먼저 sort(정렬)해주고, for문을 한번만 돌리도록 수정했다. ( ["119", "1195524421", "97674223"]와 같이 사전순으로 정렬되니, 앞 뒤로만..
[Java] 프로그래머스 Lv.2 > 124 나라의 숫자
https://programmers.co.kr/learn/courses/30/lessons/12899?language=java 코딩테스트 연습 - 124 나라의 숫자 programmers.co.kr 풀이 3진법에서 1,2,3 대신 1,2,4를 사용한다고 생각하고 풀면 된다. 단, 주의할 점은 나머지가 0이 나올 때이다. 0 대신 4를 string에 추가해주고, 다음 몫으로 갈때 n에서 1을 빼고 계산해야한다. class Solution { public String solution(int n) { StringBuilder sb = new StringBuilder(); while(n!=0){ if(n%3==0) { sb.append(4); n = (n-1)/3; } else { sb.append(n%3); ..