코딩 테스트를 위한 소프트어(Softeer) 연습 문제 중 비밀 메뉴 문제를 풀어보고 리뷰해 본다.
연습 문제 - 비밀 메뉴
- 난이도 : level 2
- 정답률 : 54%
https://softeer.ai/practice/info.do?idx=1&eid=623&sw_prbl_sbms_sn=146427
문제 해설
비밀 메뉴가 존재한다. 비밀 메뉴의 패턴이 입력되고 사용자가 입력한 패턴이 입력된다. 사용자 입력 패턴 중에 비밀 메뉴의 패턴이 있는지 확인하고 있으면 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을 구분하는 것이 개수가 커졌을 때 최적화하는 포인트였고 조금 더 개선한다면 함수로 빼내어서 가독성 있게 처리하는 것이 좋을 것 같다.
반응형
'개발 > 자료구조, 알고리즘' 카테고리의 다른 글
[코딩 테스트] 소프티어(Softeer) 연습 문제 - 전광판 (0) | 2023.02.16 |
---|---|
[코딩 테스트] 소프티어(Softeer) 연습 문제 - 지도 자동 구축 (1) | 2023.02.15 |
[코딩 테스트] 소프티어(Softeer) 연습 문제 - GBC (0) | 2023.02.13 |
[코딩 테스트] 소프티어(Softeer) 연습 문제 - 근무 시간 (1) | 2023.02.10 |
[코딩 테스트] 소프티어(Softeer) 연습 문제 - 주행거리 비교하기 (0) | 2023.02.10 |