배열 합 관련 질문드립니다.

int[] intArr= { 1, 2, 4, 8, 16, 32};
int nNum = 12;

위처럼 배열 안에 값이 있고,

intArr에서 몇 번째 인덱스를 더하면 nNum과 같은 수를 얻을 수 있는지 체크하고 싶습니다.

좋아요 1

웹 프로그래밍에 관련된 질문이 아니기 때문에 카테고리를 변경했습니다.

좋아요 1

12라는 숫자 값을 얻기 위해서 4와 8을 더하면 되는 것은 자명한 것 같습니다. 질문하신 의도가 4와 8의 인덱스 번호가 C#을 기준으로 어떻게 되는가를 질문하신 것이라면, C#은 C나 C++처럼 0을 시작점으로 배열 인덱스를 잡기 때문에, 4가 들어있는 위치는 [2], 이고 8이 들어있는 위치는 [3]이 될 것입니다.

따라서 nNum과 같은 값을 만들기 위해서 intArr 배열의 원소를 참조하려면 다음과 같이 코드를 작성하실 수 있을 겁니다.

int nNum2 = intArr[2] + intArr[3];
Assert.Equals(nNum2, 12);
좋아요 1

감사합니다.

그럼 혹시 nNum이 12가 아닌 배열 안에 값들 중에서 합한 수가 나온다고 했을 때,

배열의 어떤 인덱스의 수를 더해서 합한 수가 나왔는 지는 어떻게 알 수 있나요 ??

좋아요 1

약간 알고리즘 문제 느낌이 나긴 하지만…

그냥 단순히 생각하고 말씀 드리자면

주어진 배열 요소들에서 12값을 뺀 최소값을 구하고 (A)

A + X = 12 에서

X에 해당되는 값을 찾으면 될 것 같습니다. (B)

위 두개의 A와 B 값을 찾았다면 해당 값의 인덱스를 찾으면 되겠구요

코드로 기술해 본다면 이렇게 됩니다.

private int[] Solution(int[] nums, int value)
{
            var min = nums.Min(p => Math.Abs(p - value));
            var x = nums.First(p => Math.Abs(p - value) == min);

            return new int[] { nums.ToList().IndexOf(min),
                nums.ToList().IndexOf(x) };
}

int[] intArr = { 1, 2, 4, 8, 16, 32 };
int nNum = 12;

int[] result = this.Solution(intArr, nNum );  // 2, 3
좋아요 4

와… 감사합니다…ㅠㅠ

마지막으로… 배열에서 2개가 넘는 조합으로 나오는 수가 있으면 index -1를 반환하는데
이럴 땐 어떡하죠…

좋아요 1

너무 과제같은…느낌…;; :scream:

좋아요 2

답을 드리기전에 궁금한게

과제 인가요?
아님 알고리즘 공부중 이신건가요?

좋아요 1

배열 관련해서 경우의 수 특정 값 찾는 공부하다가 질문드렸습니다…

과제는 아닌데… 혹시 과제면 질문 하면 안 되는 건가요 ?

좋아요 1

과제의 경우 질문을 하면 안된 다기보다
답변 다시는 분들이 답변보다는 힌트를 주는 정도로 끝을 냅니다.
이유는 공부하라고 내준 과제를 답변을 줘 버리면 과제의 의미가 없어지니까이고요.

좋아요 4

과제는 답변해드리기가 매우 꺼려집니다. (특히!!! 신입사원 과제)
고민의 흔적이나, 시도해 본 코드를 보여주시면 좋을거 같아요.

과제가 아니고 당장에 해결해야 할 문제가 아니라면,
C# 기본서 하나 사셔서 보시는 것도 추천드립니다.

좋아요 3

넵 알겠습니당.

고민하고 찾다 찾다 안 돼서 글 올린 건데
다음엔 코드 첨부해서 같이 올리겠습니다 ㅎㅎ

좋아요 2

10진수 12를 2진수 1100으로 바꾸는 과정 같네요.

좋아요 1

간단한 알고리즘 구현 같아서, 퀴즈를 푸는 느낌으로 해봤습니다. 주어진 수를 2진수로 바꾸는 문제인 것 같습니다. 소요시간은 머리가 굳어서 20분입니다…

int[] GetBinaryIndice(int nNum, int[] intArr = null)
{
    if (nNum < 1) return null;

    List<int> list;
    if (intArr == null) // 입력 배열은 2의 제곱수의 집합이 어울릴 것 같아, 자동으로 만들어봅니다
    {
        int largest2Power = (int)Math.Floor(Math.Log2(nNum)) + 1; // 작지만 가장 가까운 2의 제곱수를 찾는다
        list = Enumerable.Range(0, largest2Power)
                         .Select(x => (int)Math.Pow(2,x)) // 2의 제곱수로 배열을 만든다
                         .OrderBy(y => y)
                         .ToList();
    }
    else
    {
        list = intArr.OrderBy(x => x) // 적절한 배열을 넣는다면 그대로 쓴다
                     .ToList();
    }
    
    List<int> output = new();
    int tokenValue = nNum;
    for (int index = list.Count-1; index >= 0; index--)
    {
        if (tokenValue >= list[index]) // 가장 큰 제곱수부터 차례대로 비교하고,        {
            tokenValue -= list[index]; //  현재 값이 크면 비교값 만큼 뺴준다
            output.Add(index);
        }        
    }
    output.Reverse();

    if (tokenValue != 0) return null; // 이상한 배열을 넣었다면 값이 나누어 떨어지지 않아서 실패
    
    return output.ToArray();
}

