CodingTest

[Programers] 삼각달팽이 Javascript

Daesiker 2021. 2. 5. 22:19
반응형
출처
https://programmers.co.kr/learn/courses/30/lessons/68645?language=javascript

 


❓Question

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

 

 

—제한사항

  • n은 1 이상 1,000 이하입니다.

 

—입출력 예

n result
4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

 

— 입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

 


❗Solution

function solution(n) {
    let graph = [];
    let answer = [];
    //초기값을 위해서 -1로 변수 지정
    let y = -1
    let x = 0
    let number = 1
    // 요소가 모두 0인 배열 생성
    for (let i = 1; i < n + 1; i++) {
        let tmp = Array(i).fill(0)
        graph.push(tmp)
    }
    
    for (let i=0; i < n; i++) {
        for (let j = i; j < n; j++) {
            // 밑으로 내려간다.
            if (i % 3 === 0) {
                y +=1
            // 오른쪽으로 간다.
            }else if (i % 3 === 1) {
                x += 1
            //위로 올라간다.
            }else{
                y -= 1
                x -= 1
            }
            graph[y][x] = number
            number += 1
        }
    }
    //graph[i]를 차례대로 answer에 추가
    for (let i = 0; i < n; i++) {
        answer = answer.concat(graph[i])
    }
    
    return answer;
}

 

처음 문제를 접했을 때는 생각보다 까다로운줄 알았다. 하지만 규칙하나만 알게 되면 금방 풀 수 있는 문제이다. 처음에는 n만큼 원소가 아래로 내려간다. 그다음에는 n-1만큼 원소가 오른쪽으로 가고 그다음에는 n-2만큼 원소가 위쪽으로 올라간다. 이것을 n이 1이 될 때까지 반복을 한뒤 2차원 배열을 1차원 배열로 바꾸어 주면 정답이 되는 쉬운문제이다.

 

→ 처음에 모든 원소가 0인 삼각형 배열을 생성한다.

  • Array(number).fill(Any) : Any란 요소가 number개 있는 배열을 반환한다.

 

조건문을 수행하고 x와 y좌표가 올라가므로 y의 초기값은 -1을 해야지 0부터 시작된다.

 

→ i를 n만큼 반복하고 j를 n-1번 반복하는 2중 반복문을 작성하면 원하는 로직을 얻을 수 있다.

 

→ i를 3으로 나눈 나머지가 0이면 y좌표를 1더해준다. (아래로 내려감)

→ i를 3으로 나눈 나머지가 1이면 x좌표를 1더해준다. (오른쪽으로 감)

→ i를 3으로 나눈 나머지가 2이면 x와 y좌표를 1씩 빼준다.(위로 올라감)

  • x, y 둘다 1을 빼주는 이유는 위로 올라가면 배열의 인덱스가 줄기때문에 x값도 1을 빼줘야 배열 범위에 맞는다.

 

→ answer에 graph의 요소를 추가한다.

  • array1.concat(array2) : [array1 + array2]가 반환된다.

 


코딩테스트를 잘보기 위해서는 알고리즘을 많이 아는것도 중요하지만 배열, 문자열에 관한 함수를 많이 아는 것도 중요한 것 같다. 로직은 금방 보이는데 배열, 문자열 함수를 잘 몰라서 서칭을 하는 시간이 굉장히 많았던 것 같다. 코딩테스트를 시작한지 얼마 안된 사람이 나의 포스팅을 보게 되면 우선 언어를 익힌 뒤에 알고리즘을 공부하라고 조언을 해주고 싶다. 필자는 대학생 때 파이썬으로 코딩테스트를 준비를 했는데 직업 상 swift와 javascript로 코딩테스트를 준비하는 것이 돌아가더라도 더 의미있다고 생각해서 파이썬으로 풀었던 문제들을 다시 풀면서 리뷰를 하는 중이다.

 

반응형