알고리즘 공부
[백준 13422번] 도둑 - java
철매존
2024. 10. 12. 00:29
728x90
문제 설명
1. 맨 윗줄은 테스트 케이스 갯수
2. 2줄씩 받고 -> 처음은 [집갯수, 훔칠 집 수, 훔칠 금액 최대값+1] / 두번째는 [집들의 가진 돈] 이 주어진다.
3. 도둑이 훔치려고 할 때에 인접한 집을 찾아가면서 훔치고 일정 금액 이상 훔치거나 일정 집 수 이상 훔치면 잡혀감
4. 그 안에서 훔칠 경우의 수를 구하면 된다.
풀이 과정
1. 간단한 슬라이딩 윈도우 문제이다.
2. 집을 하나씩 찾으면서 보면 된다.
3. 그리고 보면 그냥 배열이랑 좀 다른거는 처음 맨 뒤쪽 집들은 최초 털어간 집에 대한 확인도 된다는거
4. 내가 풀어낸 방식은 그래서 [123][234][345][451][512] 이렇게이다.
5. 근데 여기서 중요한건 M == N 이면, 4번 방식에서 [123][231][312] 가 된다. 그래서 미리 확인해야 한다.
코드
ㄱㅂㄷㄱㅂㄷㄱ
import java.util.*;
public class Main
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 테케 수
int T = Integer.parseInt(sc.nextLine());
while(T-->0) {
int ans = 0;
String input = sc.nextLine();
int[] intArray = Arrays.stream(input.split(" "))
.mapToInt(Integer::parseInt)
.toArray();
int houseCnt = intArray[0];
int moneyCnt = intArray[1];
int moneyMax = intArray[2] - 1;
input = sc.nextLine();
int[] houseArr = Arrays.stream(input.split(" "))
.mapToInt(Integer::parseInt)
.toArray();
long money = 0;
// 털 집 수랑 전체 집 수가 같으면
if (houseCnt == moneyCnt) {
// 전체 집 금액 구해서
for (int i = 0; i < houseCnt; i++) {
money += houseArr[i];
}
// 내가 털어도 된다 싶으면 그게 다임
if (money <= moneyMax) {
System.out.println(1);
continue; // 그러면 뒤에는 안하면 된다.
}
}
// 처음 집부터 시작해서 맨 뒤 집쪽에서 다시 처음으로 돌아오기 위해 설정
for(int i=0; i<houseCnt + moneyCnt - 1; i++) {
// 집 털 숫자 되면 이전집 제거
if(i >= moneyCnt) {
money -= houseArr[i - moneyCnt];
}
// 다음집 털 금액 확인 -> %해서 배열 넘어가면 처음으로 돌아간다.
money += houseArr[i % houseCnt];
// 그래서 요만큼 털때 돈 이정도면 된다 하면 털어도 됨.
if (i >= moneyCnt - 1 && money <= moneyMax) {
ans++;
}
}
System.out.println(ans);
}
}
}