관리 메뉴

cococo-coding

[C++ 풀이] 9243번. 파일 완전 삭제 본문

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

[C++ 풀이] 9243번. 파일 완전 삭제

_dani 2024. 1. 23. 17:09

 

문제 분석

파일을 덮어씌울 횟수 n에 따라 다른 풀이로 접근해야 한다.

기존파일을 비트단위로 덮어씌우고, 한 번 덮어씌울 때 0인 비트는 1, 1인 비트는 0으로 덮어씌워진다.

따라서 n이 홀수면 처음 파일과 최종 파일의 비트가 다 달라야 삭제 성공이며,

n이 짝수라면 처음 파일과 최종 파일의 비트가 다 같아야 삭제 성공이다. 

 

 

알고리즘 설계

우선 n이 짝수인지 홀수인지에 따라 분기문을 설계했다.

그리고 최종적으로 삭제가 성공했는지 출력할 문자열을 result로 설정하고 0으로 초기화했다. 

 

처음 파일은 ori, 삭제한 뒤의 파일은 after로 설정했다. 

 

우선 덮어씌우는 횟수가 홀수인 경우

for문으로 ori과 after의 인덱스를 비교해서 같은 문자가 있는 경우 삭제가 안된 것이므로

result에 Deletion failed 를 넣었다.

그리고 break;문으로 반복문을 나오도록 했다.

 

덮어씌우는 횟수가 짝수인 경우,

for문으로 ori과 after의 인덱스를 비교해서 다른 문자가 있는 경우, 삭제가 안된 것이므로 

result에 Deletion failed를 넣었다.

그리고 위와 동일하게 break;문으로 반복문을 탈출했다.

 

이제 삭제가 성공한 경우를 처리하는데,

처음에 result에 0을 넣었었다. 

만약, 삭제에 실패했다면 위 두가지 케이스에서 result=Deletion failed가 들어갔을 것이고,

result가 초기화된 값 그대로 0이라면 성공한 케이스로 분류했다.

따라서 마지막에 result가 초기화값 그대로라면 (result == "0")

result에 Deletion succeeded를 넣어주도록 했다.

 

최종적으로 result를 출력한다. 

 

 

코드

#include <iostream>
using namespace std;

/*
    1. n을 입력받는다. (덮어씌울 횟수)
    2. 원래 파일 비트와 삭제된 비트를 입력받는다.
    3. 삭제가 성공했는지 여부를 출력한다.
*/

int main() {
    //1
    int n;
    cin >> n;

    //2
    string ori, after;
    cin >> ori >> after;

    string result="0";

    if (n % 2 != 0) { //덮어씌우는 횟수가 홀수
        for (int i = 0; i < ori.size(); i++) {
            //같다면 삭제가 안된 것
            if (ori[i] == after[i]) {
                result="Deletion failed";
                break;               
            }           
        }       
    }
    //덮어씌운 횟수가 짝수
    else { 
        for (int i = 0; i < ori.size(); i++) {
            if (ori[i] != after[i]) { //다르면 삭제안된 것
                result = "Deletion failed";
                break;
            }       
        }      
    }

    //result에 아무것도 없다면 delection succeed인 상황
    if (result == "0")
        result = "Deletion succeeded";

    //3
    cout << result << '\n';
        return 0;
}

 

느낀 점

삭제에 성공한 케이스를 어떻게 처리할지 고민했는데, 위와 같이 초기화시킨 값을 이용해 마지막에 검토해서 초기화된 값이 그대로 들어있다면 성공케이스로 한꺼번에 분류할 수 있었다.