일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- PS
- 20006
- java
- Algorithm
- sovled.ac
- sloved.ac
- 백준
- Django
- 23971
- 장고
- 파이썬
- 15965
- 라이브러리
- 24511
- 알고리즘
- 1342
- 11688
- 사용자정의필터
- solved.ac
- 6730
- 2866
- programmers
- 25379
- pccp
- 17087
- 자바
- PYTHON
- SWEA
- 프로그래머스
- 9081
Archives
- Today
- Total
코깽이의 코딩일기
SWEA 2115. [모의 SW 역량테스트] 벌꿀채취 본문
반응형
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
내가 제출한 코드
import java.util.*;
import java.io.*;
public class Solution {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int n, m, c, answer;
static boolean[] v;
static int[] personA = new int[2];
static int[] dataA = new int[2];
static int[] personB = new int[2];
static int[] dataB = new int[2];
static int[][] map;
public static void main(String[] args) throws Exception {
int t = Integer.parseInt(br.readLine());
for (int i = 1; i <= t; i++) {
init();
run();
sb.append("#").append(i).append(" ").append(answer).append("\n");
}
System.out.print(sb);
}
private static void init() throws Exception {
answer = 0;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
v = new boolean[m];
c = Integer.parseInt(st.nextToken());
map = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
}
private static void run() {
// 1번 사람 좌표 뽑기
findA();
}
private static void findA() {
for (int i = 0; i < n; i++) {
for (int j = 0; j <= n - m; j++) {
personA[0] = i;
personA[1] = j;
dataA = new int[2];
v = new boolean[n];
// 최대값 구하기
recur(personA, dataA, 0, 0);
// 2번 사람 좌표 뽑기
findB();
}
}
}
private static void findB() {
for (int i = personA[0]; i < n; i++) {
// 같은 행에서 뽑는 경우
if (i == personA[0]) {
for (int j = personA[1] + m; j <= n - m; j++) {
personB[0] = personA[0];
personB[1] = j;
}
}
// 다른 행에서 뽑는 경우
else {
for (int j = 0; j <= n - m; j++) {
personB[0] = i;
personB[1] = j;
}
}
// 사용되는 데이터들 초기화
dataB = new int[2];
v = new boolean[n];
// 최대값 구하기
recur(personB, dataB, 0, 0);
// 값 갱신하기.
if (answer < dataA[0] + dataB[0]) {
answer = dataA[0] + dataB[0];
}
}
}
private static void recur(int[] person, int[] data, int cost, int nowC) {
// 최대로 수학 가능한 범위 = c
if (nowC > c) {
return;
}
// 값 갱신하기
if (cost > data[0]) {
data[0] = cost;
data[1] = nowC;
}
// 재귀
for (int i = person[1]; i < person[1] + m; i++) {
if (!v[i]) {
v[i] = true;
int nowValue = map[person[0]][i];
recur(person, data, cost + (int) Math.pow(nowValue, 2), nowC + nowValue);
v[i] = false;
}
}
}
}
생각해낸 로직
1. 첫번째 사람의 좌표 세팅
2. 두번째 사람의 좌표 세팅 ( 같은 행에서 뽑는 경우의 좌표값을 유의한다. )
3. 사람마다 세팅된 좌표값 내에서 가능한 최대값을 확인한다. ( C의 값을 넘지 않으면서 최대값 )
4. 두 사람의 최대값의 합의 최대값이 Answer이다.
반응형
'PS > SWEA' 카테고리의 다른 글
SWEA 5658. [모의 SW 역량테스트] 보물상자 비밀번호 (0) | 2024.05.02 |
---|---|
SWEA 2117. [모의 SW 역량테스트] 홈 방범 서비스 (0) | 2024.04.30 |
SWEA 11688. Calkin-Wilf tree 1 (0) | 2023.11.10 |
SWEA 6730. 장애물 경주 난이도 (0) | 2023.11.10 |
SWEA 2050. 알파벳을 숫자로 변환 (0) | 2023.11.02 |