코딩테스트/프로그래머스

Day6. 배열과 컬렉션

Imperor 2025. 2. 10. 02:40

1. 가장 큰 수찾기

https://school.programmers.co.kr/learn/courses/30/lessons/120899

    public int[] solution(int[] array) 
    {
            int max = int.MinValue;
            int idx = 0;
            for (int i = 0; i < array.Length; i++)
            {
                if (max < array[i])
                {
                    max = array[i];
                    idx = i;
                }
            }
            int[] answer = new int[] { max, idx };
            return answer;
    }

이걸 한줄로 푸는 풀이가 있어서 가져와봤다

        int[] answer = new int[2] { array.Max(), Array.IndexOf(array, array.Max()) };

Array 메서드인 Max(), IndexOf() 사용한다

 

 

2. 배열의 유사도

https://school.programmers.co.kr/learn/courses/30/lessons/120903

   public int solution(string[] s1, string[] s2) 
    {
            int answer = 0;
            for (int i = 0; i < s1.Length; i++)
            {
                for (int j = 0; j < s2.Length; j++)
                {
                    if (s1[i] == s2[j])
                    {
                        answer++;
                    }
                }
            }
            return answer;
    }

이거 lambda를 써서 푸는 풀이가 있어서 가져와봤다

       int answer = s1.Count(x => s2.Contains(x));

 

 

 

3. 아이스 아메리카노

https://school.programmers.co.kr/learn/courses/30/lessons/120819

    public int[] solution(int money) 
    {
            int cups = money / 5500;
            int change = money % 5500;
            int[] answer = new int[] { cups, change };
            return answer;
    }

 

 

4. 짝수 홀수 개수

https://school.programmers.co.kr/learn/courses/30/lessons/120824

    public int[] solution(int[] num_list) 
    {
            int evens = num_list.Count<int>(x => x % 2 == 0);
            int odds = num_list.Count<int>(x => x % 2 != 0);
            int[] answer = new int[] { evens, odds };
            return answer;
    }

using System.Linq; 추가해야한다

 

 

5. 배열 원소의 길이

https://school.programmers.co.kr/learn/courses/30/lessons/120854

    public int[] solution(string[] strlist) 
    {
            List<int> lenList = new List<int>();
            for (int i = 0; i < strlist.Length; i++)
            {
                lenList.Add(strlist[i].Length);
            }
            int[] answer = lenList.ToArray();
            return answer;
    }

int[] answer = new int[strlist.Length] { }; 를 하려고 했는데, 상수값만 가능하다고해서 조금 고민했다

이걸 되게 하는 방법은 없나?

포기하고 List<int>를 사용했다

using System.Collections.Generic;를 추가했다

가능하면 배열만으로 푸는 방법을 알아야 겠다고 생각해서 찾아봤더니

            int[] answer = new int[strlist.Length];

 

뒤에 {} 붙이지 않으면 된다

 

 

6. 배열 자르기

https://school.programmers.co.kr/learn/courses/30/lessons/120833

    public int[] solution(int[] numbers, int num1, int num2) 
    {
            int[] answer = new int[num2 - num1 + 1];
            for (int i = num1; i <= num2; i++)
            {
                answer[i - num1] = numbers[i];
            }
            return answer;
    }

 

 

7. 배열의 평균값

https://school.programmers.co.kr/learn/courses/30/lessons/120817

    public double solution(int[] numbers) 
    {
            double answer = 0;
            for (int i = 0; i < numbers.Length; i++)
            {
                answer += numbers[i];
            }
            answer /= numbers.Length;
            return answer;
    }

 

 

8. 최댓값 만들기(1)

https://school.programmers.co.kr/learn/courses/30/lessons/120847

    public int solution(int[] numbers) 
    {
            int answer = 0;
            for (int i = 0; i < numbers.Length; i++)
            {
                for (int j = i + 1; j < numbers.Length; j++)
                {
                    answer = answer > numbers[i] * numbers[j] ? answer : numbers[i] * numbers[j];
                }
            }
            return answer;
    }

 

