Do Something

로봇이 움직이는 문제 본문

코딩 과제

로봇이 움직이는 문제

뭐라도해야겠다 2021. 1. 11. 15:37

 

2학기떄 재미있게(?) 했던 과제를 복기해보려고 한다.

1학년, 2학년 1학기때까지는 모든 시험을 당일치기로 봤을정도로 공부를 안해서 코딩관련해서는 남는게 없고...

군대에서 꼴에 시간낭비하기 싫어서 밤에 자유시간일떄 틈틈히 책을 봤었다.

내가 군대에서 손코딩으로 했던게 오렌지미디어 C, C++ 자료구조, 이 3권을 했었고, 딱 이 세개만 한 상태로 어렵다고 소문난 교수님 강의를 무작정 신청했다.

C받을 각오하고 그냥 신청함

엌ㅋㅋㅋ

 

이떄 내 머릿속에 남았던건 C++에서 class만들기, 그리고 나중에 내가 봤을떄 바로 알아볼수 있는 코드를 작성하자 두개였다. 그래서 모든 코딩을 C++로 하고 보기 좋은 코드를 만드는데 집중을 많이 했었던거 같다.

 

첫번쨰 문제는 로봇이 움직이는 문제

이런식으로 점의 개수가 주어지고,  아래 점의 좌표가 주어진다.

로봇은 1초에 한칸씩 간다. 

그리고 맨 마지막줄에 시간 t가 주어지는데 그 시간에 좌표를 구하면 되는 문제다.

 

 

일단 보자마자 든 생각은 이거다.

로봇을 하나 생성해서(점을 하나 잡아서) 실제로 1초씩 돌리면서 수행

 

로봇이 1개고, 점을따라가는 비교적 간단한 문제라고 생각을 했다. 

로봇이 2개,3개...이렇게 되어버리면 문제가 발생하겠지만말이다.

 

이떄는 이렇게 게시판에 적는게 아니라 A4지를 한묶음 사가지고 그냥 종이에다가 내 목표를 적으면서 공부했었다.

그 종이들 버리지 말고 남겨둘껄 조금 아깝다는 생각이 드넹.

 

1. 점을 이용해서 선분을 만들기

2. 그 선분을 따라 로봇을 진행시킴.

3.시간에 맞추어 로봇의 위치를 출력.

 

그러기 위해서는 좌표를 가지는 로봇을 하나 만들어야 했다. 

 

#include <iostream>
using namespace std;
class Point {
private:
    int x;
    int y;
public:
    Point(int x, int y) :x(x), y(y) {}
    Point() :x(0), y(0) {}
    int GetX()  { return x; }
    int GetY()  { return y; }
    void init() { cin >> x >> y; }
    void show() const { cout<<" "<< x <<"  "<< y <<endl; }
    }
};

 

그냥 class를 사용했다. 

C++을 그 전에 봐서인지 그냥 이게 익숙하더라구...

우선 좌표를 가지는 점을 만들었다. 

어차피 X를 반환하는거,Y를 반환하는게 다 필요할테니 간단한 함수들은 먼저 만들어두었다.

생성자도 일단 다 만들어 두고, show하는 함수도 어차피 필요할테니 출력형식에 맞춰 만든다.

 

1.점을 이용해서 선분을 만들기. 

2. 그 선분을 따라 로봇을 진행시킴.

 

이걸 해야하는데, 생각을 해보니 로봇은 이동을 할때 특정 x값이나 y값을 유지하면서 이동을 하는거다

대각선으로 이동하거나 하면 모르겠는데 단순하게 좌표의 선을 따라서 이동하고, 방향이 일정하고 뒤로가거나 앞으로 가거나 하지 않는다. 그래서 내가 내린 결론은 로봇이 가는 방향을 계속 바꿔주면 되겠는데? 였고 결과적으로 로봇의 현재값과 목표값을 받는 함수를 만들어서, 원하는 시간이 나올때까지 목표값을 갱신하면서 현재값을 바꿔주면 되는거다

 

함수(현재값, 목표값)

목표값은 배열[점개수] 로 만들고 현재값==목표값이 되면 목표값[++1]을 해주는거다

 

void loc(Point start, Point* v, int num, int t) {
    int i = 1;
    while (t > 0) {
            if (start.go(v[i])) {
            i++;if (i == num)i = 0;continue;
            }
        t--;
    }
    start.show();
}

 

실제 구현할떄는 시간이 0이되면 끝나도록 해두고, 시간을 입력받으면 그 시간이 될때까지 go함수를 돌리는것으로 마무리했다. v[i]는 점의 순서대로 만들어졌다.

go함수는 Point내부 public함수로 좌표 start와 v[i](향하는 값)을 비교해서 x나 y를 +해주거나 -시켜주는 간단한 함수다

 

첫번쨰 과제는 수월하게 했던거 같다. 이때 두번쨰 과제가 이거를 응용해서 나온다고 했던거 같아 최대한 원초적으로 구현하려고 했었다. 그냥 가는 방향으로 1초씩 하면 응용을 해도 비슷하게 풀 수 있을거 같았는데 큰 오산이였다.

'코딩 과제' 카테고리의 다른 글

로봇이 두대이상 움직인다  (0) 2021.01.13