728x90
https://arena.topcoder.com/#/u/practiceCode/13700/6947/7748/1/299645
문제 요약
-기타의 줄을 새로 사야하는데, 각 브랜드에서는 6개의 줄을 패키지로 구입하거나, 단품으로 1개의 줄을 구입할 수 있다.
-문자열 stringCosts는 한 브랜드의 "패키지가격 단품가격"으로 구성되어 있다.
-한 번에 여러 브랜드에서 구입할 수 있다.
-최소한 n개의 줄을 구입하는 데 필요한 최소 비용을 찾아야 한다.
예시로, n=4, stringCosts={"12 3", "15 4"}로 주어졌을 때, 첫번째 브랜드에서 1개의 패키지로 사거나(12), 첫번째 브랜드에서 단품으로 4개를 사는 것(4*3)이 최소 가격으로 구입할 수 있는 방법이다.
문제 파악하기
1. stringCosts 에서 패키지 가격, 단품 가격 분리하기
2. 모든 브랜드에서 가장 싼 패키지 가격과 단품 가격 찾기
3. 가장 싼 경우를 찾아 리턴
TestCase에 단품 1개 가격이 세트 6개의 가격보다 비싼 case도 있었어서 계속 통과 못했었다...
(Java)
public class BrokenStrings {
public int buyStrings(int n, String[] stringCosts) {
int[][] costs = new int[stringCosts.length][2];
//1. stringCosts에서 가격 분리하기
for (int i=0; i<stringCosts.length; i++) {
costs[i][0] = Integer.parseInt(stringCosts[i].split(" ")[0]);
costs[i][1] = Integer.parseInt(stringCosts[i].split(" ")[1]);
}
//2. 가격에서 패키지 미니멈, 단품 미니멈 가격 구하기
int min6=1000; int min1=1000;
for(int i=0; i<costs.length; i++) {
if (min6 > costs[i][0]) {min6 = costs[i][0];}
if (min1 > costs[i][1]) {min1 = costs[i][1];}
}
//가격 구하기 (패키지가 싼 곳+단품)
int sum = 0;
int number = n;
if (number>=6) {
sum = (number/6)*min6;
number -= (number/6)*6;
}
sum += number*min1;
//가격 구하기 (패키지로만)
int sum1 = 0;
if (n%6 != 0) {
sum1 = (n/6+1)*min6;
} else {
sum1 = n/6*min6;
}
//가격 구하기 (단품으로만)
int sum2 = n*min1;
int answer = Math.min(sum, Math.min(sum1, sum2));
return answer;
}
}
(c#)
using System;
public class BrokenStrings
{
public int BuyStrings(int n, string[] stringCosts)
{
int[,] costs = new int[stringCosts.Length, 2];
for (int i = 0; i < stringCosts.Length; i++)
{
string[] costValues = stringCosts[i].Split(' ');
costs[i, 0] = int.Parse(costValues[0]);
costs[i, 1] = int.Parse(costValues[1]);
}
int min6 = 1000, min1 = 1000;
for (int i = 0; i < costs.GetLength(0); i++)
{
if (min6 > costs[i, 0]) min6 = costs[i, 0];
if (min1 > costs[i, 1]) min1 = costs[i, 1];
}
int sum = 0;
int number = n;
if (number >= 6)
{
sum = (number / 6) * min6;
number -= (number / 6) * 6;
}
sum += number * min1;
int sum1 = 0;
if (n % 6 != 0)
{
sum1 = ((n / 6) + 1) * min6;
}
else
{
sum1 = (n / 6) * min6;
}
int sum2 = n * min1;
int answer = Math.Min(sum, Math.Min(sum1, sum2));
return answer;
}
}
728x90
'Algorithm Study > TopCoder' 카테고리의 다른 글
[TopCoder] AdditionGame (Java) (0) | 2023.08.14 |
---|---|
[TopCoder] 회문 (Java, C#) (0) | 2023.08.13 |
[TopCoder] InterestingDigits (Java, C#) (0) | 2023.08.12 |
[TopCoder] Cryptography (C#, Java) (0) | 2023.08.12 |
[TopCoder] InterestingParty (C#, Java) (0) | 2023.08.11 |