728x90
https://softeer.ai/practice/6269
투포인터로 풀려고 했는데, string -> contain(c++에서는find)를 이용하면 더 간단하게 풀이가 가능했다!
* 투포인터 주의할점
반복문 안에서 처리할 때, 제일 마지막 인덱스는 처리가 안될 수 있다.
=> 반복문 밖에서 한번 더 확인해줄 필요가 있음!
[틀린답안]
#include<iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
int m, n, k;
cin >> m >> n >> k;
vector<int> secret_menu;
for(int i = 0; i<m; i++){
int temp;
cin >> temp;
secret_menu.push_back(temp);
}
vector<int> userinput;
for(int i = 0; i<n; i++){
int temp;
cin >> temp;
userinput.push_back(temp);
}
if(n < m){
cout << "normal";
return 0;
}
int j = 0;
for(int i = 0; i<n; i++){
if(j == m){
cout << "secret";
return 0;
}
if(userinput[i] == secret_menu[j]){
j++;
}else{
j = 0;
if(userinput[i] == secret_menu[0]){
j = 1;
}
}
}
cout << "normal";
return 0;
}
[수정된 답안] - 근데 틀림
#include<iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
int m, n, k;
cin >> m >> n >> k;
vector<int> secret_menu;
for(int i = 0; i<m; i++){
int temp;
cin >> temp;
secret_menu.push_back(temp);
}
vector<int> userinput;
for(int i = 0; i<n; i++){
int temp;
cin >> temp;
userinput.push_back(temp);
}
if(n < m){
cout << "normal";
return 0;
}
int j = 0;
for(int i = 0; i<n; i++){
if(j == m){
cout << "secret";
return 0;
}
if(userinput[i] == secret_menu[j]){
j++;
}else{
j = 0;
if(userinput[i] == secret_menu[0]){
j = 1;
}
}
}
if(j == m){
cout << "secret";
return 0;
}
cout << "normal";
return 0;
}
수정했지만, 33-3 테스트케이스를 통과하지 못한다.
9 6 9
234235
234234235
이런 테스트 케이스를 생각해 봤을 때,
234[234235] 이부분에 비밀메뉴가 코드가 있으므로, secret이 출력되어야 한다.
하지만,, 내가 작성한 코드는 이부분을 처리해주지 못한다!
(23423까지 증가하다가. 4에서 다시 0으로 초기화됨)
그러니까 for 한개로 해결할게 아니라 for 두개를 사용해야 한다.
[수정된 코드] - 이중 for
#include<iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
int m, n, k;
cin >> m >> n >> k;
vector<int> secret_menu;
for(int i = 0; i<m; i++){
int temp;
cin >> temp;
secret_menu.push_back(temp);
}
vector<int> userinput;
for(int i = 0; i<n; i++){
int temp;
cin >> temp;
userinput.push_back(temp);
}
if(n < m){
cout << "normal";
return 0;
}
for(int i = 0; i<(n-m+1); i++){
bool flag = true;
for(int j = 0; j<m; j++){
if(secret_menu[j] != userinput[i+j]){
flag = false;
break;
}
}
if(flag){
cout << "secret";
return 0;
}
}
cout << "normal";
return 0;
}
가장 간단한 방법은, secret code와 userinput을 string으로 처리하는것이다
=> userinput에 secret code가 포함되어 있으면 secret이다.
c++ 에서는 find 함수의 인자로 string을 넣어주면 포함되는지 아닌지 알 수 있다.
포함되면 포함되는 부분의 포인터
포함되지 않으면, npos를 리턴
#include<iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char** argv)
{
int m, n, k;
cin >> m >> n >> k;
string secret_menu;
for(int i = 0; i<m; i++){
int temp;
cin >> temp;
secret_menu.push_back(temp);
}
string userinput;
for(int i = 0; i<n; i++){
int temp;
cin >> temp;
userinput.push_back(temp);
}
if(n < m){
cout << "normal";
return 0;
}
if(userinput.find(secret_menu)!=string::npos){
cout << "secret";
}else{
cout << "normal";
}
return 0;
}
728x90
'코테준비 > 하루한개도전~' 카테고리의 다른 글
softeer : 마이크로서버 (2) | 2024.09.11 |
---|---|
백준 : 2805 - 나무 자르기 (2) | 2024.09.07 |
프로그래머스 : 불량 사용자 (0) | 2024.09.02 |
프로그래머스 : 스티커 모으기(2) (0) | 2024.08.30 |
프로그래머스 : 해시 - 베스트앨범 (0) | 2024.08.30 |