<ALGORITHM>/NOTE

210115(금)

CodeGrimie 2021. 1. 15. 17:35

코로나의 영향으로 프로그래밍 수업의 순서가 꼬여서 중간에 알고리즘 수업을 진행했다.

먼저 교수님께서 프로그래밍 수업을 듣는 우리가 얼마나 C에 대해서 이해하고 있는지 확인하기 위해 문제를 내주셨다.

두 배열의 합을 저장하는 배열 출력하기

▼ 문제 내용

인자를 5개~10개 가지는 동일한 크기의 배열 두 개를 선언하고 임의의 값으로 초기화 한다.

배열 하나를 더 이용해서 두 배열의 같은 색인의 인자들끼리 합을 저장하고 출력하는 함수를 만들어서 출력하라.

 

▼ 문제 목적

배열과 순환문에 대해서 이해하고 있는지 확인하는 문제다.

 

▼ 내가 푼 코드

#include <cstdio>

void Print(int a, int b, int c)
{
    printf("iArr1(%d) + iArr2(%d) = iArrR(%d)\n", a, b, c);
}

int main()
{
    int iArr1[5] = { 0,1,2,3,4 };
    int iArr2[5] = { 5,6,7,8,9 };
    int iArrR[5];

    for (int i = 0; i < 5; i++)
    {
        iArrR[i] = iArr1[i] + iArr2[i];
    }

    for (int i = 0; i < 5; i++)
    {
        Print(iArr1[i], iArr2[i], iArrR[i]);
    }
    return (0);
}

되게 간단한 문제였지만 문제를 대충 읽어서 출력하는 함수를 만들지 않았었다.

만약 진짜 코딩 테스트였다면 난 바로 0점을 맞았을 것이다.

문제를 꼼꼼히 읽어봐야 한다는 것을 느끼게 해 준 고마운 예제.

 

한 가지 더 아쉬운 점이 있는데 오전에 배운 동적 할당으로 구현하는 건 실패했다는 것이다.

아직 포인터를 익숙하게 다룰 수 없다는 증거라고 생각하고 더 자주 포인터를 쓰는 버릇을 들여야겠다.

배열 값을 역순으로 정렬하기

▼ 문제 내용

5개의 인자를 가지는 배열을 역순으로 정렬한다.

배열 두 개의 인자를 서로 교환하는 Swap()이란 함수를 만들어서 풀고 출력하라.

 

▼ 문제 목적

포인터를 이해하고 있는지 확인하는 문제다.

 

▼ 내가 푼 코드

// 배열 역순 정렬 문제
#include <cstdio>

// 포인터(*) 매개변수
void Swap(int* lhs, int* rhs);
// 참조자(&) 매개변수
void Swap(int& lhs, int& rhs);

const static int LENGTH = 5;

int main()
{
    // 기본 배열 선언 및 초기화
    int iArr[LENGTH] = { 2, 3, 4, 7, 1 };

    // 기본 배열 출력
    printf("== BEFORE ==\n");
    for (int i = 0; i < LENGTH; i++)
    {
        printf("iArr[%d] = %d\n", i, iArr[i]);
    }
    printf("\n");

    // 교환
    // 배열 길이가 바뀔 때도 Swap 되면 좋을 것 같은데..
    // for문 안에서 (5 * 0.5)를 했더니 0, 1, 2 돌아서 그냥 명시적 형변환을 해보니 0, 1만 돈다. 해결한건가?;;
    int loopNum = static_cast<int>(5 * 0.5);
    for (int i = 0; i < loopNum; i++)
    {
        Swap(&iArr[i], &iArr[LENGTH -1 - i]);
        //Swap(iArr[i], iArr[LENGTH -1 - i]);
    }

    // 뒤집어진 배열 출력
    printf("== AFTER ==\n");
    for (int i = 0; i < 5; i++)
    {
        printf("iArr[%d] = %d\n", i, iArr[i]);
    }

    return (0);
}

// 포인터(*) 매개변수
void Swap(int* lhs, int* rhs)
{
    int _temp = 0;

    _temp = *lhs;
    *lhs = *rhs;
    *rhs = _temp;
}

