[백준/c++] 14891

코린·2022년 10월 15일
0

알고리즘

목록 보기
9/44
post-thumbnail

문제

https://www.acmicpc.net/problem/14891

참고 블로그

https://velog.io/@khc41/%EB%B0%B1%EC%A4%80-14891%EB%B2%88-%ED%86%B1%EB%8B%88%EB%B0%94%ED%80%B4-C-%EC%82%BC%EC%84%B1-%EA%B8%B0%EC%B6%9C-amdofa1x

 


문제풀이

왼쪽과 오른쪽을 끝까지 확인해 주어야 하기 때문에 재귀를 사용해야 한다는 것까지는 생각을 했다. 하지만 아직 구현할 수 있는 실력이 안돼서 블로그를 통해서 방법을 공부했다!!!!

  1. 오른쪽을 비교해주는 함수
  2. 왼쪽을 비교해주는 함수
  3. 톱니를 돌려주는 함수
  4. 1,2,3 함수를 사용하는 함수

이렇게 4가지를 만들어주어야 하는 것을 알았다.

오른쪽을 비교해주는 함수는 가장 오른쪽 인덱스에 올때까지 재귀로 돌려준다. 왼쪽도 동일하다.

톱니를 돌려주는 함수는 돌아감 여부를 저장하는 배열에 값에 저장된 값에 따라서 돌려준다. -1 인지 1인지에 따라서 톱니를 돌려준다.

4는 처음 돌아가는 톱니 번호와 돌아가는 방향을 이용한다. 초기값을 저장해주고 오른쪽과 왼쪽을 돌려주는 함수를 호출한다. 모두 돌아간 다음에는 돌아감 여부를 저장한 배열과 움직이는 함수를 이용해서 움직인다.

정해진 스코어값에 따라서 결과값을 출력해주면 해당 문제는 해결!

#include <iostream>
#include <cstring>
using namespace std;

//각 톱니는 2번부분과 6번이 맞닿아 있음

//톱니 번호를 저장할
string W[4]; 
//돌아감 유무에 대해서 저장한다.
int isRotate[4];

//isRotate 베열을 초기화 해주는 함수이다.
void init(){
    for(int i=0;i<4;i++){
        isRotate[i]=0;
    }
}

// isRotate에 어떤 값이 있을 때 돌아가는 함수이다.
void move(int idx,int clock){
    if(clock == 1){ //시계방향으로 돌아가는 경우
        W[idx]=W[idx].substr(7)+W[idx].substr(0,7);
    }
    else if(clock == -1){ //반시계방향으로 돌아가는 경우 -> ***이때 얘도 꼭 else if 로 조건 달아주어야한다. else 로 할 경우 틀림***
    //else 로 할 경우에 틀리는 이유는 맨 처음 초기 값이 저장되어 있을 수도 있기 때문이다.
        W[idx]=W[idx].substr(1,7)+W[idx].substr(0,1);
    }
}

// 오른쪽 체크하는 함수
void right_check(int idx, int clock){
    if(idx >= 3) return; //3이면 오른쪽 가장 끝이므로 더 이상 확인할 필요가 없음 
    if(W[idx][2]!=W[idx+1][6]){ // 오른쪽 6번 자리와 자신의 2번 자리를 비교해야함
        isRotate[idx+1] = clock * -1; //반대방향으로 돌아가기 때문에 -1을 곱해주는 것임
        right_check(idx+1,clock * -1); //*** 반대 방향으로 돌려주는거 잊지말기 ***
    }
}

//왼쪽 체크하는 함수
// 오른쪽과 구현 방법이 동일하다.
void left_check(int idx, int clock){
    if(idx <= 0) return; //0번째면 가장 왼쪽이므로 더이상 비교할 것이 없음
    if(W[idx][6]!=W[idx-1][2]){ //왼쪽과 비교하는 것이기 때문에 본인은 6번째 왼쪽은 2번째와 비교
        isRotate[idx-1] = clock * -1;
        left_check(idx-1,clock * -1);
    }
}

// 통틀어서 확인하는 함수
void check(int idx,int clock){

    //처음으로 돌아가는 애를 설정해줌
    isRotate[idx]=clock;
    // 주어진 돌아가는 톱니의 오른쪽과 왼쪽을 모두 비교해준다.
    left_check(idx,clock);
    right_check(idx,clock);


    // 위를 토대로 나온 isRotate를 돌려준다.
    for(int i=0;i<4;i++){
        move(i,isRotate[i]);
    }
}

int main(){

    int K,num,rot;
    int ans=0;

    for(int i=0;i<4;i++){
        cin >> W[i];
    }

    cin >> K;

    for(int i =0;i<K;i++){
        cin >> num >> rot;
        init();
        check(num-1,rot);
    }
    int mul = 1;
    for(int i=0;i<4;i++){
        ans += (W[i][0]-'0') * mul;
        mul *= 2;
    }

    cout << ans;

}
profile
안녕하세요 코린입니다!

0개의 댓글