직접 컴파일해서 실행해보니 실행 시간이 1.5~2 배 정도 차이가 나는데, 사소한 차이가 시간초과인지 아닌지를 결정한 것 같습니다. 고칠 점을 굳이 꼽자면,
1. 같은 내용이라도 함수 호출(inRange(y,x))을 하는 것보다는 하지 않는 편이 훨씬 빠릅니다. 단순한 함수의 경우 매크로 (#define inRange(y,x) (0<=y && y < n && 0<=x && x < n))를 사용하면, 함수를 사용하지 않고 풀어 쓰는 경우와 동일한 동작 시간을 냅니다.
2. 배열을 선언하고 초기화하는 데에도 그 크기에 비례하는 시간이 소요됩니다. 이 경우에는 함수를 n번밖에 호출하지 않는데다가 배열 크기가 작아서 별로 상관없지만, 반복해서 같은 변수를 선언하는 함수가 여러 번 호출되면 상대적으로 느려집니다. 이런 경우 지역변수 대신 전역변수를 사용하는 편이 낫습니다.
3. 상수 값(1,0,-1)을 사용하는 것이 메모리 내의 값 참조(dx[i], dy[i])보다 훨씬 빠릅니다. 물론 제한시간이 여유롭다면 편의성과 가독성을 위해 상수보다는 변수를 사용하는 것이 바람직합니다.
이런 최적화는, 문제를 맞으신 뒤에 잘 짜여진(실행 시간도 빠르고 가독성도 좋은) 다른 분의 코드를 보는 것이 도움이 많이 됩니다.
rlathdwls2 4년 전
먼저 질문 읽어 주심에 감사드립니다.
퇴각 검사를 위해 돌을 새로운 위치에 놓을 수 있는지 검사하는 함수를 2가지로 만들었습니다.
possibleA는 방향을 배열에 저장한 후 반복문을 돌려 공격당할 수 있는 위치인지 검사하는 것이고
possibleB는 방향별로 반복문을 3번 돌려 공격당할 수 있는 위치 인지 검사하는 함수 입니다.
코드의 표현이 다를 뿐 수행하는 시간은 두개 다 동일하다고 생각했습니다.
하지만 possibleA는 시간초과가 발생하고 possibleB는 AC를 받습니다.
동일하다고 생각하는 함수중 왜 어떤것은 맞고 어떤것은 틀린지 알고 싶고
향후 반복문 코드를 작성할때 어떤 방식으로 해야 효율적으로 할 수 있는지 팁도 얻고 싶습니다.
긴 글 읽어 주심에 감사드립니다.