728x90

알고리즘 166

[Programmers] 완전범죄 JAVA

[Programmers] 완전범죄 - LV 2접근dfs (백트래킹)풀이A와 B도둑이 팀을 이루어 모든 물건을 훔칠 때 A 도둑이 남기는 흔적의 최소 개수를 구하는 문제이다. 2025 코드챌린지 2차 예선 문제로 2 레벨의 문제였는데 많이 어렵게 느껴졌던 2 레벨이었다. dfs를 쓰면 될 거 같은 문제였는데 방문체크가 생각처럼 잘 되지 않아 시간초과가 계속 발생했다. 물건을 A도둑이 훔칠지 B도둑이 훔칠지에 따라 분기가 나눠지는데 배열을 통해 방문체크를 하니 뭔가 잘 맞아떨어지지 않았다. private static int minATrail = Integer.MAX_VALUE; public static int solution(int[][] info, int n, int m) { Se..

[백준] 요세푸스 한 번 더! JAVA

[백준] 요세푸스 한 번 더! - GOLD II 6523번접근map풀이오랜만의 백준 문제인데 팀원이 재밌다고 공유해 준 문제이다. N명의 사람이 원탁에 앉아 수식을 통해 다음 술 마실 사람을 정하고 똑같은 사람이 3번 걸렸을 때 술자리가 종료되는데 그때 술을 마시지 않았던 사람의 수를 구하는 문제이다.  문제 내용만 보면 정말 쉬워 보이는데 재밌을 거라는 뜻이 처음엔 뭔지 몰랐으나 알게 되었다. 로직은 정말 간단하게 map을 사용해 술 마신 사람과 횟수를 저장하고 3번이 되면 술 마신 사람들 수를 전체 인원에서 빼면 구할 수 있을 거 같았다. 다만 사람의 수가 최대 10의 9 제곱으로 10억 명까지 존재가 가능하기 때문에 다음 술 마실 사람의 번호를 구하는 ax^2+b mod N 이 수식에서 오버플로우가..

[Programmers] 서버 증설 횟수 JAVA

[Programmers] 서버 증설 횟수 - LV 2 접근큐풀이2025 코드챌린지 2차 예선 문제로 게임 서버가 증설되는 횟수를 구하는 문제이다. 게임을 이용하는 사람이 m 명 늘어날 때마다 서버가 증설되고 k 시간 동안 유지된다. 각 시간대마다 게임을 이용하는 사람의 수가 주어지고 총 서버 증설 횟수를 구하는 문제인데 m 명 이상의 사람이 접속하는 경우 서버가 증설되어 m 명 미만의 경우 서버가 증설되지 않는 부분을 잘 체크하면 된다.  public int solution(int[] players, int m, int k) { int count = 0; Queue active = new LinkedList(); for (int i = 0; i 큐를 사용해 현재..

[Programmers] 택배 상자 꺼내기 JAVA

[Programmers] 택배 상자 꺼내기 - LV 1 접근계산?풀이코드챌린지 2차 예선 문제로 택배 상자를 요구하는 순서로 쌓아 위에서부터 상자를 뺄 때 총 몇 개의 상자를 빼야 하는지 구하는 문제이다. 상자는 지그재그로 쌓기 때문에 꺼내야 하는 상자의 꼭대기엔 몇 개의 상자가 존재하는지 알 수 없다. 단순하게 일일이 상자를 다 쌓아보고 풀어도 될 거 같지만 단순하게 위의 상자만 빼기 때문에 계산을 통해 구해질 거 같아 해 봤다. public int solution(int n, int w, int num) { int totalLevel = n / w; if (n % w > 0) totalLevel++; int targetLevel = num / w; ..

[Programmers] 지게차와 크레인 JAVA

[Programmers] 지게차와 크레인 - LV 2접근dfs풀이코드챌린지 1차 예선의 3번째 문제 지게차와 크레인 문제이다. 컨테이너가 배열로 주어지고 지게차와 크레인을 사용해 컨테이너를 꺼내고 난 뒤 남아있는 컨테이너의 개수를 반환하는 문제이다. 간단한데 헷갈리는 부분이 있어 헤맸던 문제이다. 크레인은 단순히 요청하는 컨테이너를 모두 제거하면 되기 때문에 간단한 작업이다. 문제는 지게차를 이용한 작업으로 지게차로 컨테이너를 제거하기 위해서는 컨테이너의 4면 중 한 면이 외부와 연결되어 있어야 한다. 단순히 컨테이너의 4면 중 한 면이 공백과 닿아있는 것이 아니라 그 공백이 외부와 닿아있어야 한다는 것이 중점이다.  또 다른 주의 사항인 지게차 작업에만 해당되는 내용으로 작업이 수행되는 request의..

[Programmers] 비밀 코드 해독 JAVA

[Programmers] 비밀 코드 해독 - LV 2접근dfs풀이2025 프로그래머스 코드챌린지 1차 예선의 2번째 비밀 코드 해독 문제이다. 비밀 코드 자체를 맞춰야 하는 것은 아니고 비밀 코드가 될 수 있는 모든 코드의 개수를 구하는 문제이다. 입력한 비밀 코드는 5개로 이루어져 있고 오름차순 정렬된 상태로 주어진다. 입력한 비밀 코드와 정답인 비밀 코드와 일치하는 코드의 개수가 배열로 같이 주어지기 때문에 두 가지를 보고 가능한 모든 비밀 코드의 개수를 찾아내야 한다.  다른 방법이 딱히 떠오르지 않거나 딱 봐도 매우 복잡해 보인다면 보통 무식하게 풀어질 수 있을지 체크한다. 모든 조합을 구한 뒤 입력한 정수와 비교하여 시스템 응답이 일치하는지 체크해 보는 방법이다. 등장하는 숫자는 최대 30까지로..

[Programmers] 유연근무제 JAVA

[Programmers] 유연근무제 - LV 1접근구현풀이2025 프로그래머스 코드챌린지 문제가 업데이트되어 하나씩 풀어 볼 예정이다. 이번 문제는 1차 예선의 가장 쉬운 문제인 유연근무제이다. 주어지는 출근 시간을 기준으로 +10분까지 정시 출근으로 인정이 되고 일주일 동안 평일을 모두 정시 출근에 성공하는 경우 선물을 받게 된다. 선물을 받게 되는 직원의 수를 구해야 하는 문제로 간단한 문제이다.  public int solution(int[] schedules, int[][] timelogs, int startday) { int answer = 0; for (int i = 0; i schedule) { break; ..

[NeetCode-LeetCode] Design Twitter JAVA

[NeetCode-LeetCode] Design Twitter - Medium접근구현풀이트위터의 기능을 디자인하는 문제로 포스팅, 피드 보기, 팔로우, 언팔로우를 구현해야 하는 문제이다. 기존 sns와 동일하게 유저는 포스트를 작성할 수 있고, 자기 자신의 포스트와 팔로우하는 유저의 포스트를 볼 수 있으며 다른 유저를 팔로우, 언팔로우할 수 있다. 주의할 부분은 포스트를 얻는 부분으로 포스트는 최신 10개의 포스트를 가져와야 한다. 최신 10개의 포스트라는 것은 해당 유저가 팔로우하는 유저에 따라 변경되는 부분으로 특정 유저를 팔로우하기 시작했다면 다시 최신 10개의 포스트를 구성해야 하고 언팔로우하였다면 언팔로우한 유저의 포스트를 뺀 최신 10개를 다시 구성해야 한다. 즉 포스트 요청 시 동적으로 구성..

[NeetCode-LeetCode] Max Area of Island JAVA

[NeetCode-LeetCode] Max Area of Island - Medium접근dfs풀이2차원 배열이 주어지고 1로 이루어진 구간의 최대 넓이를 구하는 문제이다. 비슷한 유형이 많은 문제이기 때문에 dfs를 통해 간단하게 해결해 주면 된다.  private static final int[] dx = {0, 0, 1, -1}; private static final int[] dy = {1, -1, 0, 0}; public int maxAreaOfIsland(int[][] grid) { int answer = 0; for (int i = 0; i grid의 값이 1인 경우에 dfs를 실행하여 넓이를 구하게 된다.  private int dfs(int[]..

[NeetCode-LeetCode] Koko Eating Bananas Java

[NeetCode-LeetCode] Koko Eating Bananas - Medium접근이진 탐색 풀이바나나 개수가 담긴 배열이 주어지고 시간이 주어질 때 모든 바나나를 다 먹는데 걸리는 최소 시간당 바나나 개수를 구해야 한다. 코코는 한 시간의 k개만큼 바나나를 먹을 수 있는데 모든 바나나를 제한 시간 안에 먹어야 할 때 시간당 먹어야 하는 바나나의 개수인 k의 최솟값을 구하는 문제이다.  바나나 더미의 최대 개수가 매우 큰 값이기 때문에 이진 탐색을 통해 구해주었다. public int minEatingSpeed(int[] piles, int h) { int left = 1; int right = 1000000000; while (left 더미의 최소 개수..

728x90