[코드트리 챌린지] 10월 1주차 - dx, dy (되돌아오기)

모모·2023년 10월 9일
0

코드트리 챌린지

목록 보기
6/7

9월 마지막주차 챌린지를 하지 못했다.. 🥲
한번 빠진 만큼 10월에는 정말 열심히 해야지!!!!!! 빠샤😁

이번의 실력진단 결과는..... 쬐끔... 올랐다.....ㅋㅋㅋ....
(완전탐색 문제 못풀고 있다.. dx, dy문제도... 아직 익숙하지가 않다 ㅠㅠ
더 열심히 해야된다...!!! 크앙)
그래서 오늘은 dx, dy 문제 풀이에 대해 포스팅하려고 한다!!!

☝️ dx, dy 테크닉

dx, dy 테크닉의 가장 중요한 포인트는..
각 방향에 맞는 x좌표의 차를 dxy좌표의 차를 dy에 적어두는 것

오른쪽으로 이동한다는 것은 x좌표에 +1, y좌표에 +0
아래로 이동한다는 것은 x좌표에 +0, y좌표에 -1,
왼쪽으로 이동한다는 것은 x좌표에 -1, y좌표에 +0,
위쪽으로 이동한다는 것은 x좌표에 +0, y좌표에 +1 해주면 된다.

이걸 dx, dy 배열에 옮겨놓고 이동하는 방향에 맞춰서 dx, dy 값을 가져와 좌표에 더해주면 된다.

✌️ 되돌아오기 문제

코드트리 문제 링크

문제 형식

(0, 0)에서 시작하여 총 N번 움직여보려고 합니다. N번에 걸쳐 움직이려는 방향과 움직일 거리가 주어지고, 1초에 한 칸씩 움직인다고 했을 때, 몇 초 뒤에 처음으로 다시 (0, 0)에 돌아오게 되는지를 판단하는 프로그램을 작성해보세요.

입력 형식

첫 번째 줄에 정수 N이 주어집니다.

두 번째 줄부터는 N개의 줄에 걸쳐 각 줄마다 이동방향과 이동한 거리가 공백을 사이에 두고 주어집니다. 방향은 W, S, N, E중에 하나이며 각각 서, 남, 북, 동쪽으로 이동함을 의미합니다.

1 ≤ N ≤ 100
1 ≤ 한 번에 움직이는 거리 ≤ 10

출력 형식

첫 번째 줄에 다시 시작점으로 되돌아오는 데 걸리는 시간을 출력합니다. 만약 N번 이동을 진행했는데도 시작점으로 돌아오지 못했다면 -1을 출력합니다.

🤟 문제 풀어보기

dx, dy 문제를 풀었다면 어렵지 않은 문제였다..
다만 나는 0, 0 위치에서 부터 시작하는 걸 배열의 인덱스로 생각하고 100x100 배열을 만들고 시작했다. 풀이 코드를 보면 알 수 있지만 이건 배열을 쓰지 않고도 풀 수 있는 문제이다. 그리고 시작 지점으로 돌아왔다는 것을 확인하는 flag 변수를 썼지만 이것 역시 굳이 없어도 되는 문제이다. 풀이 코드를 보고 또 배운다...

#include <iostream>
#define MAX_N 100

int arr[MAX_N][MAX_N];

//북, 동, 남, 서순으로 dx, dy 정의 
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

int time; //소요 시간

using namespace std;

int get_dir(char c){
    if(c == 'S'){
        return 0;
    }else if(c == 'E'){
        return 1;
    }else if(c == 'N'){
        return 2;
    }else{
        return 3;
    }
}

int main() {
    int time = 0; //소요 시간
    int n;
    cin >> n;

    int cx = 0, cy = 0; //시작점 좌표
    bool is_zero_start = false; //시작점으로 돌아왔는지 확인하는 변수
    for(int i=0; i<n; i++){
        char dir;
        int dis;
        cin >> dir >> dis;

        while(dis--){
            cx += dx[get_dir(dir)]; //dir방향으로 x좌표 이동
            cy += dy[get_dir(dir)]; //dir방향ㅇ로 y좌표 이동
            time++; //이동 시간 기록

            if(cx == 0 && cy == 0){ //시작점으로 돌아왔다면 break
                is_zero_start = true;
                break;
            }
        }
        if(is_zero_start){
            break;
        }
    }
    if(!is_zero_start){
        cout << -1;
    }else{
        cout << time;
    }
    
    return 0;
}
profile
코딩하는 사람입니다. 궁금한 거 많이 물어보고 있어요 :)

0개의 댓글