문제를 풀다보면 무언가에 반사되거나 부딪혀서 방향이 꺾이는 문제를 볼 수 있습니다.
아래의 그림이 예시입니다.
행을 x로, 열을 y로 쳤을 때
1 2 3 | int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; | cs |
dx[0], dy[0] 은 위, dx[1], dy[1]은 아래
dx[2], dy[2] 은 왼쪽, dx[3], dy[3]은 오른쪽
입니다.
처음에 문제를 이렇게 해결했었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | int move(int direct, int mirror) { if(mirror == 0) return direct; switch(direct) { case 0: if(mirror == 1) return 3; else return 2; break; case 1: if(mirror == 1) return 2; else return 3; break; case 2: if(mirror == 1) return 1; else return 0; break; case 3: if(mirror == 1) return 0; else return 1; break; } } | cs |
그림을 그려보고 방향과 반사되는 면에 일일이 경우를 나눴습니다.
그리고.. 다른 사람의 코드를 분석하던 중에.....
1 2 3 4 5 6 | int move(int direct, int mirror) { if(mirror == 0) return direct; else if(mirror == 1) return 3 - direct; else return (direct + 2) % 4; } | cs |
이렇게 간단한 소스를 찾을 수 있었습니다.
원리는 잘 모르겠으나... 하나씩 대입해보니 일치했습니다.
방향 변환하는 것이 자주 나오니깐... 이렇게 시간을 단축할 수 있겠습니다.!
'알고리즘 > 문제풀이 팁' 카테고리의 다른 글
scanf로 EOF까지 입력 받기 팁 (0) | 2017.07.06 |
---|