문제 설명

1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 
세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.

세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

제한 사항

a, b, c는 1이상 6이하의 정수입니다.

입출력 예

a b c result
2 6 1 9
5 3 3 473
4 4 4 110592

입출력 예 설명

입출력 예 #1

예제 1번에서 세 주사위 숫자가 모두 다르므로 2 + 6 + 1 = 9점을 얻습니다. 따라서 9를 return 합니다.

 

입출력 예 #2

예제 2번에서 두 주사위 숫자만 같으므로 (5 + 3 + 3) × (52 + 32 + 32 ) = 11 × 43 = 473점을 얻습니다. 
따라서 473을 return 합니다.

 

입출력 예 #3

예제 3번에서 세 주사위 숫자가 모두 같으므로 
(4 + 4 + 4) × (42 + 42 + 42 ) × (43 + 43 + 43 ) = 12 × 48 × 192 = 110,592점을 얻습니다. 
따라서 110592를 return 합니다.

나의 풀이

using System;

public class Solution 
{
    public int solution(int a, int b, int c) 
    {
        int answer = 0;
            if (a == b || b == c || a == c)
            {
                double squared = MathF.Pow(a, 2) + Math.Pow(b, 2) + Math.Pow(c, 2);
                answer = (a + b + c) * Convert.ToInt16(squared);
                if (a == b && b == c)
                {
                    double cubed = MathF.Pow(a, 3) + Math.Pow(b, 3) + Math.Pow(c, 3);;
                    answer *= Convert.ToInt16(cubed);
                }
            }
            else
            {
                answer = a + b + c;
            }
            return answer;
    }
}

 

Math.Pow 메서드 사용

 

'같은' 조건과 '다른' 조건 분리

 

'일부가 같은' 조건 안에 이중 중첩문으로 '모두가 같은' 조건

'C# 문법' 카테고리의 다른 글

StringBuilder  (0) 2025.04.16
델리게이트, 람다 및 LINQ  (0) 2025.04.08
예외처리(Try-catch), 값형과 참조형  (0) 2025.04.07
인터페이스와 열거형  (0) 2025.04.05
out, ref 키워드  (0) 2025.04.03

StringBuilder

문자열을 동적으로 조작할 수 있도록 제공되는 클래스입니다.
string과 달리 불변하지 않고(mutable), 문자열을 수정할 때 새로운 객체를 만들지 않고 내부 버퍼를 사용하므로
문자열을 반복적으로 추가, 삭제, 수정할 때 더 높은 성능을 제공합니다.

 

주요 메서드

메서드 설명
Append(string) 문자열을 끝에 추가
Insert(index, string) 특정 위치에 문자열 삽입
Replace(old, new) 문자열 교체
Remove(startIndex, length) 문자열 일부 삭제
Clear() 내용 초기화

 

사용 예제

StringBuilder sb = new StringBuilder();

// 문자열 추가
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");

// 문자열 삽입
sb.Insert(5, ", ");

// 문자열 치환
sb.Replace("World", "C#");

// 문자열 삭제
sb.Remove(5, 2);

// 완성된 문자열 출력
string result = sb.ToString();
Console.WriteLine(result);

 

'C# 문법' 카테고리의 다른 글

