14.2주차
문제
L, U, D, R 이 주어지는데 이동을 하다가 겹치지 않는 거리를 구하시오.
풀이……….미쳤어
- MyGame 클래스 : (0, 0)에서 시작하고, move를 담당
- Path 클래스 : 이동한 두 점을 정의하고, == 에 대한 오퍼레이터 오버로딩이 있다.
- PathQue 클래스 : 이동한 거리를 저장하는 큐 클래스. 여기서 겹치는지 아닌지 확인
뭔가 코드를 하나하나 뜯어보면 그렇게 어렵지는 않은데 진짜 코드가 진심 너무 이쁨 ❣️ 와,,,,,, 어떻게 이렇게 코드를 짜지?
클래스 별로 뜯어 보기
MyGame
class OutOfBound
{
};
/* MyGame 선언 */
class MyGame
{
int x, y;
PathQue myque;
void move(char c);
public:
MyGame();
void move(string &commands);
int getX();
int getY();
int getCount();
};
/* MyGame 정의 */
MyGame::MyGame()
{
x = 0;
y = 0;
}
void MyGame::move(char c)
{
switch (c)
{
case 'U':
if (y == 5)
throw OutOfBound();
else
{
y++;
break;
}
case 'D':
if (y == -5)
throw OutOfBound();
else
{
y--;
break;
}
case 'R':
if (x == 5)
throw OutOfBound();
else
{
x++;
break;
}
case 'L':
if (x == -5)
throw OutOfBound();
else
{
x--;
break;
}
}
}
void MyGame::move(string &commands)
{
for (int i = 0; i < commands.size(); i++)
{
try
{
int preX = x;
int preY = y;
move(commands[i]);
Path temp(preX, preY, x, y);
myque.push(temp);
}
catch (const OutOfBound &e) // 프로그램이 죽는거 방지용
{
}
}
}
int MyGame::getCount()
{
return myque.count();
}
int MyGame::getX()
{
return x;
}
int MyGame::getY()
{
return y;
}
범위를 제한하고 싶을 때에는 조건문을 통해서 제한하지 말고 try, catch를 사용하자…..
Path
class Path
{
int x1, y1, x2, y2;
public:
Path(int xx1, int yy1, int xx2, int yy2);
friend bool operator==(Path &a, Path &b);
};
/* Path 정의 */
Path::Path(int xx1, int yy1, int xx2, int yy2)
{
x1 = xx1;
y1 = yy1;
x2 = xx2;
y2 = yy2;
}
bool operator==(Path &a, Path &b)
{
if ((a.x1 == b.x1) && (a.y1 == b.y1) && (a.x2 == b.x2) && (a.y2 == b.y2))
return true;
if ((a.x1 == b.x2) && (a.y1 == b.y2) && (a.x2 == b.x1) && (a.y2 == b.y1))
return true;
return false;
}
PathQue
class PathQue
{
vector<Path> paths;
bool isIn(Path &a);
public:
void push(Path &a);
int count();
};
/* PathQue 정의 */
bool PathQue::isIn(Path &a)
{
for (int i = 0; i < paths.size(); i++)
{
if (paths[i] == a)
{
return true;
}
return false;
}
}
int PathQue::count()
{
cout << "paths.size(): " << paths.size() << endl;
return paths.size();
}
void PathQue::push(Path &a)
{
if (!isIn(a))
{
paths.push_back(a);
}
}
키야,,,,, ❤️ 너무 이쁘다… 뭔가 하나하나 쪼개보면 다할 수 있는데, 이거를 어떻게 생각하신 건지,,,,여윽시 👍
main
int main()
{
MyGame game;
string commands = "ULURRDLLU"; //"LULLLLLLU" "ULURRDLLU"
game.move(commands);
cout << "(" << game.getX() << ", " << game.getY() << ") -> " << game.getCount() << endl;
Path path1(1, 2, 3, 4);
Path path2(3, 4, 1, 2);
Path path3(1, 2, 5, 6);
// cout << (path1 == path2) << endl; // operator overloading 함수 정의 확인
PathQue myque;
myque.push(path1);
myque.push(path2);
myque.push(path3);
cout << myque.count() << endl;
}
수업 마무리
c++ 이 나온 이유 : 하드웨어에 비해서 소프트웨어의 발전 속도가 너무 초라해 생산성이 너무 떨어져 이거를 개선해야겠다. 캡슐화, 다형성, 상속을 통해서 개선하였다.
캡슐화를 통해서 모듈화를 하였다. 그 내부는 나도 몰라. 모듈화는 코드 구현의 의존도를 끊어준다. 그럼으로써 재사용성 업그레이드의 용이성을 향상하였다.
다형성 매번 달라지는 함수 기능의 이름을 같게 된다. == 같은 경우 path 두 개가 같은가 == 사용하면된다. 아 이거 함수 이름 머써야되지? 이럴 필요가 없다. 내가 기억해야되는 이름이 훨씬 줄어들고 프로그래밍에 사용해야되는 단어가 줄어든다. 외워야될 단어가 줄어들고 그때그때 구현만 조금씩 달라져서 생산성을 높인다.
상속 -> 기본의 코드에서 바뀌지 않아아 될 코드는 그대로 재활용 가능. 내가 바꾸어야 되는 부분만 추가해야되는 부분만 콕 찝어서 추가가 가능 중복 코딩의 최소화. -> 복붙은 어느 한 군데가 바뀌면 다 찾아가면서 다시 바꾸어야 된다. 그게 매우 비효율적이고 오류를 일으킬 가능성이 크다. 그런 일들이 벌어진다. 코드 재사용을 체계화. 소스 코드 없이도 제사용 가능.
클래스를 써서 어떻게 캡슐화 하고 어떻게 상속을 하고 어떻게 다형성을 구현하는지에 대해서 기본적인 방향성을 가져야된다. 이제 출발점을 가진 것이다. 가장 기초적으로 알아야될 기초지식을 얻은 것이다. 이게 진짜 실력이 되려면 경험이 쌓여야 된다. 그래야 수업시간에 배운게 우리것이 된다. 숙제, 동아리, 학부 연구원……..을 통해서 경험을 쌓자! 아자자!
댓글남기기