= 0 && x < 8 && y >= 0 && y < 8){ //돌이랑 같은 위치인 경우 if (x==rx && y==ry){ //돌을 동일한 방향으로 이동시키기 if (strcmp(Move, "R") == 0) rx++; else if (strcmp(Move, "L") == 0) rx--; else if (strcmp(Move, "B") == 0) ry--; else if (strcmp(Move, "T") == 0) ry++; else if (strcm"> = 0 && x < 8 && y >= 0 && y < 8){ //돌이랑 같은 위치인 경우 if (x==rx && y==ry){ //돌을 동일한 방향으로 이동시키기 if (strcmp(Move, "R") == 0) rx++; else if (strcmp(Move, "L") == 0) rx--; else if (strcmp(Move, "B") == 0) ry--; else if (strcmp(Move, "T") == 0) ry++; else if (strcm"> = 0 && x < 8 && y >= 0 && y < 8){ //돌이랑 같은 위치인 경우 if (x==rx && y==ry){ //돌을 동일한 방향으로 이동시키기 if (strcmp(Move, "R") == 0) rx++; else if (strcmp(Move, "L") == 0) rx--; else if (strcmp(Move, "B") == 0) ry--; else if (strcmp(Move, "T") == 0) ry++; else if (strcm">

<aside> 1️⃣

문제: 1063번 킹

체스판에서 킹의 위치가 주어지고 어떻게 움직였는지가 주어짐. 체스판에는 돌도 하나 놓여있는데 킹이 돌의 위치에 오게되면 돌을 킹이 움직인 방향과 동일하게 이동시킴. 킹과 돌의 마지막 위치 구하기

#include <stdio.h>
#include <string.h>

//입력값에 맞게 이동시키는 함수 
void update(char King[3], char Rock[3], const char Move[3]){
    //int값으로 변경
    int x = King[0] - 'A';
    int y = King[1] - '1';
    int rx = Rock[0] - 'A';
    int ry = Rock[1] - '1';
    if (strcmp(Move, "R") == 0) x++;
    else if (strcmp(Move, "L") == 0) x--;
    else if (strcmp(Move, "B") == 0) y--;
    else if (strcmp(Move, "T") == 0) y++;
    else if (strcmp(Move, "RT") == 0) { x++; y++; }
    else if (strcmp(Move, "LT") == 0) { x--; y++; }
    else if (strcmp(Move, "RB") == 0) { x++; y--; }
    else if (strcmp(Move, "LB") == 0) { x--; y--; }

    //킹이 체스판 넘어가지 않는지 확인
    if (x >= 0 && x < 8 && y >= 0 && y < 8){ 
        //돌이랑 같은 위치인 경우
        if (x==rx && y==ry){
            //돌을 동일한 방향으로 이동시키기
            if (strcmp(Move, "R") == 0) rx++;
            else if (strcmp(Move, "L") == 0) rx--;
            else if (strcmp(Move, "B") == 0) ry--;
            else if (strcmp(Move, "T") == 0) ry++;
            else if (strcmp(Move, "RT") == 0) { rx++; ry++; }
            else if (strcmp(Move, "LT") == 0) { rx--; ry++; }
            else if (strcmp(Move, "RB") == 0) { rx++; ry--; }
            else if (strcmp(Move, "LB") == 0) { rx--; ry--; }
            
            //돌이 체스판 넘어가지 않는지 확인
            if (rx >= 0 && rx < 8 && ry >= 0 && ry < 8){
                Rock[0] = rx + 'A'; 
                Rock[1] = ry + '1';  
                King[0] = x + 'A'; 
                King[1] = y + '1'; 
            }
        } else { //돌과 겹치지 않는 경우 킹만 이동
            King[0] = x + 'A'; 
            King[1] = y + '1'; 
        }
    }
}

int main(){
    char king[3], rock[3]; //초기 위치
    int N; //이동 횟수
    scanf("%s %s %d", king, rock, &N);

    while(N--){ //이동 횟수만큼 이동 방향 입력받기
        char move[3];
        scanf("%s", move);
        update(king, rock, move); //이동시키기
    }

    printf("%s\\n%s\\n", king, rock);
}

image.png

<aside> 2️⃣

문제: 2346번 풍선 터뜨리기

N개의 풍선이 원형으로 놓여있고, 각 풍선 안에는 -N ~ N의 정수가 적힌 종이가 있음.

처음으로 1번 풍선을 터뜨리고, 1번 풍선 안의 종이에 적힌 값만큼 이동한 뒤 그 자리의 풍선을 터뜨림

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
    int N;
    scanf("%d\\n", &N);
    
    char input[1001]; 
    fgets(input, sizeof(input), stdin); //우선 한줄로 입력 받기

    int balloon[N];
    int index = 0;
    char *token = strtok(input, " "); //공백 제거
    while (token != NULL){
        balloon[index++] = atoi(token); //정수로 저장
        token = strtok(NULL, " ");
    }

    int visited[N]; //풍선이 터졌는지 여부
    memset(visited, 0, sizeof(visited));
    int current = 0; //현재 인덱스 
    int count = 0; //while문 위한 카운트

    while(count < N){
        printf("%d ", current + 1); //처음에는 1위치에
        visited[current] = 1; //방문 처리
        count++; 

        if (count == N) break; //마지막 풍선

        int move = balloon[current]; //풍선 안의 숫자만큼 이동
        int dir = move > 0 ? 1 : -1; //이동
        int step = abs(move);

        while (step > 0) {
            current = (current + dir + N) % N; //원형
            if (!visited[current]) step--;
        }
    }    
}

image.png