삼각 달팽이

최진훈·2022년 4월 1일
0

programmers

목록 보기
60/73


일단 그림이 있어서 좋다. 아무래도 글만있는 문제보다는 그림이 같이있는게 훨씬 이해가 편하다 ㅎㅎ..
대충느낌을 보니까 제일 왼쪽 대각선을 사각형의 제일 왼쪽 변이라고 생각하고 아래는 그대로 아래, 오른쪽 대각선은 대각선으로 생각하고 칸을 채우는 식으로 풀어보면 될듯하다.

문제는 숫자들을 어떻게 채워나가느냐인데 x,y 좌표로 이중배열안에 숫자를 채우는 방법으로 풀어볼 것 이다.
변수를 하나 만들어서 방향을 선택하고 방향에따라 다른 규칙을 적용하면 된다. 규칙을 먼저 찾아보자.

이 규칙들을 토대로 코드를 짜볼 것이다.

  1. 가로,세로,방향,사각형,들어갈 숫자들이 담길 변수를 선언한다.
  2. 첫번째줄(왼쪽 아래로 내려가는 줄)부터 n의 길이를 갖고 1씩 줄어들기때문에 n downTo 1의 범위로 반복문을 돌린다.
  3. 방향에 따라 세가지 경우로 나뉜다.
  4. direction을 0으로 선언했기때문에 아래방향부터 시작.
    4-1. 반복문안에서 arr의 가로와 세로(x,y)에 count를 넣고 count는 공통적으로 +1,
    아래방향이기 때문에 위에서 구한 규칙인 x를 +1 해준다.
    4-2. 반복문이 끝나면 다음 방향인 오른쪽방향(direction = 1)의 시작점으로 x를 -1, y를 +1해서 옮겨준다.
  5. direction을 1로 바뀌었기때문에 오른쪽방향 시작.
    5-1. 반복문안에서 arr의 가로와 세로(x,y)에 count를 넣고 count는 공통적으로 +1,
    오른쪽방향이기 때문에 위에서 구한 규칙인 y를 +1 해준다.
    5-2. 반복문이 끝나면 다음 방향인 위대각방향(direction = 2)의 시작점으로 x를 -1, y를 -2해서 옮겨준다.
  6. direction을 2로 바뀌었기때문에 위대각방향 시작.
    6-1. 반복문안에서 arr의 가로와 세로(x,y)에 count를 넣고 count는 공통적으로 +1,
    위대각방향이기 때문에 위에서 구한 규칙인 xy를 -1 해준다.
    6-2. 반복문이 끝나면 다음 방향인 아래방향(direction = 0)의 시작점으로 x를 +2, y를 +1해서 옮겨준다.
  7. 각 한방향의 연산이 끝나면 direction을 1씩 올려주고 만약 direction이 3이되면 다시 아래방향으로 향하도록 0을 넣어준다.
  8. 완성된 배열안에 숫자가 들어가지않은 공간은 0으로 채워져 있기 때문에 0이아닌경우만 차례로 answer에 더해준다.

레고레고



길이가 길지만 꽤나 간단한 코드가 만들어졌다. 테스트도 돌려보자.

...? n의 최대값이 1000이라고 명시되어있는데 아무래도 길이가 너무 길어지면 오류가 나는듯하다.
연산속도를 올려주고 코드의 효율성을 올릴 수 있는 방법을 찾아야 할듯하다.




if문을 when문으로 바꾸어봤는데 역시나 큰 차이가 없다. 아니 사실상 더 오래걸리는 경우가 많다.



원소가 0인 경우를 모두 탐색하지 않도록 첫번째 0을 만났을 때 break를 걸어보았다. 전혀 상관이 없다.



배열에 담기는 좌표의 증가, 감소값을 하나로 합쳤다. 전혀 상관이 없다.



인터넷을 많이 찾아보다가 연산의 속도를 제일 높일 수 있는 것은 배열의 크기를 미리 할당하는 것 이었다. n의 값에 따라서 배열의 크기를 미리 알 수 있으므로 크기를 선언해주고 마지막에 더하는 것이 아닌 매핑시켜주는 느낌으로 하니까 속도가 말도안되게 줄었다.

오늘의 얻은점. 배열의 크기를 알고 있을 때는 꼭 고정배열로 사용하자.

profile
레고레고

0개의 댓글