멋진 풀이가 있어서 가져와봤다

       numbers = numbers.OrderByDescending(x => x).ToArray();
       int answer = numbers[0] * numbers[1];

하지만 이 방식은 부호 구분이 없어서 음수 2개가 곱해서 최댓값이 나오는 경우를 구할 수 없다

 

 

9. 중복된 숫자 개수

https://school.programmers.co.kr/learn/courses/30/lessons/120583

    public int solution(int[] array, int n) 
    {
            int answer = 0;
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == n)
                {
                    answer++;
                }
            }
            return answer;
    }

 

처음에 array.Count를 가지고 뭘 해보려다가 안돼서 c++ 작성하듯이 했다

찾아보니

       int answer = array.Count(x => x == n);

매개변수로 lambda 표현이 들어가더라

 

 

10. 머쓱이보다 키 큰 사람

https://school.programmers.co.kr/learn/courses/30/lessons/120585

    public int solution(int[] array, int height) 
    {
            int answer = 0;
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] > height)
                {
                    answer++;
                }
            }
            return answer;
    }

 

이런 방법도 있다

        int answer = array.Count(x => x > height);

 

 

11. 짝수는 싫어요

https://school.programmers.co.kr/learn/courses/30/lessons/120813

    public int[] solution(int n) 
    {
            int[] answer = new int[(n + 1) / 2];
            for (int i = 0; i <= n; i++)
            {
                if (i % 2 == 1)
                {
                    answer[i / 2] = i;
                }
            }
            return answer;
    }

시프트 연산을 이용한 방법이 있어서 가져와봤다

        int[] answer = new int[(n + 1) / 2];
        for (int i = 0; i < (n + 1) / 2; i++)
            answer[i] = (i << 1) + 1;

lambda를 쓴 것도

        int[] answer = Enumerable.Range(1, n).Where(x => x % 2 == 1).ToArray();

 

 

12. 삼각형의 완성조건(1)

https://school.programmers.co.kr/learn/courses/30/lessons/120889

    public int solution(int[] sides) 
    {
            sides = sides.OrderByDescending(x => x).ToArray();
            int answer = sides[0] < sides[1] + sides[2] ? 1 : 2;
            return answer;
    }

나도 using System.Linq;를 적용해서 lambda를 적용해보았다

멋진 풀이가 있어서 가져와봤다

        return sides.Max() < (sides.Sum() - sides.Max()) ? 1 : 2;

가장 긴 변의 길이를 찾고, 전체에서 그걸 빼면 나머지 두 길이의 합이다

 

 

13. 배열 뒤집기

https://school.programmers.co.kr/learn/courses/30/lessons/120821

    public int[] solution(int[] num_list) 
    {
            Stack<int> stack = new Stack<int>();
            for (int i = 0; i < num_list.Length; i++)
            {
                stack.Push(num_list[i]);
            }
            int[] answer = new int[num_list.Length];
            for (int i = 0; i < answer.Length; i++)
            {
                answer[i] = stack.Pop();
            }
            return answer;
    }

stack을 쓰기로 해서 using System.Collections.Generic;를 추가했다

        Array.Reverse(num_list);
        return num_list;

Reverse가 있다니 조금은 허탈하다

그리고 배열 선언 후 역순으로 읽는것도 있다

 

 

14. 배열 회전시키기

https://school.programmers.co.kr/learn/courses/30/lessons/120844

    public int[] solution(int[] numbers, string direction) 
    {
            int[] answer = new int[numbers.Length];
            if (direction.Equals("right"))
            {
                for (int i = 0; i < numbers.Length; i++)
                {
                    answer[i] = numbers[(i - 1 + numbers.Length) % numbers.Length];
                }
            }
            else if (direction.Equals("left"))
            {
                for (int i = 0; i < numbers.Length; i++)
                {
                    answer[i] = numbers[(i + 1) % numbers.Length];
                }
            }
            return answer;
    }

