7 분 소요

SevenSeg 클래스 만들기

SevenSegment를 구현하는 클래스를 만드는 문제이다.

  ---
|     |
  ---
|     |
  ---

SevenSeg 클래스는 0부터 9만 구현을 하는 문제이고 SevenSegs 클래스는 모든 양의 정수를 구현하는 문제이다.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class SevenSeg
{
private:
    int n;
    char seg[15];
    void Set();

public:
    SevenSeg(int n);
    friend ostream &operator<<(ostream &os, SevenSeg &ss);
};
/* SevenSeg 정의 */
SevenSeg::SevenSeg(int n)
{
    this->n = n;
    Set();
}
void SevenSeg::Set()
{
    // 숫자를 이쁘게 만들어주기 위한 빈 공간
    seg[0] = ' ';
    seg[2] = ' ';
    seg[4] = ' ';
    seg[6] = ' ';
    seg[8] = ' ';
    seg[10] = ' ';
    seg[12] = ' ';
    seg[14] = ' ';

    if (n == 0 || n == 2 || n == 3 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9)
        seg[1] = '-';
    else
        seg[1] = ' ';

    if (n == 0 || n == 4 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9)
        seg[3] = '|';
    else
        seg[3] = ' ';

    if (n == 0 || n == 1 || n == 2 || n == 3 || n == 4 || n == 7 || n == 8 || n == 9)
        seg[5] = '|';
    else
        seg[5] = ' ';

    if (n == 2 || n == 3 || n == 4 || n == 5 || n == 6 || n == 8 || n == 9)
        seg[7] = '-';
    else
        seg[7] = ' ';

    if (n == 0 || n == 2 || n == 6 || n == 8)
        seg[9] = '|';
    else
        seg[9] = ' ';

    if (n == 0 || n == 1 || n == 3 || n == 4 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9)
        seg[11] = '|';
    else
        seg[11] = ' ';

    if (n == 0 || n == 2 || n == 3 || n == 5 || n == 6 || n == 8)
        seg[13] = '-';
    else
        seg[13] = ' ';
}
ostream &
operator<<(ostream &os, SevenSeg &ss)
{
    // for (int i = 0; i < 15; i++)
    // {
    //     if (i % 3 == 0)
    //     {
    //         os << endl;
    //     }
    //     os << ss.seg[i];
    // }
    int k = 0;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            os << ss.seg[k++];
        }
        os << endl;
    }
    return os;
}
int main()
{
    int n;
    cin >> n;
    SevenSeg s(n);
    cout << s;
}

main

int main()
{
    int n;
    cin >> n;
    SevenSeg s(n);
    cout << s;
}

SevenSegs 클래스 만들기

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class SevenSegs;
class SevenSeg
{
private:
    int n;
    char seg[15];
    void Set();

public:
    SevenSeg(int n);
    friend ostream &operator<<(ostream &os, SevenSeg &ss);
    friend ostream &operator<<(ostream &os, SevenSegs &ss);
};
class SevenSegs
{
private:
    int n;
    vector<SevenSeg> segs;
    void Set();

public:
    SevenSegs(int n);
    friend ostream &operator<<(ostream &os, SevenSegs &ss);
};
/* SevenSeg 정의 */
SevenSeg::SevenSeg(int n)
{
    this->n = n;
    Set();
}
void SevenSeg::Set()
{
    // 숫자를 이쁘게 만들어주기 위한 빈 공간
    seg[0] = ' ';
    seg[2] = ' ';
    seg[4] = ' ';
    seg[6] = ' ';
    seg[8] = ' ';
    seg[10] = ' ';
    seg[12] = ' ';
    seg[14] = ' ';

    if (n == 0 || n == 2 || n == 3 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9)
        seg[1] = '-';
    else
        seg[1] = ' ';

    if (n == 0 || n == 4 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9)
        seg[3] = '|';
    else
        seg[3] = ' ';

    if (n == 0 || n == 1 || n == 2 || n == 3 || n == 4 || n == 7 || n == 8 || n == 9)
        seg[5] = '|';
    else
        seg[5] = ' ';

    if (n == 2 || n == 3 || n == 4 || n == 5 || n == 6 || n == 8 || n == 9)
        seg[7] = '-';
    else
        seg[7] = ' ';

    if (n == 0 || n == 2 || n == 6 || n == 8)
        seg[9] = '|';
    else
        seg[9] = ' ';

    if (n == 0 || n == 1 || n == 3 || n == 4 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9)
        seg[11] = '|';
    else
        seg[11] = ' ';

    if (n == 0 || n == 2 || n == 3 || n == 5 || n == 6 || n == 8)
        seg[13] = '-';
    else
        seg[13] = ' ';
}
ostream &
operator<<(ostream &os, SevenSeg &ss)
{
    // for (int i = 0; i < 15; i++)
    // {
    //     if (i % 3 == 0)
    //     {
    //         os << endl;
    //     }
    //     os << ss.seg[i];
    // }
    int k = 0;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            os << ss.seg[k++];
        }
        os << endl;
    }
    return os;
}
/* SevenSegs 정의 */
SevenSegs::SevenSegs(int n)
{
    this->n = n;
    Set();
}
void SevenSegs::Set()
{
    for (int k = n; k > 0; k /= 10)
    {
        SevenSeg temp(k % 10);
        segs.push_back(temp);
    }
}
ostream &
operator<<(ostream &os, SevenSegs &ss)
{
    int k = 0;

    for (int i = 0; i < 5; i++)
    {
        for (int j = ss.segs.size() - 1; j >= 0; j--)
        {

            for (int l = 0; l < 3; l++)
            {

                os << ss.segs[j].seg[k + l];
            }
        }
        k += 3;
        os << endl;
    }
    return os;
}
int main()
{
    int k;
    cin >> k;
    SevenSegs ss(k);
    cout << ss;
}

