본문 바로가기

교육/문제해결

[5일차] 우회전

- 문제 설명

우회전밖에 할 수 없는 차가 있다.

목표 순서가 정해지면 목표지점을 다 순회하는데 우회전을 몇번 해야하는가

 

 

 

 

 

 

 

 1

 

 

 

 

 

 3

 

 

 2

 

 

 

 

 

 

 

 

위와 같은 맵의 경우

 

 

 R

 

 

 

 

 

 

 

 R

 

 3

 

 

 2, R

 R

 

 

 

 

 

 

 

위와 같이 총 4번의 우회전을 해야 목적지를 다 돌 수 있다.

- 입력

1 // 테스트 케이스

5 3 // 5*5배열, 목적지 3개

2 3 4 2 3 4// 목적지 좌표 (2,3), (4,2), (3,4)

- 출력

#1 4 //테스트 케이스, 우회전 갯수

- 입력 예시

3
5 3
2 3 4 2 3 4
5 4
3 2 2 4 4 3 5 2
5 5
2 4 3 2 2 3 4 4 5 5

- 출력 예시

#1 4
#2 10
#3 9

- 코드

#include "stdio.h"


int N, locationNum;

int currentLocation;


int main(int argc, const char * argv[]) {

    int T;

    freopen("/Users/wjhur/Desktop/ctest/ctest/Text.txt", "r", stdin);

    scanf("%d", &T);

    for(int tc = 1;tc <= T;tc++)

    {

        scanf("%d %d",&N, &locationNum);

        int currentCol=1;

        int currentRow=1;

        int countOfR = 0;

        int way = 0; // 현재 진행방향 0 : ->, 1: 아래, 2: <-, 3:

        

        for(int i =0;i<locationNum;i++)

        {

            int inputCol, inputRow;

            scanf("%d %d",&inputCol, &inputRow);

            //            printf("inputCol = %d, inputRow = %d,way =  %d,countOfR = %d\n",inputCol,inputRow,way,countOfR);

            if(currentCol == inputCol) // 같은 행일 경우

            {

                if(currentRow > inputRow) //현재 위치보다 왼쪽인 경우

                {

                    if(way == 0 || way == 3)

                    {

                        currentCol++;

                    }

                    else if(way == 1)

                    {

                        currentCol--;

                    }

                }

                else // 현재 위치 보다 오른쪽인 경우

                {

                    if(way == 1 || way == 3)

                    {

                        currentCol++;

                    }

                    else if(way == 2)

                    {

                        currentCol--;

                    }

                }

            }

            else if(currentRow == inputRow) // 같은 열일때

            {

                if(currentCol > inputCol) // 현재 위치 보다 위인 경우

                {

                    if(way == 0 || way == 1)

                    {

                        currentRow--;

                    }

                    else if(way == 2)

                    {

                        currentRow++;

                    }

                }

                else // 현재 위치 보다 아래인 경우

                {

                    if(way == 0)

                    {

                        currentRow--;

                    }

                    else if(way == 2 || way == 3)

                    {

                        currentRow++;

                    }

                }

            }

            

            if(currentCol < inputCol && currentRow < inputRow) // 우측 아래 경우

            {

                //                printf("1- way%%4 = %d\n",1-way%4);

                int cal = 1 - (way%4);

                cal = (cal > 0) ? cal : (4+cal);

                countOfR += cal;

                way = 1; // 마지막 방향은 아래를 향함

            }

            else if(currentCol < inputCol && currentRow > inputRow) // 좌측 아래일 경우

            {

                //                printf("2- way%%4 = %d\n",2-way%4);

                int cal = 2 - (way%4);

                cal = (cal > 0) ? cal :(4+cal);

                countOfR += cal;

                way =2; // 마지막 방향은 왼쪽을 향함

            }

            else if(currentCol > inputCol && currentRow > inputRow) // 좌측 위일 경우

            {

                //                printf("3- way%%4 = %d\n",3-way%4);

                int cal = 3 - (way%4);

                cal = (cal > 0) ? cal : (4+cal);

                countOfR += cal;

                way =3; // 마지막 방향은 위를 향함

            }

            else if(currentCol > inputCol && currentRow < inputRow)// 우측 위일 경우

            {

                //                printf("4- way%%4 = %d\n",4-way%4);

                int cal = 4-(way%4);

                cal = (cal > 0) ? cal : (4+cal);

                countOfR += cal;

                way =0; // 마지막 방향은 오른쪽을 향함

            }

            

            // 현재위치 갱신

            currentCol = inputCol;

            currentRow = inputRow;

        }

        printf("#%d %d\n", tc,countOfR); // 결과 출력

    }

    return 0;

}