```
백준 2947번 나무 조각 C++ 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 2947번 풀이
https://www.acmicpc.net/problem/2947
2947번: 나무 조각
첫째 줄에 조각에 쓰여 있는 수가 순서대로 주어진다. 숫자는 1보다 크거나 같고, 5보다 작거나 같으며, 중복되지 않는다. 처음 순서는 1, 2, 3, 4, 5가 아니다.
www.acmicpc.net
백준 2947번 나무조각은
난이도 브론즈 등급의 문제로서
2 3 4 5 1처럼 1부터 5까지의 숫자가 각 하나씩 중복되지 않게 주어질 때
아래와 같은 법칙으로 연산을 한다.
첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다.
이때 각 조각의 순서가 바뀔 때마다 조각의 순서를 출력하는 프로그램을 구하면 된다.
예시
입력
5 2 3 1 4
출력
2 5 3 1 4
2 3 5 1 4
2 3 1 5 4
2 3 1 4 5
2 1 3 4 5
1 2 3 4 5
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
cWoodenPiece 클래스를 만들고
유저 입력값을 받고
// 나뭇조각 번호를 입력 받는다
void userInputWoodenPiece()
{
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
for (int32_t i = 0; i < kLength; i++)
{
ss >> pieceArr[i];
}
}
각 번호를 돌면서 번호의 크기가 조건에 부합하면 바꿔주고
바꾸는 경우 출력도 해줍니다.
순서가 12345가 될 때까지 반복합니다.
void custom5StepProcess()
{
/* 첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
/* 두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
/* 세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
/* 네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
for (int32_t i = 1; i < kLength; i++)
{
if (pieceArr[i - 1] > pieceArr[i])
{
/* 위치를 바꾼다 */
std::swap(pieceArr[i - 1], pieceArr[i]);
/* 매 단계를 출력한다. */
printWoodenPieces();
}
}
/* 만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다. */
bool isInOrder = true;
for (int32_t i = 0; i < kLength; i++)
{
if (pieceArr[i] != (i + 1))
{
isInOrder = false;
break;
}
}
if (isInOrder == false)
{
custom5StepProcess();
}
}
전체 코드는 다음과 같습니다
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <array>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <regex>
#include <unordered_map>
class CWoodenPiece
{
private:
//나뭇조각 길이
const int32_t kLength = 5;
// 나뭇조각 번호 배열
std::array<int32_t, 5> pieceArr;
public:
CWoodenPiece()
{
pieceArr.fill(0);
}
~CWoodenPiece()
{
}
// 나뭇조각 번호를 입력 받는다
void userInputWoodenPiece()
{
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
for (int32_t i = 0; i < kLength; i++)
{
ss >> pieceArr[i];
}
}
// 나뭇조각 번호를 순서대로 출력한다
void printWoodenPieces()
{
for (int32_t i = 0; i < kLength; i++)
{
std:: cout<< pieceArr[i] << " ";
}
std::cout << "\n";
}
void custom5StepProcess()
{
/* 첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
/* 두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
/* 세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
/* 네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다. */
for (int32_t i = 1; i < kLength; i++)
{
if (pieceArr[i - 1] > pieceArr[i])
{
/* 위치를 바꾼다 */
std::swap(pieceArr[i - 1], pieceArr[i]);
/* 매 단계를 출력한다. */
printWoodenPieces();
}
}
/* 만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다. */
bool isInOrder = true;
for (int32_t i = 0; i < kLength; i++)
{
if (pieceArr[i] != (i + 1))
{
isInOrder = false;
break;
}
}
if (isInOrder == false)
{
custom5StepProcess();
}
}
};
int main()
{
// 입력 최적화
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
CWoodenPiece *cWoodenPiece = new CWoodenPiece();
cWoodenPiece->userInputWoodenPiece();
cWoodenPiece->custom5StepProcess();
delete cWoodenPiece;
}
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
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++ 알고리즘' 카테고리의 다른 글
| 백준 5800번 성적통계 C++ 구현해보기 (0) | 2021.10.11 |
|---|---|
| 백준 2502번 떡먹는 호랑이 C++ 구현해보기 (0) | 2021.10.07 |
| 백준 17300번 패턴 C++ 구현해보기 (0) | 2021.10.02 |
| 백준 2776번 암기왕 C++ 구현해보기 (0) | 2021.10.02 |
| 백준 17362번 수학은 체육과목입니다2 C++ 구현해보기 (0) | 2021.09.25 |