이런 느낌으로 나옵니다.

GetBinaryIndice(1) → {0} → 0 째 값
GetBinaryIndice(2) → {1} → 1 째 값
GetBinaryIndice(5) → {0, 2} → 0, 2 째 값들의 합-> 101b
GetBinaryIndice(7) → {0, 1, 2} → 0, 1, 2 째 값들의 합-> 111b

만약에 임의의 배열을 넣는다고 하면

GetBinaryIndice(12, new int[] {1, 2, 4, 8, 16, 32}) → ‘2, 3번째 값들의 합으로 12를 만들 수 있음’
GetBinaryIndice(12, new int[] {2,2,2,2,2,2,2,2,2}) → ‘3,4,5,6,7,8 번째 값들의 합으로 12를 만들 수 있음 ㅋㅋㅋㅋ’

이런 식으로 나오겠네요

간만에 이런 걸 보니 재밌네요. 과제라면 알고리즘 작성실력을 키울 수 있어 스스로의 힘으로 해보는 게 좋겠네요. 코딩 테스트에 이런 문제가 나올까요?

좋아요 5

주어진 배열의 값의 합을 이용해서 임의의 수가 나오는지 확인하면 되는 이해하기 어려운 문제가 아닌거 같은데…

혹시… 이 질문의 답에 왜 2진수가 나오는지… ㅋㅋㅋ 여쭤봐도 될까요? ㅋㅋㅋ :sob:

좋아요 3

대신 답변 드리자면 현재 주어진 배열이 1 2 4 8 16 32 같이
binary로 보면 0001 0010 0100 같은 숫자입니다.
즉 이러한 배열에서 어떤 숫자끼리 더하면 그 숫자가 나오는지 알려고 하는 문제를
2진수로 접근하신 것 같습니다.
저도 딱 보고 2진수 문제랑 비슷하단 생각이 들었고요 ㅎㅎ :smile:

좋아요 3

제가 생각의 도약을 하고 급발진 한 것 같네요. 지적해주신 부분이 맞는 것 같습니다…

이제 제가 어떻게 오해했는지 설명드리고 싶습니다
지적해 주신대로 ‘주어진 배열의 값의 합을 이용해서 임의의 수가 나오는지 확인’ 하는 것이 목표이죠.
저도 그렇게 이해했었습니다.

그래서 풀이법을 ‘배열을 오름차순으로 정렬하고, 입력 값보다 작다면 그 만큼 빼고 입력값이 0이 될 때까지 반복한다’ 로 정했습니다.

질문의 배열은 다음과 같습니다:

int[] intArr = { 1, 2, 4, 8, 16, 32};

입력 배렬 intArr가 우연히 2의 거듭제곱수의 집합으로 구성된 것을 봤습니다. 그럼 이런 식으로 보이겠죠:

int[] intArr = { 2^0, 2^1, 2^2, 2^3, 2^4, 2^5};

저는 이 부분에서 사고를 건너 뛰어버렸습니다. 질문의 답 처럼 4와 8로 12를 만들 수 있을 때, 각 값들은 4 = 2^2, 8 = 2^3이 됩니다. 따라서 2의 2번째, 3번째 거듭제곱 수로 표현이 되죠. 그리고 답은 {2, 3}이 될 겁니다

만약 배열이 2의 거듭제곱수로만 이루어졌다면, 최종 답을 표현하는 깔끔한 방법이 2진법 표현이라 생각했습니다. 그래서 입력 배열의 가정은 생략하고 ‘그냥 2진법 문제로 보이네요’ 라고 얘기했었습니다. 사실 입력 배열은 어떤 배열이 와도 상관이 없어야 하는데 말이죠.

그래도 구현은 null을 입력했을 때는 2의 거듭제곱의 배열을 자동으로 만들어서 수행하고, 값이 있는 배열을 넣었을 때는 원래 문제의 취지에 맞게 구현한 것 같습니다. (답이 여러가지 일 경우는 커버하지 못했습니다)
질문에 답하는 게 되게 오랜만이라서, 읽는 분들을 배려하지 못한 것 같았네요. 좀 더 노력해보겠습니다 :smiling_face:

좋아요 4

지적이라니요~~ ㅋㅋㅋ 그저 이 커뮤니티에 기여하고 싶어서 모르겠는 걸 용기내서 물어봤을 뿐입니다.

수학과 사람들과도 같이 일해보았는데 그들의 수학적 사고가 부러워서 ㅋㅋㅋ 질문드린 것 뿐입니다… ㅋㅋㅋ

제가 원했던 답은 여기에 있었네요 ㅋㅋ 생각보다 간단한 알고리즘으로 풀리네요 ㅋㅋㅋ

제가 너무 어렵게 생각했나봅니다 ㅎㅎㅎ :+1: :+1: :+1:

좋아요 4

질문글과는 다른 이야기지만…
어떤걸 만들고 계신건지 혹은 어떤걸 목표로 공부중이신지 궁금해요

좋아요 3