본문 바로가기
Algorithm Study/TopCoder

[TopCoder] BrokenStrings (C#, Java)

by HanaV 2023. 10. 10.
728x90

https://arena.topcoder.com/#/u/practiceCode/13700/6947/7748/1/299645

 

Topcoder Arena

Topcoder Arena Web

arena.topcoder.com

문제 요약

-기타의 줄을 새로 사야하는데, 각 브랜드에서는 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

"); wcs_do();