[프로그래머스] [C#] 주사위 게임 2  (0) 2025.04.17
델리게이트, 람다 및 LINQ  (0) 2025.04.08
예외처리(Try-catch), 값형과 참조형  (0) 2025.04.07
인터페이스와 열거형  (0) 2025.04.05
out, ref 키워드  (0) 2025.04.03
private void DestroyAllEnemies()
    {
        ObjectManager.PoolType[] enemyTypes =
        {
            ObjectManager.PoolType.EnemyMini1, ObjectManager.PoolType.EnemyElite1, ObjectManager.PoolType.EnemyElite2
        }; // 적 종류
        
        foreach (var type in enemyTypes)
        { 
            GameObject[] enemies = ObjectManager.Instance.GetObjects(type); // 해당 타입에 해당되는 enemy 모두 가져옴

            foreach (var enemy in enemies) // 배열로 가져온 enemy 각 개체에 접근 
            {
                if (enemy.activeSelf)
                {
                    enemy.GetComponent<EnemyHealth>()?.TakeDamaged(int.MaxValue);
                }
            }
        }

 

아이템 사용(필살기) 시 GetActiveObjects 메서드를 통해 적 type을 가져오고

 

무조건 적이 제거될 수 있도록 int.MaxValue를 사용했다.

 

근데, 아이템을 사용해도 적이 제거되지 않는 문제가 발생

 

기존 오브젝트 풀링 매니저는 비활성화된 오브젝트만 저장하고 있어 제거가 되지 않았다.

 

 딕셔너리에 List<GameObject> ActiveObject를 추가하여 활성화된 오브젝트를 가져오는 방식으로 해결하였다.

public class ObjectManager : MonoBehaviour
{
    public static ObjectManager Instance { get; private set; }

    ... 생략

    private Dictionary<PoolType, Queue<GameObject>> PoolDictionary = new Dictionary<PoolType, Queue<GameObject>>();
    private Dictionary<PoolType, List<GameObject>> ActiveObjects = new Dictionary<PoolType, List<GameObject>>(); //  추가

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }

        foreach (var pool in PoolList)
        {
            Queue<GameObject> queue = new Queue<GameObject>();
            List<GameObject> activeList = new List<GameObject>(); //  추가

            for (int i = 0; i < pool.size; i++)
            {
                GameObject obj = Instantiate(pool.prefab);
                obj.SetActive(false);
                queue.Enqueue(obj);
            }

            PoolDictionary.Add(pool.key, queue);
            ActiveObjects.Add(pool.key, activeList); //  추가
        }
    }

    public GameObject GetObject(PoolType key)
    {
        if (PoolDictionary.ContainsKey(key) && PoolDictionary[key].Count > 0)
        {
            GameObject obj = PoolDictionary[key].Dequeue();
            obj.SetActive(true);
            ActiveObjects[key].Add(obj); //  추가
            return obj;
        }

        return null;
    }

    public void ReturnObject(PoolType key, GameObject obj)
    {
        if (!PoolDictionary.ContainsKey(key)) return;

        obj.SetActive(false);
        PoolDictionary[key].Enqueue(obj);
        ActiveObjects[key].Remove(obj); //  추가
    }


    public GameObject[] GetObjects(PoolType key)
    {
        return PoolDictionary[key].ToArray();
    }

    // ✅ 활성화된 오브젝트만 가져오는 함수
    public GameObject[] GetActiveObjects(PoolType key)
    {
        return ActiveObjects[key].ToArray();
    }
}

 

문제 설명

두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 
첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때
이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 
return 하는 solution 함수를 작성해 주세요.

 

제한사항

1 ≤ a ≤ 100
1 ≤ d ≤ 100
1 ≤ included의 길이 ≤ 100
included에는 true가 적어도 하나 존재합니다.

 

입출력 예

a d included result
3 4 [true, false, false, true, true] 37
7 1 [false, false, false, true, false, false, false] 10

입출력 예 설명

입출력 예 #1

예제 1번은 a와 d가 각각 3, 4이고 included의 길이가 5입니다. 이를 표로 나타내면 다음과 같습니다.

 

 

  1항 2항 3항 4항 5항
등차수열 3 7 11 15 19
included true false false true true
따라서 true에 해당하는 1항, 4항, 5항을 더한 3 + 15 + 19 = 37을 return 합니다.

 

나의 풀이

using System;

public class Solution 
{
    public int solution(int a, int d, bool[] included) 
    {
        int answer = 0;
        for(int i = 0; i < included.Length; i++)
        {
            if(included[i] == true)
            {
                answer += a + i*d;
            }
        }
        return answer;
    }
}

 

등차수열은 연속하는 두 항의 차이가 일정한 수열

 

included[i] = i + 1

 

인덱스0번이 1항을 의미하며

 