다른 사람들도 "right" 인지 "left"인지 문자열을 확인하는 과정을 거쳤다

        if(true == direction.Equals("left"))
        switch(direction)
        {
            case "right":

 

이 부분은 어쩔 수 없는 것 같네

 

 

15. n의 배수 고르기

https://school.programmers.co.kr/learn/courses/30/lessons/120905

    public int[] solution(int n, int[] numlist) 
    {
            List<int> list = new List<int>();
            for (int i = 0; i < numlist.Length; i++)
            {
                if (numlist[i] % n == 0)
                {
                    list.Add(numlist[i]);
                }
            }
            int[] answer = list.ToArray();
            return answer;
    }

using System.Collections.Generic; 를 추가했다

lambda를 사용하는 방법이 있어서 가져왔다

 int[] answer = numlist.Where(x => x % n == 0).ToArray();

 

 

16. *외계행성의 나이 (힌트: 아스키코드)

https://school.programmers.co.kr/learn/courses/30/lessons/120834

   public string solution(int age) 
    {
            char[] charArr = age.ToString().ToCharArray();
            string answer = "";
            for (int i = 0; i < charArr.Length; i++)
            {
                answer += (char)(charArr[i] + 49);
            }
            return answer;
    }

ascii로 바꾼다
97 == a
48 == 0
즉 49를 더해야한다

좋은 방법이 있어서 가져왔다

       while(age>0)
        {
            answer=(char)(age%10+97)+answer;
            age/=10;
        }

 

이것도 괜찮다

       string answer = string.Concat(age.ToString().Select(x => (char)(Convert.ToInt32(x.ToString()) + 97)));

 

 

17. *최댓값 만들기(2)

나도 위의 최댓값 만들기 문제에서 음수를 고려하지 않았다

int.MinValue를 사용했다

https://school.programmers.co.kr/learn/courses/30/lessons/120862

            int answer = int.MinValue;
            for (int i = 0; i < numbers.Length; i++)
            {
                for (int j = i + 1; j < numbers.Length; j++)
                {
                    answer = answer > numbers[i] * numbers[j] ? answer : numbers[i] * numbers[j];
                }
            }
            return answer;

괜찮은 풀이가 있어서 가져왔다

        int maxLen = numbers.Length-1;
        Array.Sort(numbers);
        return (int)MathF.Max(numbers[0]*numbers[1], numbers[maxLen]*numbers[maxLen-1]);

 

 

 

18. *주사위의 개수

https://school.programmers.co.kr/learn/courses/30/lessons/120845

    public int solution(int[] box, int n) 
    {
            int x = box[0] / n;
            int y = box[1] / n;
            int z = box[2] / n;
            int answer = x * y * z;
            return answer;
    }

 

 

19 *숫자 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/120897

using System.Collections.Generic; 추가해야한다

    public int[] solution(int n) 
    {
            // num의 약수를 모두 구해서 배열에 넣어야한다
            List<int> divisors = new List<int>();
            for (int i = 1; i * i <= n; i++)
            {
                if (n % i == 0)
                {
                    divisors.Add(i);
                    divisors.Add(n / i);
                }
            }
            divisors.Sort();
            int[] answer = divisors.ToArray();
            return answer;
    }

계속 테스트 2개를 통과못했는데

이유를 찾아보니

제곱수일때 같은것이 2번이 들어간다

 

그래서 수정했다

    public int[] solution(int n) 
    {
            // num의 약수를 모두 구해서 배열에 넣어야한다
            List<int> divisors = new List<int>();
            for (int i = 1; i * i <= n; i++)
            {
                if (n % i == 0)
                {
                    divisors.Add(i);
                    if (i != n / i)
                    {
                        divisors.Add(n / i);
                    }
                }
            }
            divisors.Sort();
            int[] answer = divisors.ToArray();
            return answer;
    }