[Softeer] 비밀 메뉴(lv2) - C++

당고짱·2023년 3월 2일
0

coding-test

목록 보기
45/50
post-thumbnail
post-custom-banner

✏️ 문제

회사 식당에는 전설처럼 전해 내려오는 비밀 메뉴에 대한 소문이 있다. 소문의 내용은 대강 이러하다.

식권 자판기의 버튼을 특정 순서대로 누르고 결제를 하면, 평소와는 다른 색깔의 식권이 나온다.

이 식권을 배식대에 제출하면, 어떤 비밀 메뉴를 받을 수 있다는 것이다. 물론 이를 실제로 본 사람은 아무도 없어서, 어떤 메뉴가 나오는지는 커녕 눌러야 하는 버튼의 순서조차 알려져 있지 않다.

주방장인 당신은 이 소문의 실체를 알고 있다. 이는 분명한 사실이다!

정해진 버튼 조작법을 사용하면 비밀 메뉴의 식권을 얻을 수 있다. 그러나 얼마 전 식권 자판기가 고장으로 교체되면서, 새 자판기에서는 비밀 메뉴 조작법이 작동하지 않게 되었다.

당신은 프로그래밍 실력을 살려, 사용자의 버튼 조작 중 비밀 메뉴 조작법이 포함되어 있는지를 판단하는 회로를 추가하려 한다.

자판기에는 총 K개의 버튼이 있다. 각 버튼마다 1부터 K까지 번호가 붙어 있어서, 조작 과정은 1 이상 K 이하의 정수 여러 개로 나타낼 수 있다.

비밀 메뉴 조작법은 M개의 버튼 조작으로 이루어져 있으며, 이 순서대로 버튼을 누르면 반드시 비밀 메뉴 식권이 발매된다. 이때, 이 조작법 앞뒤로 다른 버튼 조작이 있어도 비밀 메뉴로 인정된다.

사용자가 누른 N개의 버튼 조작이 주어질 때, 사용자가 비밀 메뉴 식권을 받을 수 있는지를 확인하는 프로그램을 작성하여라.

⛔️ 제약조건

1 ≤ K ≤ 9
1 ≤ M ≤ 100
1 ≤ N ≤ 100
각 버튼의 번호는 1 이상 K 이하이다.

🎈 입력형식

첫째 줄에 M, N, K가 공백을 사이에 두고 주어진다.
둘째 줄에 비밀 메뉴 조작법을 나타내는 M개의 정수가 공백을 사이에 두고 주어진다. 각 정수는 1 이상 K 이하이다.
셋째 줄에 사용자의 버튼 조작을 나타내는 N개의 정수가 공백을 사이에 두고 주어진다. 각 정수는 1 이상 K 이하이다.

🎈 출력형식

사용자가 비밀 메뉴 식권을 받을 수 있다면 secret을, 그렇지 않다면 normal을 첫째 줄에 출력한다.

🎈 입출력 예

  • 입력
    3 10 5
    1 4 5
    3 3 1 2 4 1 4 5 1 4
  • 출력
    secret

👩‍💻 내 코드

이 문제는 sliding window 알고리즘과 거의 비슷하게 구현했다. while문 안에 반복문을 돌려서 시간 초과가 날까봐 걱정했는데 다행히 정답처리 되었다.

#include<iostream>

using namespace std;

int M, N, K;
int secret[101];
int button[101];
string answer = "normal";

int main(int argc, char** argv)
{
	cin >> M >> N >> K;

	for (int i = 0; i < M; i++) {
		cin >> secret[i];
	}

	for (int i = 0; i < N; i++) {
		cin >> button[i];	
	}

	if (M <= N) {
		int left = 0;
		while (left < N-M+1) {

			int flag = 0;
			for (int i = 0; i < M; i++) {
				if (secret[i] != button[left+i]) flag = 1;
			}

			if (flag == 0) {
				answer = "secret";
				break;
			}

			left++;
		}
	}

	cout << answer;

	return 0;
}
profile
초심 잃지 말기 🙂
post-custom-banner

0개의 댓글