SWEA/D3/1244. [S/W 문제해결 응용] 2일차 - 최대 상금/[S/W 문제해결 응용] 2일차 - 최대 상금.java
💡 Info
내용
퀴즈 대회에 참가해서 우승을 하게 되면 보너스 상금을 획득할 수 있는 기회를 부여받는다.
우승자는 주어진 숫자판들 중에 두 개를 선택해서 정해진 횟수만큼 서로의 자리를 위치를 교환할 수 있다.
예를 들어, 다음 그림과 3, 2, 8, 8, 8 의 5개의 숫자판들이 주어지고 교환 횟수는 2회라고 하자.
처음에는 첫 번째 숫자판의 3과 네 번째 숫자판의 8을 교환해서 8, 2, 8, 3, 8이 되었다.
다음으로, 두 번째 숫자판 2와 마지막에 있는 8을 교환해서 8, 8, 8, 3, 2이 되었다.
정해진 횟수만큼 교환이 끝나면 숫자판의 위치에 부여된 가중치에 의해 상금이 계산된다.
숫자판의 오른쪽 끝에서부터 1원이고 왼쪽으로 한 자리씩 갈수록 10의 배수만큼 커진다.
위의 예에서와 같이 최종적으로 숫자판들이 8, 8, 8, 3, 2의 순서가 되면 88832원의 보너스 상금을 획득한다.
여기서 주의할 것은 반드시 횟수만큼 교환이 이루어져야 하고 동일한 위치의 교환이 중복되어도 된다.
다음과 같은 경우, 1회의 교환 횟수가 주어졌을 때 반드시 1회 교환을 수행하므로 결과값은 49가 된다.
94의 경우, 2회 교환하게 되면 원래의 94가 된다.
정해진 횟수만큼 숫자판을 교환했을 때 받을 수 있는 가장 큰 금액을 계산해보자.
📥입력 조건
3
123 1
2737 1
32888 2
...
📤출력 조건
#1 321
#2 7732
#3 88832
...
실제 풀이 시간 : 60분
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
static int[] arr;
static int N;
static int result = 0;
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
// 1. 숫자판 정보 arr 및 교환 횟수 N 입력받기
arr = new int[6];
for(int i=0; i<6; i++) {
arr[i] = sc.nextInt();
}
N = sc.nextInt();
//2. 계산 : 배열 교환 계산하기
for(int i=0; i<N; i++) {
if(arr[i] < arr[i+1]) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
result = arr[i];
}
//3. 교환 결과값 출력하기
System.out.println("#" + test_case + " " + result);
}
}
}
max = Math.max(max, result);
실제 풀이 시간 : 1시간 30분(첫 풀이 시간 포함)
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
static int[] arr;
static int N;
static int max;
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
// 1. 숫자판 정보 arr 및 교환 횟수 N 입력받기
String num = sc.next();
arr = new int[num.length()];
for (int i = 0; i < num.length(); i++) {
arr[i] = num.charAt(i) - '0';
}
N = sc.nextInt();
max = 0;
if(arr.length < N) {
N = arr.length;
}
dfs(0,0);
//3. 교환 결과값 출력하기
System.out.println("#" + test_case + " " + max);
}
}
static void dfs(int start, int count){
if(count == N) {
int result = 0;
for(int s : arr) {
result = result*10 + s;
}
max = Math.max(max, result);
return;
}
//2. 계산 : 배열 교환 계산하기
for(int i = start; i < arr.length; i++) {
for(int j = i+1; j < arr.length; j++) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
dfs(i, count+1);
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}