본문 바로가기
<ALGORITHM>/NOTE

210115(금)

by CodeGrimie 2021. 1. 15.

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

먼저 교수님께서 프로그래밍 수업을 듣는 우리가 얼마나 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점이 나왔겠지만 문제의 의도가 의도인 만큼 배운 것을 복습하는데 집중했다.

'<ALGORITHM> > NOTE' 카테고리의 다른 글

20210127(수)  (0) 2021.01.27
20210121(목)  (0) 2021.01.21
20210120(수)  (0) 2021.01.20
20210119(화)  (0) 2021.01.19
210118(월)  (0) 2021.01.18

댓글