대학생 한 분을 과외? 형태로 C언어 공부를 도와드리고 있습니다.
C 언어에 익숙해지실 수 있게 여러 코딩테스트 문제를 내드렸는데요.
과제로 내드린 문제 중 하나가 잘 푼 것 같은데.. 제출하면 4개 실패합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/172928#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
제가 푼 코드는 아래 코드인데 문제를 발견하신다면 댓글로 알려주시면 감사하겠습니다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
int* findStartPoint(const char* park[], size_t park_len);
void move(const char* park[], size_t park_len, int* startPoint, const char* instruction);
void moveHeight(const char* park[], size_t park_len, int* startPoint, int distance);
void moveWidth(const char* park[], size_t park_len, int* startPoint, int distance);
int* solution(const char* park[], size_t park_len, const char* routes[], size_t routes_len) {
int* currentPoint = findStartPoint(park, park_len);
if(currentPoint == NULL) {
return NULL;
}
for(int i = 0; i < routes_len; i++) {
move(park, park_len, currentPoint, routes[i]);
}
return currentPoint;
}
int* findStartPoint(const char* park[], size_t park_len) {
int height = park_len;
int width = strlen(park[0]);
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
if(park[i][j] == 'S') {
int* startPoint = (int*) malloc(sizeof(int) * 2);
startPoint[0] = i;
startPoint[1] = j;
return startPoint;
}
}
}
return NULL;
}
void move(const char* park[], size_t park_len, int* startPoint, const char* instruction) {
char direction = instruction[0];
int distance = instruction[2] - '0';
if(direction == 'N' || direction == 'S') {
int actualDistance = direction == 'S' ? distance : -distance;
moveHeight(park, park_len, startPoint, actualDistance);
} else if(direction == 'W' || direction == 'E') {
int actualDistance = direction == 'E' ? distance : -distance;
moveWidth(park, park_len, startPoint, actualDistance);
}
}
void moveHeight(const char* park[], size_t park_len, int* startPoint, int distance) {
int oldH = startPoint[0];
int newH = oldH + distance;
int parkHeight = park_len;
// 공원을 벗어났는지 확인
if(newH < 0 || newH >= parkHeight) {
return;
}
// 이동 중 장애물을 만나는지 확인
int start = oldH < newH ? oldH : newH;
int end = oldH < newH ? newH : oldH;
for(int i = start; i < end; i++) {
if(park[i][startPoint[1]] == 'X') {
return;
}
}
startPoint[0] = newH;
}
void moveWidth(const char* park[], size_t park_len, int* startPoint, int distance) {
int oldW = startPoint[1];
int newW = oldW + distance;
int parkWidth = strlen(park[0]);
// 공원을 벗어났는지 확인
if(newW < 0 || newW >= parkWidth) {
return;
}
// 이동 중 장애물을 만나는지 확인
int start = oldW < newW ? oldW : newW;
int end = oldW < newW ? newW : oldW;
for(int i = start; i < end; i++) {
if(park[startPoint[0]][i] == 'X') {
return;
}
}
startPoint[1] = newW;
}