공부/알고리즘&자료구조

항해99 문제30번풀이 (최소직사각형,프로그래머스)

youngble 2021. 11. 11. 15:26

 

https://programmers.co.kr/learn/courses/30/lessons/86491

 

코딩테스트 연습 - 최소직사각형

[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120 [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133

programmers.co.kr

 

 

내가푼 방식:

접근법

가로 세로중 가장 큰 수를 일단 찾고 그 max 값을 기준으로 잡고

max값을 가진 명함의 나머지 길이를 다른 명함들의 가로,세로 와 비교를 한다, 이때 각각의 명함들의 최소값인 것을 max명함의 나머지길이와 비교하여 다른 명함의 최소값이 크다면
그 길이만 max값을 가진 명함의 다른 길이에 교체한다.
 
왜 각각의 명함의 최소값과 max값을 가진 명함의 나머지 길이와 비교하는 이유는
제일 큰 max 값을 구할때 이미 모든 명함들이 가진 수와 비교했기때문에 max이외엔 더 큰 수가 없다. 따라서 그방향으로 돌려서 넣었을때 안들어가는 경우는 없다, 하지만 나머지 부분의 길이는 들어가는지 모르기때문에 나머지값만 다른 명함들과 비교를 해야하는데,  max값을 가진 명함의 나머지 값과, 각각의 카드의 최소길이를 비교했을때 각각 다른 명함들의 최소길이가 더 크다면 안들어 갈테니 들어가게 그 최소값만 다시 Max를 가진 명함의 길이로 대체하는 것이다. 

코드풀이

2줄~4줄.

앞으로 필요한 값들을 넣어줄 변수를 선언,초기화 해줌. 각각 설명하자면 max 는 모든 명함들의 사이즈중 가장 큰 길이를 넣어줄 변수

min배열은 각각의 명함들안에 세로와 가로를 비교하여 그 명함이 가진 최소길이들을 담아줄 배열그릇이다.

max2는 명함들중 가장큰 길이를 제외하고 max가 담긴 명함의 다른 나머지 길이와 다른 명함들안의 각각의 최소길이와 비교하여 그중에 가장 큰 값을 max2에 넣어준다.

5줄.

현재 입력해준 명함들이 가진 사이즈들의 형태가 [[],[],[]] 이런식으로 배열안에 또 배열이 담겨있다.

따라서 큰 틀[] 하나를 제거 하기위해서 먼저 모든 수를 string 으로 바꿔주고, string 이면 하나의 문자열로만 인식하고 각각 값들을 분리하지않기때문에, split 을 이용하여 ',' 을 기준으로 배열로다시 만들면서 index를 나눠주기로했다.

보는거와 같이 [] 하나의 큰 대괄호 안에 각각의 string 타입의 숫자들로 형태를 바뀌었다.

6~8줄. 

string 형태의 값들을 다시 number 형태로 바꾸기위해 parsinInt사용하여 각각의 index에 해당하는 값들을 바꿔줌.

 

10줄.

이제 number 타입의 배열이 되었으므로 그 안에서 가장 큰 사이즈를 갖는 값을 Math.max 를 사용하여 구해주었다 이때 파라미터로 들어가는 sizes는 배열인 형태인데 max 메서드는 (1,2,3) 와 같이 하나하나의 값들을 넣어주어야한다 따라서 그런 형태를 만들어 주기 위해서 ...이라는 나머지 매개변수 를 사용하여 [] 을 제거해주고 각각의 값들만 파라미터로 넣어주었다.

11줄~13줄.

이제 가장 큰 사이즈를 구했다면 그에 해당하는 명함의 나머지 길이와 다른 명함이 들어가는지 비교하기위해 다른 명함들의 길이와 비교해야한다. 이때 j*2와 2*j+1 인 index 를 준것은 각각 명함이 가로 세로 두가지의 인덱스와 값을 갖기 때문에 텀을 주기위해서 였다.

이렇게 각각의 명함들의 최소값을 min배열에 넣어주었다.

 

15~16줄.

만약 가장 큰 사이즈를 갖은 명함의 값이 짝수라면 그 앞에 +1가 된 홀수가 가장 큰 사이즈와 같이 포함된 명함의 길이 일것이다. 

따라서 그 가장큰 값의+1의 숫자 값과, 아까 구한 min에 해당하는 각각 다른 명함들의 최소값과 비교하여, 만약 다른 명함들의 최소값이 가장큰 길이를 가진 명함의 다른 사이즈보다 크다면 명함을 돌려서 넣을때도 들어가기위해서 그 최소값으로 바꿔준다. 그 결과값을 max2에 넣어주었다

 

19줄.

반대로 가장큰사이즈를 가진 명함의 인덱스가 홀수면 그 명함이 가진 가로세로중 하나는 짝수에 갖고 있기때문에 -1의 index로 min 과 비교해주기로했다. 그 결과값을 max2에 넣어주었다

 

이제 그 결과값이 각각 최소한의 길이로 모든 명함을 넣을수있는 사이즈이므로 곱하기를 하여 총 면적을 구하여 리턴한다

 

 

프로그래머스에서 다른사람들이 한것

더보기