일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- hash
- 프로그래머스 java
- toUpperCase
- Stack
- 백준 2473번 세 용액 - java
- 18111번 마인크래프트 - java 구현
- 백준 1043번 거짓말 - java 분리 집합
- Java
- mysql hy000 에러
- StringBuilder
- StringTokenizer
- 백준 14938번 서강그라운드
- HashMap
- 백준 1806번 부분합 java
- 코틀린기초
- 백준 1541
- 프로그래머스 자바
- 최소 힙 1927
- 백준 1197번 최소 스패닝 트리 - java
- 백준 1647번 도시 분할 계획 - java
- replace()
- kotlin
- append
- map
- dp
- ac 5430번
- 프로그래머스
- HashSet
- 백준 2467번 용액 자바 - 이분탐색
- 백준 3190번
- Today
- Total
말하는 컴공감자의 텃밭
백준 18429번 근손실 <S3> - 브루트 포스 본문
요즘은 문제 지문이 긴걸 위주로 풀려고하게 된다.
아무래도 코테 문제는 지문이 길지 않을까..? 하는 혼자 생각때문에 호호
먼저 근손실은 마음이 아프다,, 운동 못한지가 오래되서인지 문제 제목보고 홀린듯 풀게 되었다.
지문을 읽게되면 3대 500에서 (ㄷㄷ) 매일 매일 K만큼 중량이 줄게된다. 다만 키트가 있어서 키트를 꽂으면 중량이 즉시 증가하는데 이 대학원생은 욕심쟁이라 늘 500이상을 유지하고 싶어한다. 어떤 시점에서 봐도 500보다 작지 않도록 키트 순서를 정해주면 된다. 이 순서 경우의 수를 출력하면 되는 문제다.
막상 지문만 길지 짧게 표현할 수 있는 문제였다. 500에서 K * N 만큼 감소하되 키트를 사용하여 500 언더로 안떨어지게 하면 되는 문제다..
모든 경우의 수를 출력하면 되기에 모든 경우의 수를 따져주었다.
재귀함수를 사용했고, 재귀 반복간에 변동되는 값이 없도록 신경써주면 브루트 포스 알고리즘 끝이다.
*브루트 포스 : 무식하게 모든 경우의 수를 따지는 방법 과거는 시간과 자원이 많이 들었다면 요즘은 컴퓨터라.. ㅎㅎ
과거 세계지도의 모든 나라를 4가지 색으로 표현이 가능하다인 '4색 정리' 같은 경우도 증명에 이 알고리즘이 사용되었던걸로 기억한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import java.util.*; public class Main { static int answer = 0; static int N; static int K; static int[] kit; static boolean[] used; public static void steroid(int sum, int day) { if (day == N) { answer++; return; } for (int i = 0; i < N; i++) { if (!used[i] && (sum + kit[i] - K) >= 0) { used[i] = true; steroid(sum + kit[i] - K, day + 1); used[i] = false; // 다시 원래대로 바꿔주기. 필수* } } } public static void main(String[] args) throws Exception { // Input Scanner sc = new Scanner(System.in); N = sc.nextInt(); // 1 <= N <= 8 K = sc.nextInt(); // 1 <= K <= 50 kit = new int[N]; used = new boolean[N]; for (int i = 0; i < N; i++) { kit[i] = sc.nextInt(); } // Main logic steroid(0, 0); // Output System.out.println(answer); } } | cs |
if (!used[i] && (sum + kit[i] - K) >= 0) 조건으로 감소량 K 랑 키트 증가량kit[i]랑 비교하여 판단한다.
만약 만족하지 못하면 종료.
만족하는경우
used 배열에서 true 로 바꾸고, 다시 다음 값을 넣어 함수를 실행한다. 그런 후 꼭 used 배열을 false로 해줘여 한다.
반복한 횟수가 N이되면 -> 즉 8일차까지 모두 500이상이라면 answe++ 한다.
'알고리즘 > Backjoon - Java' 카테고리의 다른 글
백준 2108번 통계학 <S3> - 수학 (0) | 2023.11.03 |
---|---|
백준 20920번 영단어 암기는 괴로워 <S3> - HashMap (0) | 2023.11.02 |
백준 26069번 붙임성 좋은 총총이 <S4> - Hash set (1) | 2023.10.27 |
백준 25192번 인사성 밝은 곰곰이 <S4> - Hash (0) | 2023.10.26 |
백준 1010번 다리놓기 <S5> - DP, 조합 (1) | 2023.10.26 |