알고리듬/문제

[baekjoon] 1195

narmeee 2023. 5. 17. 11:45

킥다운

문제

세계적으로 유명한 엄지민 자동차 회사는 효율적인 킥다운 장치를 만들어달라는 의뢰를 받았다. 킥다운이란 자동차에서 낮은 기어로 바꾸는 장치를 의미한다. 연구 끝에 효율적인 킥다운 장치는 '이'와 '홈'이 불규칙하게 배열되어 있는 기어로 만들어져야 한다는 것을 알았다.

첫 번째 그림과 같이 두 기어 파트가 서로 마주보고 있게 된다. 튀어나온 것이 기어의 이, 들어간 곳이 홈이다. 그리고 이들을 두 번째 그림과 같이 서로 맞물리게 끼우는 것으로 킥다운 장치를 만들 수 있다. 하지만 문제는 맞물리게 하였을 때 가로 너비가 짧을수록 효율적인 킥다운 장치가 된다. 때문에 문제는 두 기어가 주어졌을 때 맞물리게 하는 가장 짧은 가로 너비를 구하는 것이다.

입력

첫 줄에는 첫 번째 기어 파트를 나타내는 1과 2로 구성된 문자열이 주어진다. 두 번째 줄에는 마찬가지로 두 번째 기어 파트를 나타내는 1, 2로 구성된 문자열이 주어진다. 여기서 1은 홈을, 2는 이를 의미한다. 길이 <= 100

출력

첫 줄에 만들 수 있는 가장 짧은 가로 너비를 출력한다.

예제 입력

2112112112
2212112

예제 출력

10

풀이

하나의 시작점을 기준으로 두 값의 합이 4보다 크지 않으면 된다.

두 번째 while문이 끝난후 i와 j 둘 중 하나라도 기어의 길이에 도달했으면 탐색이 끝난 것으로 한다.

이후 내부에 포함됐는지, 일부만 겹쳤는지에 따라 길이를 구한다.

 

#include <iostream>
#include <string>

using namespace std;

string gear1, gear2;
int solve(string gear1, string gear2){
    int size = gear1.length() + gear2.length();

    int start = 0;
    while(start < gear1.length()){
        int i = start, j = 0;
        while(gear1[i] + gear2[j] - '0'*2 < 4 && j < gear2.length() && i < gear1.length())j++, i++;
        if(j == gear2.length() || i >= gear1.length())break;
        else start++;
    }
    if(start <= gear1.length()){
        //내부에 모두 포함
        if(gear1.length() - start >= gear2.length())return gear1.length();
        //튀어 나감
        else return size - gear1.length() + start;
    }
    else return size;
}

int main(){
    cin >> gear1 >> gear2;
    cout << min(solve(gear1, gear2), solve(gear2, gear1));
}

'알고리듬 > 문제' 카테고리의 다른 글

[baekjoon] 15591  (0) 2023.05.19
[baekjoon] 1239  (0) 2023.05.18
[baekjoon] 1394  (0) 2023.05.16
[baekjoon] 1516  (0) 2023.05.15
[baekjoon] 7579  (0) 2023.05.14