temp-franc 2023. 9. 4. 23:22

1. 최대공약수와 최소공배수

 

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

제한 사항
두 수는 1이상 1000000이하의 자연수입니다.

 

 

 

!! 나의 풀이

public class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        int minNum = (n > m) ? m : n;
        int maxDiv = 0;
        for (int i = 1; i < minNum + 1; i++)
        {
            if (n % i == 0 && m % i == 0)
            {
                maxDiv = i;
            }
        }
        int minTime = n * m / maxDiv;
        answer[0] = maxDiv;
        answer[1] = minTime;
        return answer;
    }
}

 

!! 모범 풀이

public class Solution {
    public int[] solution(int n, int m) {
        int _gcd = gcd(n, m);
        int[] answer = new int[] {_gcd, n * m / _gcd};

        return answer;
    }

    int gcd(int a, int b)
    {
        return (a % b == 0 ? b : gcd(b, a % b));
    }
}

 

깨달은 점

 

1. 재귀함수를 활용하여 유클리드 알고리즘을 구현하였다.

 => 이 경우, 내가 한 것과 달리, 두 수의 크기 비교를 하지 않아도 된다는 점과

 => 코드가 깔끔하게 정리된다는 점이 장점이였다.

 

다만, 재귀함수를 사용할 시,

재귀 호출은 스택 메모리에 저장되는 형태로 실행하기 때문에,
함수 호출의 최대 깊이에는 제한이 있는데, 이를 넘으면, 스택 오버플로우가 일어날 수 있다는 점 

때문에 많은 양의 데이터를 처리하는 코드를 작성할 때에는 재귀 호출보다 반복문으로 풀어 쓰는 것이 좋다.

 

재귀 함수 (recursive)

 

 : 함수에서 함수 자신을 호출하는 것.

 

 

2. 이상한 문자 만들기

 

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

 

제한 사항
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

 

!! 나의 풀이

public class Solution {
    public string solution(string s) {
        string answer = "";
        string[] inputArray = s.Split(" ");
        for (int i = 0; i < inputArray.Length; i++)
        {
            if (s.IndexOf(inputArray[i]) != answer.Length)
            {
                answer += " ";
            }
            for (int j = 0; j < inputArray[i].Length; j++)
            {
                string temp = (j % 2 == 0)? inputArray[i][j].ToString().ToUpper():inputArray[i][j].ToString().ToLower();
                answer += temp;
            }
        }
        return answer;
    }
}

: 문자열을 띄어쓰기를 기준으로 Split 한 후,

: 배열의 각 요소에 대해 index에 따라 answer에 ToUpper과 ToLower 메서드를 활용하여 더하였다.

: 띄어쓰기의 경우, answer의 길이와 배열 요소의 index를 비교하여 차이나는만큼 더하였다.

 

!! 모범 풀이

public class Solution {
    public string solution(string s) {
        string answer = "";
        int num = 0;

        for(int i = 0; i < s.Length; i++)
        {
            answer += num % 2 == 0 ? s[i].ToString().ToUpper() : s[i].ToString().ToLower();
            num = s[i] == ' '? 0 : num + 1;
        }
        return answer;
    }
}

 

깨달은 점

 

 1. 굳이 배열로 바꾸지 않아도, 문자열의 index에 따라 비교하여 answer에 추가하거나, 대소문자를 판별하는 num에 띄어쓰기만큼 더해주는 것으로 깔끔하게 해결하였다.

 

 2. index를 활용하여 처리하는 것을 무조건 List나 Array로 바꾸기 전에, 바꾸지 않아도 되는지 한번 생각하는 것이 좋겠다.