STUDY
-
프로그래머스 LV2 - 다리를 지나는 트럭STUDY/ALGORITHM 2025. 2. 28. 22:09
요즘 프로그래머스에 있는 알고리즘 고득점 Kit 문제들을 풀고 있다.사용하는 자료구조별로 정리되어있기 때문에, 어떤 식으로 접근해야 하는지 조금이나마 힌트가 되는게 아쉽지만,사실 해당 자료구조보다 더 좋은 방법을 발견하기도 하기 때문에 큰상관은 없는듯 하다.이 문제는 스택/큐 로 분류 되는 문제이다. 문제의 카테고리가 "스택/큐"이다보니, 일단은 큐로 시도한다.큐를 사용하는것 까진 뻔하나, 이 문제의 관건은 "시간" 이다.시간이 흐르는 것을 어떠한 방식으로 구현할것이냐 의 문제다.그래서 큐를 허수로 가득 채우고, 하나를 꺼낼때마다 시간 +1 하는것으로 구현하기로 한다.하나 poll 한 후, 트럭 또는 허수를 다시 채워넣는것이다.import java.util.*;class Solution { pub..
-
프로그래머스 LV3 - 베스트앨범STUDY/ALGORITHM 2025. 2. 24. 12:59
이 문제는 3단계치곤 좀 쉬운 축인듯.장르 별 횟수 합산과, 장르 별 1,2순위의 play의 값들을 저장할 Map을 정의한다.장르 별 play들의 순위를 유지하기 위해 우선순위 큐를 활용했으며,poll로 탈락시키기 위해 우선순위 조건은 반대로 설정했다.그로 인해 genreCountMap의 반복 순서와 poll하여 나열하는 순서를 모두 반대로 진행하였고,마지막에 역순으로 정렬하여 answer를 반환한다. 모든걸 역순으로 진행하는 과정에서 실수가 발생하는걸 막기위해웬만하면 ArrayDeque등을 사용하고 싶었으나 우선순위를 지원하지않기 때문에또 다른 구현체를 만들거나 익명클래스를 사용해야 했는데..그럴 바엔 그냥 꼼꼼하게 잘 확인하면서 그냥 풀기로 했다.. import java.util.*;class S..
-
프로그래머스 LV1 - 기사단원의 무기STUDY/ALGORITHM 2025. 2. 24. 09:49
해당 문제도 아무것도 모르던 시절 시도해봤던 문제다.이 문제의 핵심은 약수들을 찾을때 반복 범위를 최소화 할것. 하나의 숫자 x 의 약수들은 반드시 짝을 이루며 인수1 로 숫자를 나누면 인수2를 찾을 수 있다.이를 통해 탐색범위를 절반으로 한번 줄일 수 있고,5*5 = 25 와 같이 인수1,2 가 제곱근으로 같은 경우가 있다면그 이후론 이미 구한 값들만 반복될 것이기 때문에 탐색할 이유가 없다.그래서 탐색범위를 숫자 x의 제곱근 까지로 한번 더 줄일 수 있다. 숫자 x의 제곱근 까지 탐색하며 약수를 찾고, 인수1과 인수2를 한번에 찾는다.그리고 중복을 허용하지 않는 Set을 이용해 인수1과 2가 같은경우 ( 제곱근 ) 을 쉽게 관리한다.또한 Set.size()가 limit 보다 커진경우 더 이상 계산은 ..
-
프로그래머스 LV2 - 전화번호 목록STUDY/ALGORITHM 2025. 2. 24. 09:18
해당 문제는 프로그래머스 코딩테스트 고득점Kit에 포함된 문제이다.해시 항목으로 추가되어 있으나, 훨씬 간단한 해결방법이 존재한다.그래서 그런지 레벨도 좀 과분하게 책정된 듯 하다.하나의 전화번호가 다른 전화번호의 접두어로 존재하는 경우가 하나라도 있는지를 판별해야한다.사실 다른 어떤 설명을 붙히려고해도 그저 "사전 정렬을 이용하면 된다" 라고밖에 설명이 안되는것 같다..만약 하나의 전화번호가 다른 전화번호의 접두어라면, 바로 다음 인덱스에 해당 전화번호가 올수 밖에 없다. 그래서 1번 인덱스부터 바로 i -1 와 비교하면 된다.import java.util.*;class Solution { public boolean solution(String[] phone_book) { Array..
-
프로그래머스 LV1 - 택배 상자 꺼내기STUDY/ALGORITHM 2025. 2. 17. 22:22
내가 느끼기에, 프로그래머스의 문제들의 난이도가 같은 단계 내에서도 너무 상이하다.0문제같은 1단계도 있는 반면에 2단계같은 1단계도 있다.이 문제는 나름 1단계가 맞는거같긴 하다만, 깨나 애먹었다. 처음엔 이런식으로 접근했다. public void solution(){ int n = 13; int w = 3; int num = 6; width = w; boolean currentDirection = true; int answer = 1; int offset = getOffset(num); while (true){ num += w; if(currentDirect..
-
프로그래머스 LV1 - 달리기 경주STUDY/ALGORITHM 2025. 2. 12. 23:29
정말 아무것도 모르던 시절. 이미 한번 도전했던 문제다.players의 범위도 5callings의 범위도 2이럴 땐 그래도 조금이나마 늘긴 늘었단 생각이 든다. 작성시간까지 해서 10분 정도 걸렸다.참 아직도 갈 길이 멀다만 그때의 나는 뭐였을까.. 아무튼 문제로 돌아가서, 이 문제의 관건은 callings의 값으로 어떻게 플레이어를 빠르게 찾느냐 다.그래서 배열과 해시로 동시에 관리하기로 한다.순위가 바뀔때, 배열과 해시를 동시에 갱신해주면, 선수 이름으로 현재 순위를 바로 가져올 수 있고,그 순위로 배열에 다시 접근 하면 된다. import java.util.*;class Solution { private Map currentRankMap; public String[] solution(St..
-
프로그래머스 LV1 - 공원 산책STUDY/ALGORITHM 2025. 2. 12. 22:50
이 문제는 커다란 함정이 숨어있다.그것은 그리드에서 (0,0)의 좌표가 왼쪽 위고, (h-1,w-1) 이 왼쪽 아래라는 것.그냥 위아래 뒤집어서 생각하고, South 또는 North로 이동할때 Y 값을 반대로 적용해주면 특별히 신경쓸 일이 없다.좌표평면 위를 이동하는 문제에서 0,0의 위치도 당연시 하면 안된다는 경각심을 주는 문제인것도 같다.사실 그걸 제외하면 어려운 문제는 확실히 아니었다. 다 풀고나서 아차 싶었던 점이 있다.나는 무의식적으로 재귀함수로 풀었는데, 만약 이동거리의 범위가 "1그리고 park의 크기가 엄청나게 컸다면 재귀함수 깊이문제가 발생했을 수도 있다. 제한사항을 보고 다시보자.... import java.util.*;class Solution { private int w,h;..
-
프로그래머스 LV1 - 대충 만든 자판STUDY/ALGORITHM 2025. 2. 11. 22:31
이번엔 그냥 아무 문제나 잡아서 풀어봤다.사실 여지껏 내 수준보다 어려운 문제 위주로 풀어왔다.어찌어찌 방법을 찾고 답을 구하긴 했지만, 기준된 시간을 한참 넘어서는 경우도 있었다.그래서 온탕 냉탕을 오가듯 낮고 높은 난도를 골고루 풀어야겠다고 느낀다.그러다보면 점점 늘겠지... 솔직히 1단계라곤 해도, 문제를 보는 순간 답이 나오고 5분안에 작성까지 끝난 것이,썩 기분이가 좋다. import java.util.*;class Solution { private Map keyMinMap = new HashMap(); private int keyMax = 100; public int[] solution(String[] keymap, String[] targets) { for (St..