a+d, a+2d, a+3d  · · · a+(n-1)d로 나타낸다.

 

* 주어진 배열 included의 true, false 조건은 문제에서 주어진 채로 시작하는 문제로

문제 조건을 따라가기만 하면됨

 

델리게이트(Delegate)

변수를 참조하는 타입

메서드를 변수에 저장할 수 있다.

 

delegate void MyDelegate(string message);

    static void Method1(string message)
    {
        Console.WriteLine("Method1: " + message);
    }

    static void Method2(string message)
    {
        Console.WriteLine("Method2: " + message);
    }
   

    static void Main(string[] args)
    {
        MyDelegate myDelegate = Method1;
        myDelegate += Method2;
        
        myDelegate("Hello World!");
    }

람다(Lambda)

람다는 익명 함수를 의미하며 간단한 함수 또는 표현식을 정의하는 방법입니다.

 

(parameter_list) => expression

 

람다 사용

 

 System;

class Program
{
    static void Main()
    {
        // 람다 식: 두 숫자의 합을 구하는 함수
        Func<int, int, int> add = (a, b) => a + b;
        
        int result = add(3, 5);  // 3과 5를 더합니다.
        Console.WriteLine(result);  // 출력: 8
    }
}

 

 

원래 형태

using System;

class Program
{
    // 메서드 형태로 변경
    static int Add(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        // 기존 람다식은 이제 Add 메서드 호출로 대체됩니다.
        int result = Add(3, 5);  
        Console.WriteLine(result);  // 출력: 8
    }
}

Func, Action

1) Func과 Action은 델리게이트를 대체하는 미리 정의된 제네릭 형식입니다.

 

2) Func값을 반환하는 메서드를 나타내는 델리게이트입니다. 마지막 제네릭 형식 매개변수는 반환 타입을 나타냅니다.

예를 들어, Func<int, string>는 int를 입력으로 받아 string을 반환하는 메서드를 나타냅니다.

 

3) Action값을 반환하지 않는 메서드를 나타내는 델리게이트입니다. Action은 매개변수를 받아들이지만, 반환 타입이 없습니다. 예를 들어, Action<int, string>은 int와 string을 입력으로 받고, 아무런 값을 반환하지 않는 메서드를 나타냅니다.

 

4) FuncAction은 제네릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현할 수 있습니다.

 

 


LINQ (Language Integrated Query)

1) .NET 프레임워크에서 제공되는 쿼리 언어 확장

2) 데이터 소스(예: 컬렉션, 데이터베이스, XML 문서 등)에서 데이터를 쿼리하고 조작하는데 사용됩니다.

3) 데이터베이스 쿼리와 유사한 방식으로 데이터를 필터링, 정렬, 그룹화, 조인 등 다양한 작업을 수행할 수 있습니다.

4) LINQ는 객체, 데이터베이스, XML 문서 등 다양한 데이터 소스를 지원합니다.

 

var result = from 변수 in 데이터소스
             [where 조건식]
             [orderby 정렬식 [, 정렬식...]]
             [select 식];

 

var 키워드는 결과 값의 자료형을 자동으로 추론합니다.

from 절에서는 데이터 소스를 지정합니다.

where 절은 선택적으로 사용하며, 조건식을 지정하여 데이터를 필터링합니다.

orderby 절은 선택적으로 사용하며, 정렬 방식을 지정합니다.

select 절은 선택적으로 사용하며, 조회할 데이터를 지정합니다.

 

// 데이터 소스 정의 (컬렉션)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 쿼리 작성 (선언적인 구문)
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;

// 쿼리 실행 및 결과 처리
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

'C# 문법' 카테고리의 다른 글

[프로그래머스] [C#] 주사위 게임 2  (0) 2025.04.17
StringBuilder  (0) 2025.04.16
예외처리(Try-catch), 값형과 참조형  (0) 2025.04.07
인터페이스와 열거형  (0) 2025.04.05
out, ref 키워드  (0) 2025.04.03

+ Recent posts