happyhoo   2년 전

예제에 대한 결과는 잘 나오는데 제출하면 틀렸다고 합니다.

제가 분명 놓치는 부분이 있을 텐데  그게 어떤 부분인지 잘 모르겠습니다.

도움 부탁드립니다.


감사합니다.

bamgoesn   2년 전

일단 제가 발견한 오류들만 적겠습니다.

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

우선 실질적으로 출력에는 영향을 주지 않는 오류입니다. 

테스트케이스 종료 후 dir를 초기화 안 하셨습니다. 때문에 다음 테스트케이스에서 이전 테스트케이스가 끝났을 때 방향을 그대로 갖고 시작하게 됩니다. 이 문제에선 최종 직사각형 넓이만 구하면 되기 때문에 정답에 영향은 없습니다.

L이 들어왔을 때 우회전을 하고 R이 들어왔을 때 좌회전을 하고 있습니다. 이 역시 상황을 좌우대칭시킬 뿐이므로 정답에는 영향을 주지 않습니다.

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

다음은 제가 발견한 정답에 영향을 주는 오류입니다.

5행에서 input 배열의 길이를 500으로 하셨는데, 입력되는 문자열의 최대 길이가 500일 땐 그보다 조금 더 여유를 줘서 입력 문자열 배열을 선언해야 합니다. 문자열의 끝에는 널문자가 와야 하기 때문에 여유 공간이 최소한 하나는 있어야 하며, 입력에서의 공백 등과 관련된 문제로 인해 2~3칸 정도 여유를 더 주는 게 좋다고 합니다. 어차피 문자열 몇 개는 공간 차이도 별로 안 나서 저는 10개 정도 여유를 주는 편입니다.

그리고 run 함수 어딘가에 오타가 났습니다. 반례를 첨부해 드릴 테니, 한번 직접 디버깅해보세요.

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

한편 구현을 거의 실수 없이 하는 것도 실력인데, 이를 위한 팁을 하나 드리겠습니다.

run 함수에서 현재 방향에 따라, 앞으로 가냐 뒤로 가냐에 따라 총 8가지로 조건을 나누셨는데, 각각의 경우에 처리하는 방식이 유사하다는 걸 확인할 수 있죠? 이와 같이 반복되는 코드가 있을 땐 머리를 조금 써서 코드를 축약할 수 있습니다. (좋은 의미로 축약)

격자 위에서 물체가 움직이는 것을 구현할 때 xaxis와 yaxis 배열을 따로 둬서 움직임을 처리하는 건 잘 하셨습니다만, compass의 방향과 xaxis/yaxis의 방향이 서로 일치하지 않습니다.

이 배열의 인덱스와 방향을 일치시키면 idx의 값을 사용해서 run 함수를 단순화할 수 있겠죠? 즉 xaxis[] = {0, -1, 0, 1}; yaxis[] = {1, 0, -1, 0}으로 두면 조건문을 v=='F'와 v=='B' 둘로만 나눌 수 있을 테니까요.

이렇게 하면 앞으로 가는 동작과 뒤로 가는 동작을 하나로 묶음으로써 오직 두 가지 경우만 신경쓸 수 있게 되며, 따라서 실수도 줄어들고 실수하더라도 고치기 쉬워집니다.

사소하지만 navi 함수에서도 두 경우에서 idx가 0과 3 사이에 있는지 아닌지 확인하는 코드가 중복되므로, 이를 if문 밖으로 꺼내서, if문에선 idx를 증감하기만 하고 범위 내로 맞추는 건 따로 처리하는 식으로 하면 코드가 더욱 깔끔해집니다.

bamgoesn   2년 전

+ idx의 값을 사용해서 run함수를 단순화한다는 건 대략 다음과 같은 방법을 사용한다는 뜻입니다.

bamgoesn   2년 전

+ input은 char 배열로 사실상 포인터여서 77행에서 &input 대신 input을 쓰는 게 올바릅니다. 컴파일러가 알아서 처리해주는 것 같긴 하지만, 컴파일러 경고가 발생하면 꼭 확인해주세요!

happyhoo   2년 전

bamgoesn 님 진심으로 감사합니다.

선생님께서 말씀해주신 부분 유념하면서 계속 공부하겠습니다.


감사합니다!

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