🌟 SevenSeg 클래스를 elem을 가지고 있는 segs 벡터를 출력하는 과정 잘보기 !

main

int main()
{
    int k;
    cin >> k;
    SevenSegs ss(k);
    cout << ss;
}

Puzzle

0의 위치를 입력 받은 u, d, r, l대로 이동을 하다가

1 2 3
4 5 6
7 8 0

이 되면 코드를 종료시키는 문제이다.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
/* for rand() */
#include <stdlib.h> /* srand, rand */
#include <time.h>   /* time */

using namespace std;

class notMovable
{
};
class Puzzle
{
private:
    int cell[9];
    int x, y;
    void shuffle();
    int convert(int x, int y); // 2차원을 1차원으로 바꾸어주는 함수

public:
    Puzzle();
    void move(char c);
    bool isDone();
    friend ostream &operator<<(ostream &os, Puzzle &pz);
};

/* Puzzle 정의 */
Puzzle::Puzzle()
{
    for (int i = 0; i < 8; i++)
    {
        cell[i] = i + 1;
    }
    cell[8] = 0;
    x = 2;
    y = 2;
    shuffle();
}
// cell이 초기화될 때, 0의 위치를 랜덤으로 놓는 함수.
void Puzzle::shuffle()
{
    srand(time(NULL));
    int rn;
    for (int i = 0; i < 4; i++)
    {
        rn = rand() % 4;
        try
        {
            switch (rn)
            {
            case 0:
                move('u');
                break;
            case 1:
                move('d');
                break;
            case 2:
                move('l');
                break;
            case 3:
                move('r');
                break;
            }
        }
        catch (notMovable &e)
        {
        }
    }
}
// 2차원 좌표를 1차원 좌표로 바꾸어주는 함수
int Puzzle::convert(int x, int y)
{
    return 3 * y + x;
}
// 이동
void Puzzle::move(char c)
{
    int to, from;
    switch (c)
    {
    case 'u':
        if (y == 0)
            throw notMovable();
        to = convert(x, y - 1);
        from = convert(x, y);
        cell[from] = cell[to];
        cell[to] = 0;
        y--;
        break;

    case 'd':
        if (y == 2)
            throw notMovable();
        to = convert(x, y + 1);
        from = convert(x, y);
        cell[from] = cell[to];
        cell[to] = 0;
        y++;
        break;
    case 'r':
        if (x == 2)
            throw notMovable();
        to = convert(x + 1, y);
        from = convert(x, y);
        cell[from] = cell[to];
        cell[to] = 0;
        x++;
        break;
    case 'l':
        if (x == 0)
            throw notMovable();
        to = convert(x - 1, y);
        from = convert(x, y);
        cell[from] = cell[to];
        cell[to] = 0;
        x--;
        break;
    default:
        throw notMovable();
    }
}
// (2, 2)자리에 0이 오면 Done을 한다.
bool Puzzle::isDone()
{
    for (int i = 0; i < 8; i++)
    {
        if (cell[i] != i + 1)
        {
            return false;
        }
    }
    if (cell[8] = 0)
        return false;

    return true;
}
ostream &operator<<(ostream &os, Puzzle &pz)
{
    int k = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            os << pz.cell[k++] << ' ';
        }
        os << endl;
    }
    return os;
}
int main()
{
    Puzzle mypuzzle;
    cout << mypuzzle;
    while (!(mypuzzle.isDone()))
    {
        char c;
        cout << "Choice movement: ";
        cin >> c;
        try
        {
            mypuzzle.move(c);
            cout << mypuzzle;
        }
        catch (notMovable &e)
        {
        }
    }
    cout << "It's done" << endl;
}

댓글남기기