[프로그래머스 / Level 1] 최소직사각형 (파이썬)

2022. 5. 13. 18:58·🎲 알고리즘 공부/프로그래머스

📝 문제

>모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요. (카드 회전 가능)

 

입출력 예시

 

 

첫번째 케이스 예시

  - [60 * 50], [30 * 70], [60 * 30], [80 * 40] 크기의 카드가 각각 있다.

  - 두 번째 카드인 [30*70]을 회전시켜서 [70 * 30]으로 만든다.

  - 현재 상태 :  [60 * 50], [70 * 30], [60 * 30], [80 * 40]

  - 여기서 가로는 4번째 카드의 가로인 80에게 다 덮이기 때문에 얘만 생각해주면 된다.

  - 세로는 첫 번째 카드인 50에게 다 덮이기 때문에 얘만 생각해주면 된다.

  - 80 * 50 = 4000 이라는 결과가 나온다.

 

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

 

🎨 풀이

💡 첫 번째 시도 = 성공 코드

 

def solution(sizes):
    width = []
    height = []
    for i in range(len(sizes)):
        width.append(max(sizes[i][0],sizes[i][1]))
        height.append(min(sizes[i][0],sizes[i][1]))
        
    answer = max(width) * max(height)
    return answer

> 핵심 : 카드를 돌릴 수 있다는 것. 카드 가로와 세로 중에서 더 긴 걸 한쪽에 몰고, 더 짧은 걸 한쪽에 몰면 됨.

(약간 몰아주기 느낌으로 가는 거!)

 

문제 푸는 방법 

  * 카드 회전이 가능하다. (적절하게 돌릴 수 있음 = 가로 세로를 바꿀 수 있음)

  ① 카드의 가로 세로 중 더 긴 게 가로가 되게 둠. (돌리면 됨)

  ② 카드 중 최대 가로길이 * 세로길이 해주면 됨. 

 

1. sizes[i]를 돌면서 더 긴 쪽을 width에, 더 짧은 쪽을 height에 넣어준다.

2. 각 리스트의 max 값을 곱해서 answer에 넣어준다.

3. answer을 리턴하면 끝이다!

 

 

​끝~

 

💡 다른 사람 풀이 코드

def solution(sizes):
    tmp = 0
    
    for i in range(len(sizes)):         # x에 작은 값, y에 큰 값이 오도록 함.
        if sizes[i][0] > sizes[i][1]:
            tmp = sizes[i][0]
            sizes[i][0] = sizes[i][1]
            sizes[i][1] = tmp
            
    x = max(t[0] for t in sizes)
    y = max(t[1] for t in sizes)
    return x * y

> 처음에는 회전이 되니까 큰 걸 한쪽에 몰아줘도 된다는 생각을 못했는데, 이 코드를 보면서 아이디어를 많이 떠올리게 되었다!

 

⭐ 느낀점

 

> 다른 사람의 코드를 보고 생각하는 것도 실력 향상에 도움이 되겠구나라는 걸 한 번 더 깨달았다. 물론 내가 머리 열심히 굴려가면서 푸는 게 제일 베스트인 것 같지만! 정말 모르겠으면 다른 사람들의 코드를 보고 공부하는 것도 괜찮은 방법이라는 생각이 든다. 파이팅하자!

 

'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글

[DAY 103 - 프로그래머스 / Level 2] k진수에서 소수 개수 구하기 (파이썬)  (0) 2022.07.03
[프로그래머스 / Level 1] 정수 제곱근 판별 (파이썬)  (0) 2022.05.14
[프로그래머스 / Level 1] 나머지가 1이 되는 수 찾기 (파이썬)  (0) 2022.05.12
[프로그래머스 / Level 2] 짝지어 제거하기 (파이썬)  (0) 2022.05.11
[프로그래머스 / Level 1] 신고 결과 받기 (파이썬)  (1) 2022.05.10
'🎲 알고리즘 공부/프로그래머스' 카테고리의 다른 글
  • [DAY 103 - 프로그래머스 / Level 2] k진수에서 소수 개수 구하기 (파이썬)
  • [프로그래머스 / Level 1] 정수 제곱근 판별 (파이썬)
  • [프로그래머스 / Level 1] 나머지가 1이 되는 수 찾기 (파이썬)
  • [프로그래머스 / Level 2] 짝지어 제거하기 (파이썬)
듬듬
듬듬
  • 듬듬
    두드림
    듬듬
  • 전체
    오늘
    어제
    • 분류 전체보기 (267)
      • 📑 신입일기 (35)
      • 🎲 알고리즘 공부 (192)
        • 프로그래머스 (76)
        • 백준 (96)
        • 코드업 (19)
      • 📘 독서 (0)
      • 💌 일상 (12)
        • 일상 (5)
        • 기록 (7)
      • 📜 자격증 (2)
        • 정보처리기사 (2)
      • 학교 공부 (20)
        • ICT 개론 (14)
        • 리눅스 (6)
      • ChatGPT 랑 놀기 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    6월 목표
    컨텐더스
    코드업
    충무로
    스프링 부트
    코테
    신입일기
    정보처리기사
    일기
    codeup
    폰켓몬
    파이썬
    코민이
    프로그래머스
    오블완
    찬양추천
    정처기
    스프링부트
    오버워치
    백준
    코린이
    티스토리챌린지
    카카오
    연습문제
    nodejs
    행렬덧셈
    BOJ
    til
    피보나치수
    50문답
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
듬듬
[프로그래머스 / Level 1] 최소직사각형 (파이썬)
상단으로

티스토리툴바