"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

코딩테스트

Lv0-6. 조건문, 반복문

허민영 2025. 1. 13. 15:44

문제1.

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

using System;

public class Solution
{
    public int[] solution(int[] num_list)
    {
        int[] answer = new int[num_list.Length+1];
        
        int last = num_list[num_list.Length-1];
        int preLast = num_list[num_list.Length - 2];
        int result = (last > preLast) ? last - preLast : last * 2;
        for (int i = 0; i <= num_list.Length; i++)
        {
            answer[i] = (i == num_list.Length)? result :num_list[i];
        }
        return answer;
    }
}

 

문제2

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

  • "w" : n이 1 커집니다.
  • "s" : n이 1 작아집니다.
  • "d" : n이 10 커집니다.
  • "a" : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

using System;

public class Solution
{
    public int solution(int n, string control)
    { 
        foreach (char c in control)
        {
            switch (c)
            {
                case 'a': n -= 10; break;
                case 'd': n += 10; break;
                case 's': n -= 1; break;
                case 'w': n += 1; break;
            }
        }
        return n;
    }
}

 

문제3

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

  • "w" : 수에 1을 더한다.
  • "s" : 수에 1을 뺀다.
  • "d" : 수에 10을 더한다.
  • "a" : 수에 10을 뺀다.

그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

using System;

public class Solution 
{
    public string solution(int[] numLog)
    {
        string answer = "";
        for(int i =0; i<numLog.Length-1;i++)
        {
            switch(numLog[i+1]-numLog[i])
            {
                case 1:answer += "w"; break;
                case -1:answer += "s"; break;
                case 10:answer += "d"; break;
                case -10:answer += "a"; break;
            }
        }
        return answer;
    }
}

//참고코드
using System;
using System.Text;

public class Solution {
    public string solution(int[] numLog) 
    {
        var sb = new StringBuilder();
        int n = numLog[0];
        for(int i = 1; i < numLog.Length; ++i)
        {
            int next = numLog[i];

            if(n + 1 == next)       sb.Append("w");
            else if(n - 1 == next)  sb.Append("s");
            else if(n + 10 == next) sb.Append("d");
            else if(n - 10 == next) sb.Append("a");

            n = next;
        }

        return sb.ToString();
    }
}

보완점 : string간의 연산은 매우 느림. StringBuilder를 사용하여 개선

 

문제4.

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.

 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

public class Solution
{
    public int[] solution(int[] arr, int[,] queries)
    {
        int queryCount = queries.GetLength(0); 
        for (int k = 0; k < queryCount; k++)
        {
            int i = queries[k, 0];
            int j = queries[k, 1];

            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        return arr;
    }
}

 

문제5

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

 query마다 순서대로 s  i  e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

using System;

public class Solution
{
    public int[] solution(int[] arr, int[,] queries)
    {
        int queryCount = queries.GetLength(0);
        int[] answer = new int[queryCount];
        int s;
        int e;
        int k;

        for (int a = 0; a < queryCount; a++)
        {
            int temp = 1000001; //answer[] <1000000
            s = queries[a, 0];
            e = queries[a, 1];
            k = queries[a, 2];
            for (int i = s; i <= e; i++)
            {
                if (arr[i] > k && arr[i] < temp) temp = arr[i];
            }
            answer[a] = (temp == 1000001) ? -1 : temp;
        }
        return answer;
    }
}

'코딩테스트' 카테고리의 다른 글

Lv0-8. 조건문, 문자열  (1) 2025.01.15
Lv0-7. 반복문  (0) 2025.01.13
Lv0-5. 조건문  (1) 2025.01.11
Lv0-4. 연산,조건문  (1) 2025.01.10
Lv0-3. 연산  (0) 2025.01.10