Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Share Garam's everyday life.

로봇청소기 본문

삼성소프트웨어역량평가(알고리즘)

로봇청소기

가람스나이퍼님 (Joshua_Choi_Brother) 2018. 1. 8. 16:22

2018년 상반기 삼성 시험을 대비한다. 컴퓨터공학과에 왔지만 이 공부를 왜 해야 하는지 나에 대해서 너무 몰랐다. 그런데 코딩을 왜 해야 하는지 알고리즘, 자료구조가 왜 중요한지 즉 왜 공부해야 하는지 알았다. 그러다보니 코딩의 중요성 알고리즘의 중요성 자료구조의 중요성을 뼈져리게 느낀다. 이 공부를 할 수록 생각하게 된다. 따지게 된다. 내가 생각한 것을 만들 수 있게 된다. 나에게 생각하게 만들어 줄 수 있는 공부이다. 보람찬다. 계속 소프트웨어 공부를 조금식 진행 해 갈 생각이다. 하면 할 수록 알면 알 수록 재미있다. 


* 알고리즘

------------------------------------------------------------------------------

while(1)

  청소한다

  현 위치(2)로 지정한다.

  count++

  while(1)

    if(회전 수(turn)가 4회 미만 일 시에)

      if(왼쪽 0일 시)

      로봇 왼쪽 회전 후(turn = 0) 한 칸 전진 후 청소한다로 이동

      else

        로봇 왼쪽 회전 후(turn++) while문으로 진행

    else if(회전 수(turn)이 4회 이상 일 시에)

      if(뒤가 벽이 아닌 경우)

        로봇 방향 유지 및 로봇 한 칸 후진 후 초기화(turn = 0) 후 while문으로 진행

      else

        로봇 동작 멈추고 break

------------------------------------------------------------------------------


현재 위치를 청소한다.

for(현재 방향을 기준으로 왼쪽방향부터 탐색 진행)


2-1은 조건 후 실행 그리고 반복

2-2은 조건 후 실행 그리고 반복

2-3은 조건 후 실행 그리고 반복

2-4은 조건 후 실행 


1,2번은 '왼쪽 상태가 어떠하면' 이고

3,4번은 '상하좌우상태가 어떠하면' 이에요


1, 2는 회전이 4회 이하여야 하고 3, 4는 회전이 4회 이상 이어여 해


if (d == 1)

return arr[r][c - 1];

else if (d == 3)

return arr[r + 1][c];

else if (d == 2)

return arr[r][c + 1];

else if (d == 0)

return arr[r - 1][c];

else

return 0;



-----------------------------------------------------------------------------------------------------------------------------#define   _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>


int left(int r, int c, int d, int **arr);

void leftrotate(int *d);

void forward(int *r, int *c, int d);

void backward(int *r, int *c, int d);

int notblock(int r, int c, int d, int **arr);


int main(void) {

int N = 0;

int M = 0;

int r, c, d;

int **arr;

int i, j;

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

scanf("%d %d %d", &r, &c, &d);

arr = (int **)malloc(N * sizeof(int *));

for(i = 0; i < N; i++)

arr[i] = (int *)malloc(M * sizeof(int));

for(i = 0; i < N; i++) {

for(j = 0; j < M; j++) {

scanf("%d", &arr[i][j]);

}

}

int count = 0;

int turn = 0;

int flag = 0;

while(1) {

arr[r][c] = 2; //청소했다.

count++;

while(1) {

if(4 > turn) {

if(left(r, c, d, arr) == 0) {

leftrotate(&d);

forward(&r, &c, d);

turn = 0;

break;

}

else {

leftrotate(&d);

turn++;

continue;

}

}

else if (8 > turn) {

if(notblock(r, c, d, arr) == 1) {

backward(&r, &c, d);

turn = 0;

continue;

}

else {

flag = 1;

break;

}

}

}

if(flag == 1) {

flag = 0;

break;

}

}

printf("%d\n", count);

return 0;

}


int left(int r, int c, int d, int **arr) {

if(d == 0) //북 

return arr[r][c-1];

else if(d == 1) //동

return arr[r-1][c];

else if(d == 2) //남

return arr[r][c+1];

else if(d == 3) //서

return arr[r+1][c];

else

return 0; 

}


void leftrotate(int *d) {

if (*d == 0) //북쪽을 보면 

*d = 3;  //서쪽으로 방향을 옮긴다.

else if (*d == 1) //동쪽을 보면

*d = 0;       //북쪽으로 방향을 옮긴다. 

else if (*d == 2) //남쪽을 보면

*d = 1;       //동쪽으로 방향을 옮긴다. 

else if (*d == 3) //서쪽을 보면 

*d = 2;       //남쪽으로 방향을 옮긴다.

else

}


void forward(int *r, int *c, int d) {

if (d == 0) //북 

*r -= 1;

else if (d == 1) //동

*c += 1;

else if (d == 2)  //남

*r += 1;

else if (d == 3)  //서

*c -= 1;

else

}


int notblock(int r, int c, int d, int **arr) {

if (d == 0) { //북  

if (arr[r+1][c] == 2) // 뒤를 확인한다. 청소가 됬는지 

return 1; // 맞으면 1을 반 

else 

return 0;  // 틀리면 0을 반환 

}

else if (d == 1) { // 동 

if(arr[r][c-1] == 2)

return 1;

else

return 0;

}

else if (d == 2) { // 남

if(arr[r-1][c] == 2)

return 1;

else

return 0; 

}

else if (d == 3) { // 서

if(arr[r][c+1] == 2)

return 1;

else

return 0; 

}

}


void backward(int *r, int *c, int d) {

if(d == 0) //북 

*r += 1;

else if(d == 1) // 동

*c -= 1;

else if(d == 2) // 남

*r -= 1;

else if(d == 3)  //서

*c += 1;

else

}