관리 메뉴

cococo-coding

2857번. FBI (c++풀이) 본문

[BOJ] 코드 모음/C++_learning 문제집

2857번. FBI (c++풀이)

_dani 2024. 1. 7. 16:35

문제

 

최종 코드

#include <iostream>
using namespace std;

/*
1. 5명의 FBI 요원 첩보원명을 입력받는다.
2. 첩보원명에 FBI가 있는 요원을 찾는다.
3. 해당 요원들의 순서를 출력한다.
(없을 경우 'HE GOT AWAY!' 출력)
*/

int main() {
    int fbi=0;
    int cnt=5;
    
    for(int j=1; j<=5; j++){
        //1
        
        string name;
        cin >> name;

        //2
        for(int i=0; i<name.size()-2; i++){
            if(name[i]=='F' && name[i+1]=='B' && name[i+2]=='I'){
                cout << j << " ";
                fbi++;
                break; //FBIFBI 같은 케이스 예외처리하기 위함
        }
        }
    } 
    //3
    if(fbi==0){
        cout << "HE GOT AWAY!" << endl;
    }
    return 0;
}

 

코드 풀이

4번째 시도만에 맞춘 문제이다.

예제에 있는 입력들을 넣었을 때는 다 정상적으로 출력이 나왔는데 계속해서 20%정도에서 틀렸다고 떴다. 

 

뭐가 문제인지 몰라 질문을 올렸고 반례들로 FBI 가 이름에 여러번 들어가 있는 경우도 고려해보라고 답변이 달렸다.

 

처음에 작성한 코드는 아래와 같다. (계속해서 틀린 코드)

        //2
        for(int i=0; i<name.size()-2; i++){
            if(name[i]=='F' && name[i+1]=='B' && name[i+2]=='I'){
                cout << j << " ";
                fbi++;
        }
        }

 

이 경우 아래와 같은 입력을 넣은 경우에 

출력이 1만 나와야하지만

FBIFBI 가 두 번 카운팅 되면서 1 1이 나오게 된다.

//입력
FBIFBI
ABC
DEF
HIG
KLMN

//나와야 하는 출력
1

//나오는 출력
1 1

 

 

이런 경우를 처리하기 위해 break; 구문을 추가하여 아래와 같은 코드를 작성했다. 

        //2
        for(int i=0; i<name.size()-2; i++){
            if(name[i]=='F' && name[i+1]=='B' && name[i+2]=='I'){
                cout << j << " ";
                fbi++;
                break; //FBIFBI 같은 경우 처리
        }
        }

 

이렇게 코드를 변경하면 위와 동일한 입력을 넣었을 경우 출력이 정상적으로 1만 나오게 된다.

//입력
FBIFBI
ABC
DEF
HIG
KLMN

//나와야 하는 출력
1

//나오는 출력
1

FBIFBI 에서 첫 번째 FBI 를 발견하고 break; 구문을 통해 빠져나오게 된다. 

만약 break; 구문을 넣지 않았더라면 FBIFBI 에서 첫 번째 FBI를 카운팅하고 두 번째 FBI까지 카운팅해서 1 1이 나오게 된다. 

 

이 부분을 몰라서 계속 헤맸는데 

혹시나 나와 비슷한 문제로 구글링하는 분들께 도움이 될까싶어 올려본다.