mimmyum   5년 전

원 문제 TC 확인도 해보고, 질문게시판 글도 다 읽어봤는데

도대체 뭐가 문제라서 틀렸습니다가 나오는지 모르겠습니다...

TC가 다 맞았는데 틀렸다고 나오는경우는 처음이라 굉장히 당황스럽습니다.. ㅠ.ㅜ

djm03178   5년 전

답변자의 입장에서도, 197줄짜리 설명 없는 코드를 올리고 문제를 찾아달라고 하면 굉장히 당황스럽습니다.

chogahui05   5년 전

코드 단순화 먼저 시키고

다시 물어보세요.

mimmyum   5년 전

bool Snake[102][102]={false,};
bool Apple[102][102] = {false,};
queue snakemove;
queue Directions;
struct point snakeHead;

죄송합니다...

Snake배열은 현재 뱀이 차지하고 있는 자리를 나타내는 배열이고, Apple은 맵 상에서 사과가 있는 자리를 나타내는 변수입니다.

snakemove 역시 현재 뱀이 차지하고 있는 point(x,y)를 담은 큐인데, 이는 한칸 움직일 때마다 머리를 큐에 추가하고, 꼬리를 빼기위해서 만들었습니다.

Directions 큐는 처음에 입력받은 (몇초 후, 어느 방향)을 담아 놓은 큐입니다.

포인트 구조체 변수 snakeHead 는 현재 뱀의 머리 위치를 나타내는 변수입니다.

ended 변수는 벽에 닿았거나, 뱀이 자기자신의 몸에 닿았을 때 false로 바뀌면서 while문을 제어하는데 사용하는 변수입니다.

이를 바탕으로 bfs(정확히 BFS라고 부를수 있는지는 모르겠지만...) 방식으로 풀었는데,

Direction이 왼쪽 방향 오른쪽 방향으로만 움직이니깐, 상하좌우를 기준으로 0,1,2,3으로 설정하고

ended 변수가 false가 될때까지 반복하여 뱀을 움직이게 했습니다.

while문에 들어가면, 제일 처음 뱀을 한칸 이동시킵니다.(move함수)

이 move함수는 뱀이 향하고 있는 방향(dir) 을 인자로 받아서 그 방향에 맞게 한칸 진행합니다. 

한칸 진행한 다음에 이 뱀이 벽에 닿았거나, 자기 몸에 닿았는지 확인하기 위해 checkWall 함수를 실행합니다.

이 때 벽에 닿거나 자기 몸에 닿은 경우 ended변수는 true로 바뀌고 move함수를 빠져나옵니다.

만약 그렇지 않다면 뱀이 이동한 자리에 사과가 있는지를 확인합니다.

사과가 있다면 몸 길이가 1칸 늘어나서 꼬리 위치가 변하지 않고, 사과가 없다면 뱀의 마지막 위치를 snakemove큐에서 pop한다음에, snake 배열에서 꼬리 위치를 false로 바꿉니다.(makeMove함수)


이 move가 종료된 다음에 시간(초)를 1 증가시키고, direction이 바뀌는 지 확인하기 위해서 nextMoveTime을 확인합니다.

nextMoveTime이 -1이면, Direction큐에서 한개 pop해와서 그 시간으로 설정하고, 그 시간이 됐는지를 확인합니다.

만약 방향을 바꿔야하는 시간이라면 그 방향에 맞게 dir를 바꿔줍니다. 그렇지 않다면 기존 방향으로 계속 진행합니다.




프로그램 로직은 위와같이 짯는데.. 프로그램을 단순화 시킬 부분은 찾지못해서 코드는 그대로 두도록하겠습니다...

djm03178   5년 전

checkWall이 true를 리턴하는 부분은 있으나, false를 리턴하는 부분은 없습니다. 리턴을 하지 않는 경우의 동작은 정의되지 않습니다.

단순화를 시킬 수 있는 부분이라면 4방향으로 움직이는 코드를 dy와 dx를 이용하여 반복문 하나로 압축시킬 수 있고, 이렇게 하면 실수를 크게 줄일 수 있습니다.

mimmyum   5년 전

@djm03178

checkWall의 false 리턴만 추가하니까 통과가 되네요.... 이럴수가...

감사합니다.. 사소한건데 당연히 true가 아니면 false라고 생각하고 있었네요...

단순화할수 있는 부분도 잡아주셔서 감사합니다...

댓글을 작성하려면 로그인해야 합니다.