210115(금)
코로나의 영향으로 프로그래밍 수업의 순서가 꼬여서 중간에 알고리즘 수업을 진행했다.
먼저 교수님께서 프로그래밍 수업을 듣는 우리가 얼마나 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점이 나왔겠지만 문제의 의도가 의도인 만큼 배운 것을 복습하는데 집중했다.