코딩테스트 - 프로그래머스/JAVA
[프로그래머스 / 코딩테스트 입문 / 자바(JAVA)] 평행
읁;
2024. 3. 5. 13:19
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120875
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▼ ▼ ▼
정답 풀이로 바로 가기
▲ ▲ ▲
내 풀이 1
로직
지금 보니 좀 바보같은.. 로직이다.
점 4개가 있을 때, 아래 표시해둔 선분들의 길이들끼리 같은 길이를 가지고 있으면 평행한 선이 있다고 생각했다.
(파란 삼각형의 밑변, 높이가 서로 같거나, 노란 삼각형의 밑변, 높이가 서로 같거나...)
코드
import java.util.*;
class Solution {
public int solution(int[][] dots) {
int[] Y = new int[dots.length];
int[] X = new int[dots.length];
for(int i=0; i<dots.length; i++) {
X[i] = dots[i][1];
Y[i] = dots[i][0];
}
Arrays.sort(Y);
Arrays.sort(X);
boolean y = (Y[3] - Y[1] == Y[2] - Y[0]);
boolean x = (X[3] - X[2] == X[1] - X[0]);
boolean a = x && y;
y = (Y[1] - Y[0] == Y[3] - Y[2]);
x = (X[3] - X[1] == X[2] - X[0]);
boolean b = x && y;
if(a||b) return 1;
return 0;
}
}
채점 결과
정확성 테스트
테스트 1 〉 실패 (0.36ms, 72.2MB)
테스트 2 〉 통과 (0.47ms, 73.4MB)
테스트 3 〉 통과 (0.36ms, 65.2MB)
테스트 4 〉 통과 (0.38ms, 74.7MB)
테스트 5 〉 통과 (0.37ms, 74.8MB)
테스트 6 〉 통과 (0.40ms, 73.9MB)
테스트 7 〉 통과 (0.32ms, 69.7MB)
테스트 8 〉 통과 (0.50ms, 82.6MB)
테스트 9 〉 통과 (0.45ms, 71.8MB)
테스트 10 〉 실패 (0.37ms, 80.1MB)
테스트 11 〉 통과 (0.54ms, 75.9MB)
테스트 12 〉 통과 (0.52ms, 74MB)
테스트 13 〉 통과 (0.33ms, 72.2MB)
테스트 14 〉 통과 (0.39ms, 71MB)
테스트 15 〉 통과 (0.40ms, 79MB)
테스트 16 〉 통과 (0.37ms, 71MB)
테스트 17 〉 통과 (0.35ms, 72.1MB)
채점 결과
정확성: 88.2
합계: 88.2 / 100.0
내 풀이 2
로직
선분을 이었을 때의 직선의 방향을 생각하지 않았다는 것을 깨달았다.
같은 값이라도 음수냐 양수냐에 따라서 방향이 달라진다.
직선의 기울기 공식을 참고해서, 다시 식을 세우자.
직선의 기울기 공식 = y값의 증가량 / x값의 증가량
하지만 틀렸다. 기울기를 직접 구하지 않고 각각 증가량 간의 비교만 했기 때문에...
코드
import java.util.*;
class Solution {
public int solution(int[][] dots) {
// 기울기 = y의 증가량 / x의 증가량
// 1. 점 1-2, 3-4 의 기울기 비교
// 1-1. 점1 - 점2의 직선 기울기
int aY = dots[0][0] - dots[1][0]; // y의 증가량
int aX = dots[0][1] - dots[1][1]; // x의 증가량
// 1-2. 점3 - 점4의 직선 기울기
int bY = dots[2][0] - dots[3][0];
int bX = dots[2][1] - dots[3][1];
System.out.println(aY + " " + bY);
System.out.println(aX + " " + bX);
boolean A = (aY == bY) && (aX == bX);
// 2. 점 1-4, 2-3 의 기울기 비교
// 2-1. 점1 - 점4의 직선 기울기
aY = dots[0][0] - dots[3][0];
aX = dots[0][1] - dots[3][1];
// 2-2. 점2 - 점3의 직선 기울기
bY = dots[1][0] - dots[2][0];
bX = dots[1][1] - dots[2][1];
System.out.println(aY + " " + bY);
System.out.println(aX + " " + bX);
boolean B = (aY == bY) && (aX == bX);
// 3. 1-3 2-4의 기울기 비교
// 3-1. 점1 - 점3의 직선 기울기
aY = dots[0][0] - dots[2][0];
aX = dots[0][1] - dots[2][1];
// 3-2. 점2 - 점4의 직선 기울기
bY = dots[1][0] - dots[3][0];
bX = dots[1][1] - dots[3][1];
System.out.println(aY + " " + bY);
System.out.println(aX + " " + bX);
boolean C = (aY == bY) && (aX == bX);
if(A||B||C) return 1;
return 0;
}
}
채점결과
정확성 테스트
테스트 1 〉 실패 (8.30ms, 74.9MB)
테스트 2 〉 통과 (9.69ms, 79.1MB)
테스트 3 〉 통과 (11.61ms, 75.8MB)
테스트 4 〉 통과 (9.98ms, 79.3MB)
테스트 5 〉 실패 (8.97ms, 78.3MB)
테스트 6 〉 통과 (9.27ms, 85.4MB)
테스트 7 〉 통과 (14.51ms, 88.8MB)
테스트 8 〉 통과 (10.76ms, 74.2MB)
테스트 9 〉 통과 (10.83ms, 79.8MB)
테스트 10 〉 실패 (8.69ms, 79MB)
테스트 11 〉 통과 (8.42ms, 73.4MB)
테스트 12 〉 통과 (8.13ms, 78.1MB)
테스트 13 〉 통과 (10.79ms, 78.9MB)
테스트 14 〉 통과 (10.22ms, 73.5MB)
테스트 15 〉 통과 (8.14ms, 77.6MB)
테스트 16 〉 통과 (8.12ms, 73.1MB)
테스트 17 〉 통과 (8.12ms, 78.2MB)
채점 결과
정확성: 82.4
합계: 82.4 / 100.0
내 풀이 3
로직
아래와 같은 경우, y값의 증가량과 x값의 증가량이 서로 달라도
기울기가 같기 때문에 1을 return 해야한다.
하지만 내 풀이2의 코드로는 증가량만을 서로 비교하기 때문에 1을 return할 수 없다.
증가량이 아닌, 기울기를 직접 비교해야한다.
직선의 기울기 공식 = y값의 증가량 / x값의 증가량
코드
import java.util.*;
class Solution {
public int solution(int[][] dots) {
// 기울기 = y의 증가량 / x의 증가량
// 1. 점 1-2, 3-4 의 기울기 비교
// 1-1. 점1 - 점2의 직선 기울기
double aY = dots[0][0] - dots[1][0]; // y의 증가량
double aX = dots[0][1] - dots[1][1]; // x의 증가량
// 1-2. 점3 - 점4의 직선 기울기
double bY = dots[2][0] - dots[3][0];
double bX = dots[2][1] - dots[3][1];
boolean A = (aY/aX == bY/bX);
// 2. 점 1-4, 2-3 의 기울기 비교
// 2-1. 점1 - 점4의 직선 기울기
aY = dots[0][0] - dots[3][0];
aX = dots[0][1] - dots[3][1];
// 2-2. 점2 - 점3의 직선 기울기
bY = dots[1][0] - dots[2][0];
bX = dots[1][1] - dots[2][1];
boolean B = (aY/aX == bY/bX);
// 3. 1-3 2-4의 기울기 비교
// 3-1. 점1 - 점3의 직선 기울기
aY = dots[0][0] - dots[2][0];
aX = dots[0][1] - dots[2][1];
// 3-2. 점2 - 점4의 직선 기울기
bY = dots[1][0] - dots[3][0];
bX = dots[1][1] - dots[3][1];
boolean C = (aY/aX == bY/bX);
if(A||B||C) return 1;
return 0;
}
}
채점 결과
정확성 테스트
테스트 1 〉 통과 (0.03ms, 74.4MB)
테스트 2 〉 통과 (0.02ms, 73.8MB)
테스트 3 〉 통과 (0.02ms, 71.8MB)
테스트 4 〉 통과 (0.03ms, 75.6MB)
테스트 5 〉 통과 (0.02ms, 66.6MB)
테스트 6 〉 통과 (0.02ms, 72.9MB)
테스트 7 〉 통과 (0.03ms, 75MB)
테스트 8 〉 통과 (0.02ms, 80.4MB)
테스트 9 〉 통과 (0.03ms, 77.8MB)
테스트 10 〉 통과 (0.02ms, 75.2MB)
테스트 11 〉 통과 (0.03ms, 77.9MB)
테스트 12 〉 통과 (0.02ms, 74.2MB)
테스트 13 〉 통과 (0.02ms, 71.6MB)
테스트 14 〉 통과 (0.03ms, 75.8MB)
테스트 15 〉 통과 (0.02ms, 77.2MB)
테스트 16 〉 통과 (0.01ms, 73.8MB)
테스트 17 〉 통과 (0.03ms, 76.1MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0