Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- @NoArgsConstructor
- 기본생성자
- stringbuffer
- HTML
- 파이썬
- html tag
- CRUD
- github
- 자바
- @AllArgsConstructor
- Python
- 알고리즘
- Codeup
- 상속
- 캡슐화
- 브랜치
- git
- 코드업
- 부트캠프
- java
- DTO
- lv1
- 에러
- 부스트코스
- @builder
- 프로그래머스
- 깃허브
- entity
- SQL
- HashSet
Archives
- Today
- Total
잉?
[프로그래머스] 직사각형 넓이 구하기 + 다차원 배열(2차원 배열) 본문
문제 설명
2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.
제한사항
- dots의 길이 = 4
- dots의 원소의 길이 = 2
- -256 < dots[i]의 원소 < 256
- 잘못된 입력은 주어지지 않습니다.
입출력 예
dots | result |
[[1, 1], [2, 1], [2, 2], [1, 2]] | 1 |
[[-1, -1], [1, 1], [1, -1], [-1, 1]] | 4 |
import java.util.ArrayList;
import java.util.HashSet;
class Solution {
public int solution(int[][] a) {
int answer = 0;
HashSet<Integer> xc=new HashSet<Integer>(); //x좌표를 담을 set
for(int i=0; i<4; i++) {
xc.add(a[i][0]);
System.out.println(xc);
}
ArrayList<Integer> arr1=new ArrayList<Integer>(xc);
int x1=arr1.get(0); //첫번째 x좌표
int x2=arr1.get(1); //두번째 x좌표
HashSet<Integer> yc=new HashSet<Integer>(); //y좌표를 담을 set
for(int i=0; i<4; i++) {
yc.add(a[i][1]);
}
ArrayList<Integer> arr2=new ArrayList<Integer>(yc);
int y1=arr2.get(0); //첫번째 y좌표
int y2=arr2.get(1); //두번째 y좌표
answer=Math.abs((x1-x2)*(y1-y2)); // Math.abs → 절대값 구하는 함수
return answer;
}
}
위의 알고리즘은 HashSet과 Math.abs 함수를 이용하여 풀었다는 것이 핵심이다.
HashSet을 이용하여 중복된 x좌표값을 제거해주었다.
[[1, 1], [2, 1], [2, 2], [1, 2]] → 여기서 X좌표는 1, 2, 2, 1인데 중복값을 제거하면 1하고 2이다.
Math.abs 함수를 이용하여 음수값이 나왔을 경우에 절대값을 반환한다.
class Solution {
public int solution(int[][] a) {
int answer = 0;
// 편법인데 제한사항에 있는 dots[i]의 최소, 최대길이 만큼 넣어준다.
int max_x = -257;
int min_x = 257;
int max_y = -257;
int min_y = 257;
// 이부분이 x좌표를 구하는 부분인데 x좌표를 구하기 위해서는 a[j][i] 배열에서 i값이 0이어야한다.
// i값을 0,1차례대로 넣어주는것은 y좌표까지 구해오는 것.
// 예) i0 i1 → i0이 x좌표, i1이 y좌표이다.
// [1, 1]
// [2, 1]
// [2, 2]
// [1, 2]
// i를 고정값으로 넣어주는 것.
for (int j = 0; j <4 ; j++) {
if (a[j][0]>=max_x){
max_x=a[j][0];
}
if(a[j][0]<=min_x){
min_x=a[j][0];
}
}
// y좌표 구하는 곳
for (int i = 0; i <4 ; i++) {
if (a[i][1]>=max_y){
max_y=a[i][1];
}
if(a[i][1]<=min_y){
min_y=a[i][1];
}
}
// 변의 길이를 구한다.
int x = max_x-min_x;
int y = max_y-min_y;
// 한 변의 길이가 음수일 경우 -를 곱해 양수로 반환
if(x < 0 || y < 0){
answer = -(x*y);
}else{
answer = x*y;
}
return answer;
}
}
위의 알고리즘은 HashSet과 Math.abs 함수 없이 해결한 알고리즘이다.
'알고리즘_Algorism > 프로그래머스' 카테고리의 다른 글
[프로그래머스] lv.1 콜라 문제 (JAVA 자바) (0) | 2023.08.04 |
---|---|
[프로그래머스] lv.1 푸드 파이트 대회 (JAVA 자바) (0) | 2023.08.02 |
[프로그래머스] 두 개 뽑아서 더하기 (JAVA 자바) (0) | 2023.07.31 |
[프로그래머스] 문자열 내 마음대로 정렬하기 (JAVA 자바) (0) | 2023.07.27 |
[프로그래머스] 문자열 뒤집기 + StringBuffer 사용법, 사용이유 (0) | 2023.05.30 |
Comments