// 참조자(&) 매개변수
void Swap(int& lhs, int& rhs)
{
    int _temp = 0;

    _temp = lhs;
    lhs = rhs;
    rhs = _temp;
}

거의 한 번에 코드가 완성돼서 참조자를 매개변수로 가지는 경우도 만들었다.

이 Swap이라는 함수는 간단하지만 포인터의 기초적인 응용을 해볼 수 있었기 때문에 굉장히 재밌었다.

서울에서 부산으로 가는 수단 정하기

▼ 문제 내용

공항까지 걸리는 시간이 1시간 미만이면 비행기를 탑니다.

버스 터미널까지 가는 시간이 기차역 가는 시간보다 1시간 이상 빠르면 버스를 탑니다.

그 외엔 기차를 탑니다.

 

▼ 문제 목적

조건문을 얼마나 이해하고 있는지 확인하는 문제다.

 

▼ 내가 푼 코드

#include <cstdio>
#include <cstdlib>
#include <clocale>

enum class eWayToBusan {
    NONE = 0,
    AIRPLAIN,
    TRAIN,
    BUS
};

const static int MAX_AIRPLANE_MINUTE = 60;

int main()
{
    _wsetlocale(LC_ALL, L"Korean");

    int minToAirport;
    int minToTrain;
    int minToBus;

    eWayToBusan wayToBusan = eWayToBusan::NONE;

    minToAirport = 0;
    minToTrain = 0;
    minToBus = 0;

    wprintf(L"  ▼ 공항까지 걸리는 시간을 입력하세요.\n");
    scanf_s("%d", &minToAirport);
    wprintf(L"  ▼ 기차역까지 걸리는 시간을 입력하세요.\n");
    scanf_s("%d", &minToTrain);
    wprintf(L"  ▼ 버스 터미널까지 걸리는 시간을 입력하세요.\n");
    scanf_s("%d", &minToBus);
    wprintf(L"\n");

    if (minToAirport < MAX_AIRPLANE_MINUTE)
    {
        // Airplane
        wayToBusan = eWayToBusan::AIRPLAIN;
    }
    else
    {
        if ((minToBus + 60) <= minToTrain)
        {
            // Bus
            wayToBusan = eWayToBusan::BUS;
        }
        else
        {
            // TRAIN
            wayToBusan = eWayToBusan::TRAIN;
        }
    }

    wprintf(L"공항까지 걸리는 시간 : %d\n", minToAirport);
    wprintf(L"기차역 까지 걸리는 시간 : %d\n", minToTrain);
    wprintf(L"버스 터미널까지 걸리는 시간 : %d\n", minToBus);
    wprintf(L"\n");

    wprintf(L"== 서울 ==\n");

    switch (wayToBusan)
    {
    case eWayToBusan::AIRPLAIN:
    {
        wprintf(L"공항까지 걸리는 시간(%d)이 1시간(60) 미만입니다.\n", minToAirport);
        wprintf(L"비행기를 타고 부산으로 갑니다.\n");
    }
    break;
    case eWayToBusan::TRAIN:
    {
        wprintf(L"기차역 가는 시간(%d)이 버스 터미널 가는 시간(%d)과 1시간(60) 미만 차이 납니다.\n", minToTrain, minToBus);
        wprintf(L"기차를 타고 부산으로 갑니다.\n");
    }
    break;
    case eWayToBusan::BUS:
    {
        wprintf(L"버스 터미널까지 가는 시간(%d)이 기차역 가는 시간(%d)보다 1시간(60) 이상 빠릅니다.\n", minToBus, minToTrain);
        wprintf(L"버스를 타고 부산으로 갑니다.\n");
    }
    break;
    default:
        break;
    }

    wprintf(L"== 부산 ==\n");
    return (0);
}

원래 문제의 답은 대단히 짧다.

그냥 내가 문제를 풀고 시간이 남아서 입력받고 출력하는 부분을 추가한 것이다.

진짜 코딩 테스트였으면 십중팔구 0점이 나왔겠지만 문제의 의도가 의도인 만큼 배운 것을 복습하는데 집중했다.