24.01.18 TIL - [C#] 알고리즘의 문제 해결 전략

JJwoo·2024년 1월 18일

알고리즘

목록 보기
2/18
post-thumbnail

1) 문제 해결 전략

  • 문제 이해: 문제의 요구사항과 입력/출력 형식을 정확히 파악하자.

  • 예제와 테스트 케이스: 문제 이해를 돕고 해결 방법을 검증하기 위해 예제와 테스트 케이스를 활용하자.

  • 알고리즘 설계: 문제 유형에 맞는 알고리즘을 고르고, 시간 복잡도를 고려하며 설계하자.

  • 코드 작성: 가독성이 높고 문제 요구사항을 충족하는 코드를 작성하자. 변수명과 주석을 명확히 하자.

  • 효율성: 시간과 공간 복잡도를 최소화하는 방향으로 최적화하자.

  • 디버깅과 테스트: 코드 오류를 찾아 수정하고, 테스트 케이스로 정확성을 검증하자.

  • 시간 관리: 제한된 시간 안에 문제를 해결할 수 있도록 시간을 효과적으로 관리하자.

  • 연습과 경험: 다양한 문제를 풀어보고 다른 사람의 풀이도 학습하자.


2) 코딩 테스트 및 알고리즘 문제 유형

  • 탐색과 정렬: 데이터에서 값을 찾거나 정렬하는 문제.
    예: 선형 탐색, 이진 탐색, 퀵 정렬.

  • 그래프: 그래프 구조를 활용한 문제.
    예: DFS, BFS, Dijkstra.

  • 동적 프로그래밍: 작은 하위 문제로 나누어 해결.
    예: 피보나치 수열, 최장 공통 부분 수열.

그리디 알고리즘: 각 단계에서 최적의 선택을 하는 문제.
예: 거스름돈, 회의실 배정.

  • 분할 정복: 문제를 작은 부분으로 나누어 해결.
    예: 정렬, 병합 정렬.

  • 동적 그래프: 그래프의 동적 변화를 다루는 문제.
    예: 플로이드-와샬, 벨만-포드.

  • 문자열 처리: 문자열을 다루는 문제. 예
    : 문자열 압축, 회문 판별.

  • 기타: 수학적 문제, 비트 연산, 시뮬레이션 등 다양한 유형의 문제.


3) 실전 연습 문제

  1. 백준 온라인 저지 (https://www.acmicpc.net/): 다양한 난이도의 알고리즘 문제를 제공하며, 많은 사용자들과 소통할 수 있는 커뮤니티도 제공합니다.

  2. 프로그래머스 (https://programmers.co.kr/): 코딩 테스트 연습을 위한 문제들을 다양한 난이도로 제공하고 있습니다. 실제 취업 시험에서도 출제되는 문제들을 포함하고 있습니다.

  3. 바킹독 (https://blog.encrypted.gg/): 알고리즘 강의 다수 제공하고 있습니다.

  4. LeetCode (https://leetcode.com/): 알고리즘 문제와 코딩 테스트 문제를 다양한 난이도로 제공하고 있으며, 실제 기업 코딩 인터뷰에서 출제되는 문제들을 포함하고 있습니다.


실전 문제 체험하기

물품의 무게 정렬할기 ( Quick Sort )

문제: 물품의 무게를 나타내는 정수 배열이 주어집니다. 이 물품들을 퀵정렬을 사용하여 무게순으로 오름차순으로 정렬하세요.

입력:
정수 배열 weights: 물품의 무게를 나타내는 원소가 포함된 배열입니다. 배열의 길이는 1 이상 100 이하입니다. 각 원소는 -100 이상 100 이하의 정수입니다.

출력:
정렬된 정수 배열 sortedWeights: 주어진 weights 배열을 퀵정렬을 사용하여 오름차순으로 정렬한 배열입니다.

예시:
입력: [5, 3, 9, 1, 7]
출력: [1, 3, 5, 7, 9]

주의사항:

  • 퀵정렬은 분할 정복 기법을 사용하는 정렬 알고리즘입니다. 재귀적인 방식으로 구현해야 합니다.
  • 퀵정렬을 구현할 때는 배열을 직접 분할하고 정렬하는 방식을 사용해야 합니다. 내장된 정렬 함수는 사용하지 마세요.
  • 정렬된 배열의 순서는 오름차순이어야 합니다.
  • 동일한 값이 여러 번 나타날 수 있으며, 이러한 값들은 정렬된 배열에서 동일한 값끼리 인접하게 위치해야 합니다.
  • 추가적인 배열을 사용하지 않고 주어진 배열 내에서 정렬을 수행해야 합니다.
def quicksort(weights, start, end):
    if start >= end:
        return

    pivot = partition(weights, start, end)
    quicksort(weights, start, pivot - 1)
    quicksort(weights, pivot + 1, end)

def partition(weights, start, end):
    pivot = weights[end]
    i = start - 1

    for j in range(start, end):
        if weights[j] < pivot:
            i += 1
            weights[i], weights[j] = weights[j], weights[i]

    weights[i + 1], weights[end] = weights[end], weights[i + 1]
    return i + 1

weights = [5, 3, 9, 1, 7]
quicksort(weights, 0, len(weights) - 1)
print(weights)

- 그리디 알고리즘 - 작업 스케줄링

문제:

작업 스케줄링

주어진 일정과 작업에 대한 정보를 바탕으로 작업을 최적으로 배치하는 문제입니다. 각 작업은 시작 시간과 종료 시간이 주어지며, 하나의 작업을 동시에 수행할 수 없습니다. 작업 스케줄링 알고리즘을 사용하여 최대한 많은 작업을 완료할 수 있는 방법을 찾아보세요.

입력:

  • jobs: 작업의 정보를 담은 리스트. 각 작업은 시작 시간과 종료 시간으로 구성되며, 작업의 수는 N입니다. (1 <= N <= 100)
  • 예시: [(1, 4), (3, 6), (2, 8), (5, 7), (4, 9)]

출력:

  • 최대로 완료할 수 있는 작업의 개수를 반환하세요.

예제:

Input: [(1, 4), (3, 6), (2, 8), (5, 7), (4, 9)]
Output: 3

using System;
using System.Collections.Generic;

public class Job
{
    public int StartTime { get; set; }
    public int EndTime { get; set; }

    public Job(int startTime, int endTime)
    {
        StartTime = startTime;
        EndTime = endTime;
    }
}

public class JobScheduling
{
    public int MaxJobScheduling(List<Job> jobs)
    {
        jobs.Sort((x, y) => x.EndTime.CompareTo(y.EndTime));

        int maxJobs = 0;
        int prevEndTime = 0;

        foreach (var job in jobs)
        {
            if (job.StartTime >= prevEndTime)
            {
                maxJobs++;
                prevEndTime = job.EndTime;
            }
        }

        return maxJobs;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        List<Job> jobs = new List<Job>
        {
            new Job(1, 4),
            new Job(3, 6),
            new Job(2, 8),
            new Job(5, 7),
            new Job(4, 9)
        };

        JobScheduling scheduler = new JobScheduling();
        int maxJobs = scheduler.MaxJobScheduling(jobs);

        Console.WriteLine($"Maximum Jobs: {maxJobs}");
    }
}
profile
개발 모코코

0개의 댓글