일단 그림이 있어서 좋다. 아무래도 글만있는 문제보다는 그림이 같이있는게 훨씬 이해가 편하다 ㅎㅎ..
대충느낌을 보니까 제일 왼쪽 대각선을 사각형의 제일 왼쪽 변이라고 생각하고 아래는 그대로 아래, 오른쪽 대각선은 대각선으로 생각하고 칸을 채우는 식으로 풀어보면 될듯하다.
문제는 숫자들을 어떻게 채워나가느냐인데 x,y 좌표로 이중배열안에 숫자를 채우는 방법으로 풀어볼 것 이다.
변수를 하나 만들어서 방향을 선택하고 방향에따라 다른 규칙을 적용하면 된다. 규칙을 먼저 찾아보자.
이 규칙들을 토대로 코드를 짜볼 것이다.
n
의 길이를 갖고 1씩 줄어들기때문에 n downTo 1
의 범위로 반복문을 돌린다.direction
을 0으로 선언했기때문에 아래방향부터 시작.arr
의 가로와 세로(x
,y
)에 count
를 넣고 count
는 공통적으로 +1,x
를 +1 해준다.direction = 1
)의 시작점으로 x
를 -1, y
를 +1해서 옮겨준다.direction
을 1로 바뀌었기때문에 오른쪽방향 시작.arr
의 가로와 세로(x
,y
)에 count
를 넣고 count
는 공통적으로 +1,y
를 +1 해준다.direction = 2
)의 시작점으로 x
를 -1, y
를 -2해서 옮겨준다.direction
을 2로 바뀌었기때문에 위대각방향 시작.arr
의 가로와 세로(x
,y
)에 count
를 넣고 count
는 공통적으로 +1,x
와y
를 -1 해준다.direction = 0
)의 시작점으로 x
를 +2, y
를 +1해서 옮겨준다.direction
을 1씩 올려주고 만약 direction
이 3이되면 다시 아래방향으로 향하도록 0을 넣어준다.answer
에 더해준다.레고레고
길이가 길지만 꽤나 간단한 코드가 만들어졌다. 테스트도 돌려보자.
...? n의 최대값이 1000이라고 명시되어있는데 아무래도 길이가 너무 길어지면 오류가 나는듯하다.
연산속도를 올려주고 코드의 효율성을 올릴 수 있는 방법을 찾아야 할듯하다.
if
문을 when
문으로 바꾸어봤는데 역시나 큰 차이가 없다. 아니 사실상 더 오래걸리는 경우가 많다.
원소가 0인 경우를 모두 탐색하지 않도록 첫번째 0을 만났을 때 break
를 걸어보았다. 전혀 상관이 없다.
배열에 담기는 좌표의 증가, 감소값을 하나로 합쳤다. 전혀 상관이 없다.
인터넷을 많이 찾아보다가 연산의 속도를 제일 높일 수 있는 것은 배열의 크기를 미리 할당하는 것 이었다. n
의 값에 따라서 배열의 크기를 미리 알 수 있으므로 크기를 선언해주고 마지막에 더하는 것이 아닌 매핑시켜주는 느낌으로 하니까 속도가 말도안되게 줄었다.
오늘의 얻은점. 배열의 크기를 알고 있을 때는 꼭 고정배열로 사용하자.