“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”
코딩테스트 입문 Day 10 조건문, 배열, 수학, 시뮬레이션
출처 : https://programmers.co.kr/
점의 위치 구하기
문제
사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.
- x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
- x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
- x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
- x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.
x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.
제한사항
- dot의 길이 = 2
- dot[0]은 x좌표를, dot[1]은 y좌표를 나타냅니다
- -500 ≤ dot의 원소 ≤ 500
- dot의 원소는 0이 아닙니다.
입출력 예
dot | result |
[2, 4] | 1 |
[-7, 9] | 2 |
입출력 예 설명
입출력 예 #1
- dot이 [2, 4]로 x 좌표와 y 좌표 모두 양수이므로 제 1 사분면에 속합니다. 따라서 1을 return 합니다.
입출력 예 #2
- dot이 [-7, 9]로 x 좌표가 음수, y 좌표가 양수이므로 제 2 사분면에 속합니다. 따라서 2를 return 합니다.
solution.js
function solution(dot) {
var x = dot[0];
var y = dot[1];
if (x > 0 && y > 0) {
return 1;
} else if (x < 0 && y > 0) {
return 2;
} else if (x < 0 && y < 0) {
return 3;
} else {
return 4;
}
}
- if (x > 0 && y > 0):
- x 좌표와 y 좌표가 모두 양수인 경우입니다.
- 이 경우에는 return 1;이 실행되어 제 1 사분면을 나타내는 값인 1을 반환합니다.
- else if (x < 0 && y > 0):
- x 좌표가 음수이고 y 좌표가 양수인 경우입니다.
- 이 경우에는 return 2;가 실행되어 제 2 사분면을 나타내는 값인 2를 반환합니다.
- else if (x < 0 && y < 0):
- x 좌표와 y 좌표가 모두 음수인 경우입니다.
- 이 경우에는 return 3;이 실행되어 제 3 사분면을 나타내는 값인 3을 반환합니다.
- else:
- 위의 모든 조건을 만족하지 않는 경우입니다. 따라서 x 좌표가 양수이고 y 좌표가 음수인 경우입니다.
- 이 경우에는 return 4;가 실행되어 제 4 사분면을 나타내는 값인 4를 반환합니다.
2차원으로 만들기
문제
정수 배열 num_list와 정수 n이 매개변수로 주어집니다. num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.
num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.
num_list | n | result |
[1, 2, 3, 4, 5, 6, 7, 8] | 2 | [[1, 2], [3, 4], [5, 6], [7, 8]] |
제한사항
- num_list의 길이는 n의 배 수개입니다.
- 0 ≤ num_list의 길이 ≤ 150
- 2 ≤ n < num_list의 길이
입출력 예
num_list | n | result |
[1, 2, 3, 4, 5, 6, 7, 8] | 2 | [[1, 2], [3, 4], [5, 6], [7, 8]] |
[100, 95, 2, 4, 5, 6, 18, 33, 948] | 3 | [[100, 95, 2], [4, 5, 6], [18, 33, 948]] |
입출력 예 설명
입출력 예 #1
- num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 2 * 4 배열로 변경한 [[1, 2], [3, 4], [5, 6], [7, 8]] 을 return합니다.
입출력 예 #2
- num_list가 [100, 95, 2, 4, 5, 6, 18, 33, 948] 로 길이가 9이고 n이 3이므로 3 * 3 배열로 변경한 [[100, 95, 2], [4, 5, 6], [18, 33, 948]] 을 return합니다.
solution.js
function solution(num_list, n) {
var answer = [];
for (var i = 0; i < num_list.length; i += n) {
var row = num_list.slice(i, i + n);
answer.push(row);
}
return answer;
}
- 함수 내부에서는 answer라는 빈 배열을 선언합니다. 이 배열은 결과로 반환될 2차원 배열입니다.
- for 루프를 사용하여 num_list 배열을 반복하면서 n개씩 나누어 새로운 행을 생성합니다. 루프 변수 i는 0부터 시작하여 n만큼씩 증가합니다.
- 반복할 때마다 num_list 배열의 i부터 i + n까지의 범위를 slice 메서드를 사용하여 추출하여 row라는 새로운 배열로 만듭니다. 이렇게 생성된 row 배열은 answer 배열에 추가됩니다.
- 반복이 끝나면 answer 배열이 완성되고, 최종적으로 answer를 반환합니다.
공 던지기
문제
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
제한사항
- 2 < numbers의 길이 < 100
- 0 < k < 1,000
- numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
- numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.
입출력 예
numbers | k | result |
[1, 2, 3, 4] | 2 | 3 |
[1, 2, 3, 4, 5, 6] | 5 | 3 |
[1, 2, 3] | 3 | 2 |
입출력 예 설명
입출력 예 #1
- 1번은 첫 번째로 3번에게 공을 던집니다.
- 3번은 두 번째로 1번에게 공을 던집니다.
입출력 예 #2
- 1번은 첫 번째로 3번에게 공을 던집니다.
- 3번은 두 번째로 5번에게 공을 던집니다.
- 5번은 세 번째로 1번에게 공을 던집니다.
- 1번은 네 번째로 3번에게 공을 던집니다.
- 3번은 다섯 번째로 5번에게 공을 던집니다.
입출력 예 #3
- 1번은 첫 번째로 3번에게 공을 던집니다.
- 3번은 두 번째로 2번에게 공을 던집니다.
- 2번은 세 번째로 1번에게 공을 던집니다.
solution.js
function solution(numbers, k) {
return numbers[(--k*2)%numbers.length];
}
- (--k * 2) % numbers.length 식은 주어진 배열에서 k번째 요소를 찾기 위한 계산을 수행합니다.
- 먼저, k를 1씩 감소시킵니다. 이는 0부터 시작하는 인덱스를 기준으로 하는 배열의 인덱스와 맞추기 위한 조치입니다. 예를 들어, k가 1일 경우 실제 인덱스는 0이어야 하므로 --k를 수행하여 k를 0으로 만듭니다.
- 다음으로, k에 2를 곱합니다. 이렇게 함으로써 numbers 배열에서 k번째 요소의 다음 요소를 찾을 수 있습니다. 예를 들어, k가 0일 경우 실제로는 0번째와 1번째 요소 사이에 있는 요소를 찾아야 합니다. k에 2를 곱하면 0 * 2 = 0이므로, 0번째 요소를 찾을 수 있습니다.
- 마지막으로, numbers.length로 나눈 나머지를 구합니다. 이는 배열의 범위를 벗어나는 경우를 처리하기 위한 조치입니다. 예를 들어, numbers.length가 5이고 k가 3일 경우, (3 * 2) % 5는 6 % 5 = 1이 됩니다. 따라서 1번째 요소를 반환합니다.
배열 회전시키기
문제
정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ numbers의 길이 ≤ 20
- direction은 "left" 와 "right" 둘 중 하나입니다.
입출력 예
numbers | direction | result |
[1, 2, 3] | "right" | [3, 1, 2] |
[4, 455, 6, 4, -1, 45, 6] | "left" | [455, 6, 4, -1, 45, 6, 4] |
입출력 예 설명
입출력 예 #1
- numbers 가 [1, 2, 3]이고 direction이 "right" 이므로 오른쪽으로 한 칸씩 회전시킨 [3, 1, 2]를 return합니다.
입출력 예 #2
- numbers 가 [4, 455, 6, 4, -1, 45, 6]이고 direction이 "left" 이므로 왼쪽으로 한 칸씩 회전시킨 [455, 6, 4, -1, 45, 6, 4]를 return합니다.
solution.js
function solution(numbers, direction) {
var answer = [...numbers];
if (direction === "left") {
var first = answer.shift();
answer.push(first);
} else if (direction === "right") {
var last = answer.pop();
answer.unshift(last);
}
return answer;
}
먼저, answer 변수에 numbers 배열을 복사하여 할당합니다. 배열의 복사는 [...numbers] 구문을 사용하여 이루어집니다. 이렇게 복사된 answer 배열은 원본 배열에 영향을 주지 않고 독립적으로 작업할 수 있습니다.
- if (direction === "left"):
- direction이 "left"인 경우, 배열을 왼쪽으로 회전시킵니다.
- answer.shift()를 사용하여 배열의 첫 번째 요소를 제거하고 반환합니다. 이 요소는 first 변수에 할당됩니다.
- 그리고 answer.push(first)를 사용하여 first 요소를 배열의 끝에 추가합니다.
- else if (direction === "right"):
- direction이 "right"인 경우, 배열을 오른쪽으로 회전시킵니다.
- answer.pop()을 사용하여 배열의 마지막 요소를 제거하고 반환합니다. 이 요소는 last 변수에 할당됩니다.
- 그리고 answer.unshift(last)를 사용하여 last 요소를 배열의 첫 번째에 추가합니다.
마지막으로, 변경된 answer 배열을 반환합니다.