```
백준 17300번 패턴 C++ 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 17300번 풀이
https://www.acmicpc.net/problem/17300
17300번: 패턴
안드로이드 OS에는 휴대폰의 잠금을 풀기 위한 방법 중 패턴을 암호로 사용하는 방법이 있다. 3×3의 9개 점에 번호를 매겨 그중 일부로 하나의 수열을 만들었을 때, 수열에서 인접한 번호의 점을
www.acmicpc.net
백준 17300번 패턴은
난이도 실버 등급의 문제로서
1 2 3
4 5 6
7 8 9
처럼 생긴 잠금장치가 주어질 때
1. 이미 누른 버튼을 누르면 안 되고
2. 버튼을 3번 이상 눌러야 하고
3. 누르는 버튼 중간에 숫자가 있는 경우 정중앙을 지날 경우 이미 누른 숫자여야 한다.
예를 들어 1을 누르고 2,4,5,6,7,8을 누르면 중간에 숫자가 없지만
3,7,9는 중간에 2,4,5가 있기 때문에 해당수를 이전에 방문했어야 넘어갈 수 있다.
숫자 입력 후
위에 3가지 조건을 충족하지 못하면
NO
충족하면
YES를
출력하는 문제이다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
입력을 받고
각 숫자별로
전에 입력받은 값, 현재 입력받은 값을 넣어서
방문한 값이면 실패
방문하지 않은 값일 경우
숫자의 위치에 따라서
중간에 숫자가 있는지,
있다면 방문했는지 여부에 따라서
판정을 하는 프로그램을 작성하여서 해결했다
전체 코드는 다음과 같습니다
#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 CPatternChecker
{
private:
std::array<bool, 10>visitedNum;
int32_t prevNum;
bool isValid;
public:
CPatternChecker()
{
prevNum = 0;
visitedNum.fill(false);
isValid = true;
}
~CPatternChecker()
{
}
void setPrevNum(const int32_t curNum)
{
prevNum = curNum;
}
void setVisitedNumAtIdx(const int32_t curNum)
{
visitedNum[curNum] = true;
}
bool getIsValid()
{
return isValid;
}
void checkPattern(const int32_t curNum)
{
bool retBool = true;
if (visitedNum[curNum] == true)
{
retBool = false;
}
else
{
switch (prevNum)
{
case 1:
{
// 2, 4, 5, 6, 8
// 3, 7, 9
if (curNum == 3 && visitedNum[2] == false)
{
retBool = false;
}
else if (curNum == 7 && visitedNum[4] == false)
{
retBool = false;
}
else if (curNum == 9 && visitedNum[5] == false)
{
retBool = false;
}
break;
}
case 3:
{
// 2, 4, 5, 6, 8
// 1, 7, 9
if (curNum == 1 && visitedNum[2] == false)
{
retBool = false;
}
else if (curNum == 7 && visitedNum[5] == false)
{
retBool = false;
}
else if (curNum == 9 && visitedNum[6] == false)
{
retBool = false;
}
break;
}
case 7:
{
// 2, 4, 5, 6, 8
// 1, 3, 9
if (curNum == 1 && visitedNum[4] == false)
{
retBool = false;
}
else if (curNum == 3 && visitedNum[5] == false)
{
retBool = false;
}
else if (curNum == 9 && visitedNum[8] == false)
{
retBool = false;
}
break;
}
case 9:
{
// 2, 4, 5, 6, 8
// 1, 3, 7
if (curNum == 1 && visitedNum[5] == false)
{
retBool = false;
}
else if (curNum == 7 && visitedNum[8] == false)
{
retBool = false;
}
else if (curNum == 3 && visitedNum[6] == false)
{
retBool = false;
}
break;
}
case 2:
{
// 8
if (curNum == 8 && visitedNum[5] == false)
{
retBool = false;
}
break;
}
case 4:
{
// 6
if (curNum == 6 && visitedNum[5] == false)
{
retBool = false;
}
break;
}
case 6:
{
// 4
if (curNum == 4 && visitedNum[5] == false)
{
retBool = false;
}
break;
}
case 8:
{
// 2
if (curNum == 2 && visitedNum[5] == false)
{
retBool = false;
}
break;
}
case 5:
default:
break;
}
visitedNum[curNum] = true;
prevNum = curNum;
}
isValid = retBool;
}
};
int main()
{
// 입력 최적화
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
std::string inputStr;
std::getline(std::cin, inputStr);
const int32_t kTotalNumber = std::stoi(inputStr);
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
CPatternChecker* cPatternChecker = new CPatternChecker();
int32_t tempNum;
ss >> tempNum;
cPatternChecker->setPrevNum(tempNum);
cPatternChecker->setVisitedNumAtIdx(tempNum);
for (int32_t i = 1; i < kTotalNumber; i++)
{
ss >> tempNum;
cPatternChecker->checkPattern(tempNum);
if (cPatternChecker->getIsValid() == false)
{
break;
}
}
std::cout << (cPatternChecker->getIsValid() ? "YES" : "NO");
}
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
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++ 알고리즘' 카테고리의 다른 글
| 백준 2502번 떡먹는 호랑이 C++ 구현해보기 (0) | 2021.10.07 |
|---|---|
| 백준 2947번 나무조각 C++ 구현해보기 (1) | 2021.10.04 |
| 백준 2776번 암기왕 C++ 구현해보기 (0) | 2021.10.02 |
| 백준 17362번 수학은 체육과목입니다2 C++ 구현해보기 (0) | 2021.09.25 |
| 백준 15624번 피보나치 수 7 C++ 구현해보기 (0) | 2021.09.25 |