출처
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로 코딩테스트를 준비하는 것이 돌아가더라도 더 의미있다고 생각해서 파이썬으로 풀었던 문제들을 다시 풀면서 리뷰를 하는 중이다.
Uploaded by Notion2Tistory v1.1.0