<문제 제시>
<문제설명>
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을
없으면 0을 return 하도록 solution 함수를 완성해보세요.

<예시 입출력>

<문제 해결 과정>
수학적으로 접근했을때 두 직선이 평행하려면 두 직선의 '기울기'가 같아야한다.
기울기를 구하려면 (y증가량 / x증가량) 식을 만들어야한다.
Try 1)
int answer = 0;
int max_x = 0;
int max_y = 0;
for(int i = 0; i < dots.length; i++) {
for(int j = 0; j <= dots[i].length; j++) {
if(i < dots.length - 1 && j < dots[i].length - 1) {
// x값 대소비교
if(dots[i][0] > dots[i+1][0]) {
max_x = dots[i][0];
}
else max_x = dots[i+1][0];
// y값 대소비교
if(dots[0][j] > dots[0][j+1]) {
max_y = dots[0][j];
}
else max_y = dots[0][j+1];
}
}
}
System.out.println("max_x = " + max_x + ", max_y = " + max_y);
return answer;
모든 원소를 비교하니 두 직선의 기울기를 비교하기 힘들어졌다.
dots[0] dots[1] / dots[2] dots[3]
두 그룹으로 묶어야겠다고 생각했다.
Solution 1)
1. 평행한다는 것은 두 직선의 기울기가 일치한다는 뜻이다.
2. 기울기를 구하는 공식은 y증가량 / x증가량이다.
3. 증가량은 큰 x에서 작은 x를 차감해주면 된다.
4. 두 직선의 x값과 y값을 먼저 비교하고, 기울기를 구한다.
>> 두 직선 : dots[0], dots[1]
5. 다음 두 직선의 기울기를 구한다.
>> 두 직선 : dots[2], dots[3]
6. 기울기 일치여부를 확인한다.
7. 기울기가 일치하면 1을 반환한다.
// 첫번쨰 직선 x값의 대소비교
if(dots[0][0] > dots[1][0]) {
max_x = dots[0][0];
x_up = max_x - dots[1][0];
}
else {
max_x = dots[1][0];
x_up = max_x - dots[0][0];
}
// 첫번째 직선의 y값 대소 비교
if(dots[0][1] > dots[1][1]) {
max_y = dots[0][1];
y_up = max_y - dots[1][1];
}
else {
max_y = dots[1][1];
y_up = max_y - dots[0][1];
}
// -----------------------------
// 두번쨰 직선 x값의 대소비교
if(dots[2][0] > dots[3][0]) {
max_x = dots[2][0];
x_up = max_x - dots[3][0];
}
else {
max_x = dots[3][0];
x_up = max_x - dots[2][0];
}
// 두번째 직선의 y값 대소 비교
if(dots[2][1] > dots[3][1]) {
max_y = dots[2][1];
y_up = max_y - dots[3][1];
}
else {
max_y = dots[3][1];
y_up = max_y - dots[2][1];
}
대소비교를 하는 부분은 Math.max()를 통해 더 간소화할 수 있을 것 같다.
// 두 직선의 기울기가 일치할 시 1반환
if(lean_arr[0] == lean_arr[1]) answer = 1;
return answer;
두 직선의 기울기를 lean_arr 기울기배열에 담고,
두 기울기가 일치할때 answer = 1로 반환한다.
<전체코드>
public class parallel {
public static int solution(int[][] dots) {
int answer = 0;
// 직선 별 x,y값 대소비교
int max_x = 0;
int max_y = 0;
// 증가량
int x_up = 0;
int y_up = 0;
// 기울기
double lean = 0;
double[] lean_arr = new double[2];
// 첫번쨰 직선 x값의 대소비교
if(dots[0][0] > dots[1][0]) {
max_x = dots[0][0];
x_up = max_x - dots[1][0];
}
else {
max_x = dots[1][0];
x_up = max_x - dots[0][0];
}
// 첫번째 직선의 y값 대소 비교
if(dots[0][1] > dots[1][1]) {
max_y = dots[0][1];
y_up = max_y - dots[1][1];
}
else {
max_y = dots[1][1];
y_up = max_y - dots[0][1];
}
System.out.println("-----첫번째 직선-----");
System.out.println("max_x = " + max_x + ", max_y = " + max_y);
System.out.println("x증가량 = " + x_up + ", y증가량 = " + y_up);
lean = (double)y_up / x_up;
lean_arr[0] = lean;
System.out.println("기울기 = " + lean);
System.out.println(lean_arr[0]);
// 두번쨰 직선 x값의 대소비교
if(dots[2][0] > dots[3][0]) {
max_x = dots[2][0];
x_up = max_x - dots[3][0];
}
else {
max_x = dots[3][0];
x_up = max_x - dots[2][0];
}
// 두번째 직선의 y값 대소 비교
if(dots[2][1] > dots[3][1]) {
max_y = dots[2][1];
y_up = max_y - dots[3][1];
}
else {
max_y = dots[3][1];
y_up = max_y - dots[2][1];
}
System.out.println("-----두번째 직선-----");
System.out.println("max_x = " + max_x + ", max_y = " + max_y);
System.out.println("x증가량 = " + x_up + ", y증가량 = " + y_up);
lean = (double)y_up / x_up;
lean_arr[1] = lean;
System.out.println("기울기 = " + lean);
System.out.println(lean_arr[1]);
// 두 직선의 기울기가 일치할 시 1반환
if(lean_arr[0] == lean_arr[1]) answer = 1;
return answer;
}
public static void main(String[] args) {
int[][] dots = {{1, 4}, {9, 2}, {3, 8}, {11, 6}};
System.out.println(solution(dots));
}
}
print()문을 통해 진행과정을 보기쉽게 표현해보았다.
진행상황을 보면서 두 직선의 기울기 대소비교가 가능하여 코드 작성에 용이했다.
하지만 직선 별로 x,y값 대소비교를 하는 부분은 Math.max()로 더 간소화할 수 있을 것 같았다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120875
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '문자열 나누기' - Java (0) | 2023.05.20 |
---|---|
[프로그래머스] '겹치는 선분의 길이' - Java (1) | 2023.05.20 |
[프로그래머스] '외계어 사전' - Java (0) | 2023.05.18 |
[프로그래머스] '삼각형의 완성조건 (2)' - Java (1) | 2023.05.17 |
[프로그래머스] '안전지대' - Java (0) | 2023.05.16 |
<문제 제시>
<문제설명>
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을
없으면 0을 return 하도록 solution 함수를 완성해보세요.

