lawliet777   4년 전

정말 어렵게 어렵게 취업을 위해 공부중인데

하루종일 고민해서 짠 코드가 틀려버리니...멘탈이 나가네요...


각설하고,

다른분의 풀이를 보니까 회전하여서 상 하 좌 우를 한번에 처리하였던데..

저는 아직 걸음마 수준이라 다음과 같이 4개의 함수를 각각 작성하고, switch case문으로 dfs를 돌렸네요.

아래 코드에서 정답과 다르게 나오는 부분을 좀 여쭤봐도 될까요?

제가 디버깅한 바로는 제대로 나오는것 같은데...ㅠㅠ 부탁드립니다.

seico75   4년 전

이 문제와 같이 복잡한 연산 끝에 단순한 결과가 나오는 경우는 중간 결과들이 정상적인지 확인을 해보셔야 합니다.

답이 간단해서 몇몇 예제의 답은 맞아도 중간 결과는 엉뚱할 수 있습니다. (즉, 계산이 엉뚱하게 되고 있을 수도..)

1.

dfs로 up/down/left/right 를 다 써치를 하는데... 이 경우는 자식이 4개씩 있는 트리를 순회하는 것이라는 아시죠?

즉, up/up/up/up/up 하고 나서 하나 위로 올라가서 down 을 수행하니까 up/up/up/up/down 을 계산하는 것인데...

195 라인에서는 제일 처음으로 돌리네요. 그러면  up/up/up/up/down 이 아니라 down 이 되는거죠.

2.

중간 결과를 체크하기 위한 코드를 짜고 몇가지 경우를 돌렸습니다. 

main 함수 수정(테스트를 위한) 및 함수 두개 추가하고 아래 입력을 넣으면 예상 외의 결과를 보여주네요.

3
2 4 8
2 4 8
2 4 8

lawliet777   4년 전

댓글 너무 감사합니다..!!

이전 정보를 저장해서 backtrack한다는게 쉽지 않네요...

저렇게 단순한게 아니라, 메모해야할 것이 더 많은거 같은데..

매번 dfs를 실행하기 전에 backup_board로 board의 내용을 옮겨주는것이 비효율적인것 같기도 하구요ㅠㅠ

다른 방식으로 코드를 구현하는게 일반적일까요?(메모를 하는것이 아닌..?어떤..?)

답변 너무 감사합니다!

lawliet777   4년 전

아래처럼 바꿨는데, 백트레킹이 잘 안되네요 ㅠㅠㅠ 

seico75   4년 전

4개 움직이는 함수 중에서 정상 동작하는 것은 up 밖에 없어 보입니다.


seico75   4년 전

잘 안되면 링크 참고해보세요. https://ideone.com/kKUJDx

그리고 지금 작성하신 것이 up/down 등의 함수에서 temp 배열을 쓰는데, 배열 백업하는 것과 중복되는 것 같습니다.

이것을 잘 활용하면 백업을 없앨 수 있을 것 같습니다.

이것은 아래 링크... https://ideone.com/9MDG7L

lawliet777   4년 전

주말동안 사이트를 못들어 왔는데, 직접 코드를 재작성 해주셔서 참고할 수 있게 도와주시니 감사할 따름이네요...ㅠㅠㅠ감동입니다....

자기 전에 들어와서 말씀듣고 혼자서 먼저 수정해 보았는데, 보니까 말씀데로 down과 right두개가 말썽이네요(위에 처음에 올린 코드는 심지어 left right함수의 동작 네이밍마져 바꿔져 있는...)

어렵다고 느낀 문제를 한문제 풀어나갈 때 마다, 제 코드습관의 나쁜점을 고쳐나가야 겠다는 생각이 또 듭니다.

특히 말씀데로 이렇게 코드를 복붙 형식으로 비슷한 동작을 하는 함수를 다시 짤 때,

더욱 더 주의하고 재 검사가 필요하다는 것도 느꼈고요...

참고해주신 코드처럼 dfs에 배열을 그냥 넘겨버리는 것도 하나의 좋은 방법이 된다는점 배우고 갑니다.

여러모로 답변해 주셔서 정말 감사합니다!! 복받으실 거에요^^

seico75   4년 전

저도 덕분에 공부 많이 했고 만드신 소스 아이디어로 제 코드도 업그레이드 했네요. 다음엔 hard도 도전해보시죠.

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