알고리즘을 짤 때, 무작정 코드를 짜는 것이 아니라 알고리즘의 순서도를 생각해보고 그려본 후 코딩하는 것이 좋다.
할 때는 귀찮을 수 있지만 나중에는 나에게 분명 큰 자산이 될 것이라고 생각한다.

문제 1: 숫자 배열의 합 계산 문제: 주어진 정수 배열 [1, 2, 3, 4, 5]의 모든 요소를 더한 값을 반환하는 함수를 작성하세요.

int SumArray(int[] arr)
{
int sum = 0;
foreach (int num in arr)
{
sum += num; // 각 요소를 더하여 합계에 누적
}
return sum; // 최종 합계를 반환
}
// 사용 예시:
int[] numbers = {1, 2, 3, 4, 5};
int result = SumArray(numbers);
Debug.Log(result); // 출력: 15
문제 2: 문자열 뒤집기 문제: 주어진 문자열 "hello"를 뒤집은 문자열을 반환하는 함수를 작성하세요.

string ReverseString(string str)
{
char[] charArray = str.ToCharArray(); // 문자열을 문자 배열로 변환
Array.Reverse(charArray); // 배열을 뒤집음
return new string(charArray); // 뒤집힌 배열을 문자열로 변환하여 반환
}
// 사용 예시:
string input = "hello";
string reversed = ReverseString(input);
Debug.Log(reversed); // 출력: "olleh"
문제 3: 팩토리얼 계산 문제: 주어진 정수 n의 팩토리얼을 계산하는 함수를 작성하세요.

int Factorial(int n)
{
if (n == 0 || n == 1)
return 1; // 0!과 1!은 1로 정의됨
return n * Factorial(n - 1); // 재귀적으로 n * (n-1)! 계산
}
문제 4: 피보나치 수열 문제: n번째 피보나치 수를 반환하는 함수를 작성하세요. (피보나치 수열은 첫 두 항이 0과 1이며, 그 다음 항은 이전 두 항의 합입니다.)

int Fibonacci(int n)
{
if (n <= 1)
return n; // n이 0 또는 1인 경우 그 값을 바로 반환
return Fibonacci(n - 1) + Fibonacci(n - 2); // 재귀적으로 피보나치 수를 계산
}
문제 5: 배열에서 최대값 찾기 문제: 주어진 정수 배열에서 가장 큰 값을 찾는 함수를 작성하세요.

int FindMax(int[] arr)
{
int max = arr[0]; // 배열의 첫 번째 요소를 초기 최대값으로 설정
foreach (int num in arr)
{
if (num > max)
max = num; // 현재 요소가 더 크면 최대값을 갱신
}
return max; // 최종 최대값을 반환
}
문제 6: 소수 판별 문제: 주어진 정수가 소수인지 여부를 판별하는 함수를 작성하세요.

bool IsPrime(int n)
{
if (n <= 1)
return false; // 1 이하의 수는 소수가 아님
for (int i = 2; i <= Math.Sqrt(n); i++)
{
if (n % i == 0)
return false; // i로 나누어떨어지면 소수가 아님
}
return true; // 어떤 수로도 나누어떨어지지 않으면 소수
}
문제 7: 문자열 내 단어의 개수 세기 문제: 주어진 문자열에 몇 개의 단어가 있는지 세는 함수를 작성하세요.

int CountWords(string str)
{
if (string.IsNullOrWhiteSpace(str))
return 0; // 문자열이 비어있거나 공백뿐인 경우 0을 반환
string[] words = str.Split(' '); // 공백을 기준으로 문자열을 단어로 분리
return words.Length; // 단어의 개수를 반환
}
문제 8: 배열 요소의 곱 계산 문제: 주어진 정수 배열의 모든 요소를 곱한 값을 반환하는 함수를 작성하세요.

int MultiplyArray(int[] arr)
{
int product = 1;
foreach (int num in arr)
{
product *= num; // 각 요소를 곱하여 결과에 누적
}
return product; // 최종 곱을 반환
}
문제 9: 배열에서 중복된 요소 제거 문제: 주어진 정수 배열에서 중복된 요소를 제거하고, 중복이 제거된 배열을 반환하는 함수를 작성하세요.

int[] RemoveDuplicates(int[] arr)
{
return arr.Distinct().ToArray(); // Distinct() 메서드를 사용하여 중복을 제거하고 배열로 반환
}
문제 10: 두 배열의 교집합 구하기 문제: 두 개의 정수 배열이 주어졌을 때, 두 배열의 교집합 요소를 반환하는 함수를 작성하세요.

int[] Intersection(int[] arr1, int[] arr2)
{
return arr1.Intersect(arr2).ToArray(); // Intersect() 메서드를 사용하여 교집합을 구하고 배열로 반환
}
순서도를 볼 때는 복잡하고 길게 보여도, 이미 함수로 구현되어 있어 코드로는 매우 간단한 경우도 존재한다.
그러나 알고리즘 순서도를 그리는 것은 알고리즘을 빠르게 짜기 위한 목적이 아니고, 주어진 문제의 해결방법을 논리적으로 세워가는 것을 훈련하는 것이다. 나도 익숙한 문제들이 많았기에 순서도를 그리는 것이 너무 귀찮았다. 그러나 막상 해보니, 코드로는 짤 수 있을 것 같고 정답을 알겠는데 순서도를 못그리겠는 경우도 있었다 ...! (충격) 코드를 제대로 이해하지 않고, 제대로 소화시키지 않고 그냥 삼켜버린 것이 순서도를 그려보니 모두 들통나게 되었다. 과정은 힘들고 괴로울지라도 이 과정은 나를 더 나은 개발자로 만들어 줄 수 있을 것이다 ! ! 완전 럭키비키 ..ㅎ
그러니 싫고 귀찮아도 해야한다.....ㅠ
'코딩일기' 카테고리의 다른 글
| [알고리즘] 백준 #1546 평균 - C# (0) | 2025.05.01 |
|---|---|
| [알고리즘] 백준 #11720 숫자의 합 - C# (0) | 2025.05.01 |
| [알고리즘] 백준 #3004 체스판조각 -Java (0) | 2022.03.03 |
| [알고리즘] 백준 #2530 인공지능 시계-Java (0) | 2022.03.03 |
| [알고리즘] 백준 #13866 팀나누기-Java (0) | 2022.02.28 |