강의로 돌아가기
유재준

c언어 테스트 성공 예시입니다.

주석도 달아두었으니 천천히 읽어보시면 좋을 것 같습니다.

작성중인 코드―solution.c
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

#define TRUE    1
#define FALSE   0

enum {EAST, WEST, SOUTH, NORTH, NONE};

// 배열의 한 요소의 개수 strlen가 width
// 배열의 총 열의 개수 == park_len가 height
// switch로 문자 4개 확인하고 idx만큼 이동
// 시작좌표 입력한 answer 초기화
// 실시간 갱신? 아니면 동서남북 변수 선언해서 결과 반영?
// 장애물이 있어서 실시간 갱신 해줘야함

int CalcDirection(char _cardinal)
    // 동서남북 순서로 0,1,2,3 반환
{
    switch(_cardinal){
            case 'E':
                return EAST;
            case 'W':
                return WEST;
            case 'S':
                return SOUTH;
            case 'N':
                return NORTH;
        }
    return NONE;
}

int CalcIsMove(const char** _park, int* _answer, int _distance, int _calcFactor, int _height, int _width)
{
    // horizontal
    // 동쪽이면 location계산할때는 + j _park는 뒤에 값만 변경 == 0
    // 서쪽이면 location계산할때는 - j _park는 뒤에 값만 변경 == 1
    // vertical
    // 남쪽이면 location 계산할때는 + j _park는 앞에 값만 변경 == 2
    // 북쪽이면 location 계산할때는 - j _park는 앞에 값만 변경 == 3
    char location = '\0';

    if(_calcFactor > 3 || _calcFactor < 0) // 동서남북 다 아니면 return FALSE
        return FALSE;

    if( _calcFactor < 2){ // horizontal
        if(_calcFactor == EAST){
            if(_answer[1] + _distance >= _width)
                return FALSE;
        } else {
            if(_answer[1] - _distance < 0)
                return FALSE;
        }

        for(int i = 1; i < _distance + 1; ++i){
            location = _park[_answer[0]][_calcFactor == EAST ? _answer[1] + i : _answer[1] - i];
            if(location == 'X')
                return FALSE;
        }

        return TRUE;
    } else {

        if(_calcFactor == SOUTH){
            if(_answer[0] + _distance >= _height)
                return FALSE;
        } else {
            if(_answer[0] - _distance < 0)
                return FALSE;
        }

        for(int i = 1; i < _distance + 1; ++i){
            location = _park[_calcFactor == SOUTH ? _answer[0] + i : _answer[0] - i][_answer[1]];
            if(location == 'X')
                return FALSE;
        }

        return TRUE;
    }

    return FALSE;
}


// park_len은 배열 park의 길이입니다.
// routes_len은 배열 routes의 길이입니다.
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int* solution(const char* park[], size_t park_len, const char* routes[], size_t routes_len) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.

    int* answer = (int*)malloc(sizeof(int) * 2);
    int height = park_len;
    int width = strlen(park[0]);
    char cardinalPoint = '\0';



    // 시작위치 찾는 반복문
    for(int i = 0; i < height; ++i){
        int j = 0;

        for(j = 0; j < width; ++j){
            if(park[i][j] == 'S'){
                break;
            }
        }

        // 시작 좌표 초기화
        if(j < width){
            answer[0] = i;
            answer[1] = j;
            break;
        }

    }

    // 배열에 이동값 저장
    for(int i = 0; i < routes_len; ++i){
        int distance = (int)(routes[i][2] - '0');
        cardinalPoint = routes[i][0];

        int calcFactor = CalcDirection(cardinalPoint);
        if(CalcIsMove(park, answer, distance, calcFactor, height, width)){
            if(calcFactor < 2){

                answer[1] += calcFactor == 0 ? distance : distance * -1;
            }
            else
                answer[0] += calcFactor == 2 ? distance : distance * -1;
        }


    }


    return answer;
}
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.