개발/자료구조, 알고리즘

[코딩 테스트] 소프티어(Softeer) 연습 문제 - 비밀 메뉴

growing-dev 2023. 2. 14. 22:25

코딩 테스트를 위한 소프트어(Softeer) 연습 문제 중 비밀 메뉴 문제를 풀어보고 리뷰해 본다.

 

연습 문제 - 비밀 메뉴

  • 난이도 : level 2
  • 정답률 : 54%

https://softeer.ai/practice/info.do?idx=1&eid=623&sw_prbl_sbms_sn=146427 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

문제 해설

비밀 메뉴가 존재한다. 비밀 메뉴의 패턴이 입력되고 사용자가 입력한 패턴이 입력된다. 사용자 입력 패턴 중에 비밀 메뉴의 패턴이 있는지 확인하고 있으면 secret을 아니면 normal을 출력하는 문제이다.

즉 두 세트의 배열이 존재하고 두 배열이 매칭이 되는 부분이 있는지 찾는 문제이다. 얼핏 보면 간단하지만 2개의 for 문을 index를 잘 설정하면서 조건에 맞게 찾아가는 게 중요하다. 나는 간단히 배열 2개를 선언하고 2중 for문을 돌면서 조건에 맞으면 break 하도록 구현했다.

 

제약조건

1 ≤ K ≤ 9

1 ≤ M ≤ 100

1 ≤ N ≤ 100

각 버튼의 번호는 1 이상 K 이하이다.


 

입력

3 10 5
1 4 5
3 3 1 2 4 1 4 5 1 4

 

출력

secret
 

위 예제에서 비밀 메뉴 1 4 5의 패턴이 아래 유저 입력 중에 3 3 1 2 4 <1 4 5> 1 4 속해 있으므로 secret이 출력되었다.

 

코드

#include<iostream>
#include<string>

using namespace std;
#define MAX_N 100
#define MAX_M 100
#define MAK_K 9
int secret[MAX_M];
int input[MAX_N];

bool match(int i, int m) {
	int k = 0;
	for (k = 0; k < m; k++) {
		if (secret[k] != input[i + k]) break;
	}
	if (k == m) return true;
	else return false;

}
int main(int argc, char** argv)
{
	int K, N, M;
	string s = "secret";
	string n = "normal";
	string result = n;
	

	cin >> M >> N >> K;
	for (int i = 0; i < M; i++) {
		cin >> secret[i];
	}
	for (int i = 0; i < N; i++) {
		cin >> input[i];
	}
	if (M <= N) {
		for (int i = 0; i < N; i++) {
			int k = 0;
			bool test = true;
			for (int j = i; j < i + M; j++) {
				if (secret[k] != input[j]) {
					test = false;
					break;
				}
				k++;
			}
			if (test) {
				result = s;
				break;
			}
		}
	}


	cout << result;


	return 0;
}

 

결론

조금 쉽게 생각해서 함수를 사용하는 다른 방식으로 구현했다가 결국 index나 결과 처리하는 부분이 헷갈려서 2중 for문으로 한눈에 처리할 수 있도록 구현했다. 처음부터 M과 N을 구분하는 것이 개수가 커졌을 때 최적화하는 포인트였고 조금 더 개선한다면 함수로 빼내어서 가독성 있게 처리하는 것이 좋을 것 같다.

반응형