```
백준15828번 라우터(Router) C++로 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 15828번 풀이
- 간단한 라우터 정의
https://www.acmicpc.net/problem/15828
15828번: Router
인터넷을 사용하기 위해서는 컴퓨터에 인터넷 회선을 연결하거나 Wi-Fi를 연결해야 한다. 이렇게 연결된 네트워크를 통해 컴퓨터에는 통신이 가능하다. 마음에 드는 노래나 동영상이 있는 곳에
www.acmicpc.net
백준 15828번 나는 라우터는
난이도 쉬움 등급의 문제입니다.
문제를 풀기전에 간단한 라우터의 정의부터 하겠습니다.
Route가 영어로 길이라는 뜻입니다.
Router는 영어 말 그대로 길(경로)와 관계된 장치입니다.
간단하게설명하면 패킷(정보 데이터)의 위치에 대한 최적의 경로를 지정해주고
그 경로에 따라서 패킷을 다음 장치로 연결해주는 장치입니다.
자 그럼~
30분 정도 위에 링크를 방문하셔서 풀어보시고
안풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
일단 해당 문제는 라우터에 대한 이야기를 하지만 실질적으로는
라우터 내부의 버퍼를 이야기합니다.
임의의 숫자를 받고
-1인 경우 종료
0인 경우 내부에 숫자 제거
그외의 숫자의 경우 내부에 더해주고
최종적으로 남은 숫자를 출력해주면 되는 문제입니다.
저는 CMyRouter 라는 클래스를 선언하고
class CMyRouter
{
private:
vector<int> RouterBuffer;
int RouterMaxSize;
int RouterCurrentSize;
public:
CMyRouter(const int arraySize)
{
RouterMaxSize = arraySize;
RouterCurrentSize = 0;
}
~CMyRouter()
{
RouterBuffer.clear();
}
int getRouterCurrentSize()
{
return this->RouterCurrentSize;
}
int getRouterMaxSize()
{
return this->RouterMaxSize;
}
int getPeekRouterBufferAt(const int position)
{
return this->RouterBuffer.at(position);
}
void popFirst() {
RouterCurrentSize--;
RouterBuffer.erase(RouterBuffer.begin());
}
void pushLast(const int packetVal) {
RouterCurrentSize++;
RouterBuffer.push_back(packetVal);
}
void printArray() {
for (int i = 0; i < RouterCurrentSize; i++) {
cout << RouterBuffer.at(i) << endl;
}
}
};
메인에서 절차 지향적으로 설명해보겠습니다.
일단 라우터 사이즈를 입력 받습니다.
int routerSize;
cin >> routerSize;
데이터를 다룰 인스턴스 선언을 해줍니다.
CMyRouter* cMyRouter = new CMyRouter(routerSize);
while 문을 돌려서
입력받은 정수가 -1이면 종료
0 이고 라우터 사이즈가 0이 아니라면 라우터 벡터에서 첫번째 값을 제거
0 이 아니고 라우터 사이즈가 최대가 아니라면 라우터에 값을 마지막에 추가 해주었고
while (true)
{
int packetVal;
//cin >> packetVal;
scanf("%d", &packetVal);
if (packetVal == -1)
{
break;
}
else
{
if (packetVal==0)
{
if (cMyRouter->getRouterCurrentSize() != 0)
{
cMyRouter->popFirst();
}
}
else
{
if (cMyRouter->getRouterCurrentSize() != cMyRouter->getRouterMaxSize())
{
cMyRouter->pushLast(packetVal);
}
}
}
}
While문 밖에서
객체 내부에 아무 값도 없다면 empty를 출력해주고
객체 내부에 값이 있다면
값들을 하나씩 출력해 주었습니다.
if (cMyRouter->getRouterCurrentSize() == 0)
{
cout << "empty";
}
else
{
for (int i = 0; i < cMyRouter->getRouterCurrentSize(); i++)
{
//cout << cMyRouter->getPeekRouterBufferAt(i) << endl;
printf("%d\n", cMyRouter->getPeekRouterBufferAt(i));
}
}
전체 코드는 다음과 같습니다
#include <iostream>
#include <vector>
using namespace std;
#pragma warning(disable : 4996)
//https://www.acmicpc.net/problem/15828
class CMyRouter
{
private:
vector<int> RouterBuffer;
int RouterMaxSize;
int RouterCurrentSize;
public:
CMyRouter(const int arraySize)
{
RouterMaxSize = arraySize;
RouterCurrentSize = 0;
}
~CMyRouter()
{
RouterBuffer.clear();
}
int getRouterCurrentSize()
{
return this->RouterCurrentSize;
}
int getRouterMaxSize()
{
return this->RouterMaxSize;
}
int getPeekRouterBufferAt(const int position)
{
return this->RouterBuffer.at(position);
}
void popFirst() {
RouterCurrentSize--;
RouterBuffer.erase(RouterBuffer.begin());
}
void pushLast(const int packetVal) {
RouterCurrentSize++;
RouterBuffer.push_back(packetVal);
}
void printArray() {
for (int i = 0; i < RouterCurrentSize; i++) {
cout << RouterBuffer.at(i) << endl;
}
}
};
int main()
{
int routerSize;
cin >> routerSize;
CMyRouter* cMyRouter = new CMyRouter(routerSize);
while (true)
{
int packetVal;
//cin >> packetVal;
scanf("%d", &packetVal);
if (packetVal == -1)
{
break;
}
else
{
if (packetVal==0)
{
if (cMyRouter->getRouterCurrentSize() != 0)
{
cMyRouter->popFirst();
}
}
else
{
if (cMyRouter->getRouterCurrentSize() != cMyRouter->getRouterMaxSize())
{
cMyRouter->pushLast(packetVal);
}
}
}
}
if (cMyRouter->getRouterCurrentSize() == 0)
{
cout << "empty";
}
else
{
for (int i = 0; i < cMyRouter->getRouterCurrentSize(); i++)
{
//cout << cMyRouter->getPeekRouterBufferAt(i) << endl;
printf("%d\n", cMyRouter->getPeekRouterBufferAt(i));
}
}
return 0;
}
입력
5
1
2
0
3
4
0
5
6
0
0
-1
결과
5 6
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩하시길 바랍니다 ~ :)
참조 및 인용
C++ Primer
Introduction to Algorithms
https://codemasterkimc.tistory.com/35
C++ 이론을 배울수 있는 곳 정리
개요 C++을 배우는 책, 강의, 블로그, 링크 등을 공유합니다. (링크 및 간략한 설명을 하였으나 만약 원작자가 링크를 거는것을 원치 않을 경우 연락주시기 바랍니다.) 서적 https://www.amazon.com/Prime
codemasterkimc.tistory.com
https://codemasterkimc.tistory.com/50
300년차 개발자의 좋은 코드 5계명 (Clean Code)
이번 글을 통해 배워갈 내용 좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋
codemasterkimc.tistory.com
'C++ > C++ 알고리즘' 카테고리의 다른 글
| 백준1620번 나는야 포켓몬 마스터 이다솜 구현해보기 (0) | 2021.08.23 |
|---|---|
| 백준1547번 공 C++로 구현해보기 (0) | 2021.08.22 |
| 백준2667번 단지번호 붙이기 C++로 구현해보기 (1) | 2021.07.05 |
| 백준1919번 애너그램 만들기(Anagram) C++로 구현해보기 (1) | 2021.07.03 |
| 백준 2953번 나는 요리사다 C++로 간단하게 풀기 (1) | 2021.07.01 |