<예시 입출력>

<문제 해결 과정>
수학적으로 접근했을때 두 직선이 평행하려면 두 직선의 '기울기'가 같아야한다.
기울기를 구하려면 (y증가량 / x증가량) 식을 만들어야한다.
Try 1)
int answer = 0;
int max_x = 0;
int max_y = 0;
for(int i = 0; i < dots.length; i++) {
for(int j = 0; j <= dots[i].length; j++) {
if(i < dots.length - 1 && j < dots[i].length - 1) {
// x값 대소비교
if(dots[i][0] > dots[i+1][0]) {
max_x = dots[i][0];
}
else max_x = dots[i+1][0];
// y값 대소비교
if(dots[0][j] > dots[0][j+1]) {
max_y = dots[0][j];
}
else max_y = dots[0][j+1];
}
}
}
System.out.println("max_x = " + max_x + ", max_y = " + max_y);
return answer;
모든 원소를 비교하니 두 직선의 기울기를 비교하기 힘들어졌다.
dots[0] dots[1] / dots[2] dots[3]
두 그룹으로 묶어야겠다고 생각했다.
Solution 1)
1. 평행한다는 것은 두 직선의 기울기가 일치한다는 뜻이다.
2. 기울기를 구하는 공식은 y증가량 / x증가량이다.
3. 증가량은 큰 x에서 작은 x를 차감해주면 된다.
4. 두 직선의 x값과 y값을 먼저 비교하고, 기울기를 구한다.
>> 두 직선 : dots[0], dots[1]
5. 다음 두 직선의 기울기를 구한다.
>> 두 직선 : dots[2], dots[3]
6. 기울기 일치여부를 확인한다.
7. 기울기가 일치하면 1을 반환한다.
// 첫번쨰 직선 x값의 대소비교
if(dots[0][0] > dots[1][0]) {
max_x = dots[0][0];
x_up = max_x - dots[1][0];
}
else {
max_x = dots[1][0];
x_up = max_x - dots[0][0];
}
// 첫번째 직선의 y값 대소 비교
if(dots[0][1] > dots[1][1]) {
max_y = dots[0][1];
y_up = max_y - dots[1][1];
}
else {
max_y = dots[1][1];
y_up = max_y - dots[0][1];
}
// -----------------------------
// 두번쨰 직선 x값의 대소비교
if(dots[2][0] > dots[3][0]) {
max_x = dots[2][0];
x_up = max_x - dots[3][0];
}
else {
max_x = dots[3][0];
x_up = max_x - dots[2][0];
}
// 두번째 직선의 y값 대소 비교
if(dots[2][1] > dots[3][1]) {
max_y = dots[2][1];
y_up = max_y - dots[3][1];
}
else {
max_y = dots[3][1];
y_up = max_y - dots[2][1];
}
대소비교를 하는 부분은 Math.max()를 통해 더 간소화할 수 있을 것 같다.
// 두 직선의 기울기가 일치할 시 1반환
if(lean_arr[0] == lean_arr[1]) answer = 1;
return answer;
두 직선의 기울기를 lean_arr 기울기배열에 담고,
두 기울기가 일치할때 answer = 1로 반환한다.
<전체코드>
public class parallel {
public static int solution(int[][] dots) {
int answer = 0;
// 직선 별 x,y값 대소비교
int max_x = 0;
int max_y = 0;
// 증가량
int x_up = 0;
int y_up = 0;
// 기울기
double lean = 0;
double[] lean_arr = new double[2];
// 첫번쨰 직선 x값의 대소비교
if(dots[0][0] > dots[1][0]) {
max_x = dots[0][0];
x_up = max_x - dots[1][0];
}
else {
max_x = dots[1][0];
x_up = max_x - dots[0][0];
}
// 첫번째 직선의 y값 대소 비교
if(dots[0][1] > dots[1][1]) {
max_y = dots[0][1];
y_up = max_y - dots[1][1];
}
else {
max_y = dots[1][1];
y_up = max_y - dots[0][1];
}
System.out.println("-----첫번째 직선-----");
System.out.println("max_x = " + max_x + ", max_y = " + max_y);
System.out.println("x증가량 = " + x_up + ", y증가량 = " + y_up);
lean = (double)y_up / x_up;
lean_arr[0] = lean;
System.out.println("기울기 = " + lean);
System.out.println(lean_arr[0]);
// 두번쨰 직선 x값의 대소비교
if(dots[2][0] > dots[3][0]) {
max_x = dots[2][0];
x_up = max_x - dots[3][0];
}
else {
max_x = dots[3][0];
x_up = max_x - dots[2][0];
}
// 두번째 직선의 y값 대소 비교
if(dots[2][1] > dots[3][1]) {
max_y = dots[2][1];
y_up = max_y - dots[3][1];
}
else {
max_y = dots[3][1];
y_up = max_y - dots[2][1];
}
System.out.println("-----두번째 직선-----");
System.out.println("max_x = " + max_x + ", max_y = " + max_y);
System.out.println("x증가량 = " + x_up + ", y증가량 = " + y_up);
lean = (double)y_up / x_up;
lean_arr[1] = lean;
System.out.println("기울기 = " + lean);
System.out.println(lean_arr[1]);
// 두 직선의 기울기가 일치할 시 1반환
if(lean_arr[0] == lean_arr[1]) answer = 1;
return answer;
}
public static void main(String[] args) {
int[][] dots = {{1, 4}, {9, 2}, {3, 8}, {11, 6}};
System.out.println(solution(dots));
}
}
print()문을 통해 진행과정을 보기쉽게 표현해보았다.
진행상황을 보면서 두 직선의 기울기 대소비교가 가능하여 코드 작성에 용이했다.
하지만 직선 별로 x,y값 대소비교를 하는 부분은 Math.max()로 더 간소화할 수 있을 것 같았다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120875
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '문자열 나누기' - Java (0) | 2023.05.20 |
---|---|
[프로그래머스] '겹치는 선분의 길이' - Java (1) | 2023.05.20 |
[프로그래머스] '외계어 사전' - Java (0) | 2023.05.18 |
[프로그래머스] '삼각형의 완성조건 (2)' - Java (1) | 2023.05.17 |
[프로그래머스] '안전지대' - Java (0) | 2023.05.16 |