Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • react-router-dom
  • 문자열
  • 파이썬 감시 피하기
  • 파이썬
  • 백준
  • React
  • 백준 숨바꼭질
  • 백준 파이썬
  • DP
  • Next.js
  • BFS + DP
  • 구현
  • js
  • dfs
  • 플로이드 워셜
  • bfs
  • 이분탐색
  • 파이썬 다익스트라
  • 시뮬레이션
  • 자바스크립트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

🏄‍♀️ 코딩테스트/🐍 Python

[ 백준 1744 해설 ] ( python ) 수 묶기

2022. 6. 27. 17:40
반응형

 

📚 수 묶기

 

문제

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다.

예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열의 합을 구하면 0+1+2+4+3+5 = 15이다. 하지만, 2와 3을 묶고, 4와 5를 묶게 되면, 0+1+(2*3)+(4*5) = 27이 되어 최대가 된다.

수열의 모든 수는 단 한번만 묶거나, 아니면 묶지 않아야한다.

수열이 주어졌을 때, 수열의 각 수를 적절히 묶었을 때, 그 합이 최대가 되게 하는 프로그램을 작성하시오.

 

입력

첫째 줄에 수열의 크기 N이 주어진다. N은 50보다 작은 자연수이다. 둘째 줄부터 N개의 줄에 수열의 각 수가 주어진다. 수열의 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

 

출력

수를 합이 최대가 나오게 묶었을 때 합을 출력한다. 정답은 항상 231보다 작다.

 

예제 입력 1 복사

4
-1
2
1
3

예제 출력 1 복사

6

예제 입력 2 복사

6
0
1
2
4
3
5

예제 출력 2 복사

27

예제 입력 3 복사

1
-1

예제 출력 3 복사

-1

예제 입력 4 복사

3
-1
0
1

예제 출력 4 복사

1

예제 입력 5 복사

2
1
1

예제 출력 5 복사

2

 

 

 

 

 

 

✍ 접근

  • 그리디
  • N 값이 크지 않고 큰 값끼리 곱해서 더하는 것이 가장 효율적인 방법이라는 기본 상식이 있기 때문에 그리디 알고리즘이라고 생각하고 풀었습니다

 

 

 

 

정답코드

# ✨ 입력
import sys
from itertools import combinations
input = sys.stdin.readline
N = int(input())

# ✨ 준비 1
arr = []
m_arr = []
res = 0
for _ in range(N):
    x = int(input())
    if x <=0:
        m_arr.append(x)
    elif x == 1:
        res+=1
    else:
        arr.append(x)
        
# ✨ 준비 2
m_arr.sort()
arr.sort(reverse = True)

# ✨ 풀이
if len(arr) %2 !=0:
    arr.append(1)
if len(m_arr)% 2 !=0:
    m_arr.append(1)
for i in range(0,len(arr),2):
    res+=(arr[i]*arr[i+1])
for i in range(0,len(m_arr),2):
    res+=(m_arr[i]*m_arr[i+1])
print(res)

 

해설

입력

  • 문제에서 나온 값을 입력받는다

준비 1

  • 수열을 돌면서 마이너스, 0일 때
    => m_arr(마이너스 배열)에 업로드
  • 1일 때
    => 바로 res에 1 추가 (1은 곱하는 것보다 더해야 더 큰 값을 만들 수 있기 때문)
  • 1보다 클 때
    => arr(플러스 배열)에 업로드

준비 2

  • m_arr은 그냥 sort해줘도 된다
  • arr은 reverse를 이용해서 sort해주고(큰 값들이 먼저 나오게)

 

풀이

  • 만약 arr / m_arr에 홀수개가 들어있다면
    => 둘 다 뒤에 1을 append해줍니다 
    => 마지막에 등장하는 값 (m_arr같은 경우는 가장 큰 값 / arr의 경우는 가장 작은 값)을 각각 빼주고/더해주는 것이 낫기 때문에
  • 그 후 for문을 돌면서 0부터 배열의 길이까지, 2씩 뛰면서 res에 묶은 값을 더해줍니다
  • 그리고 res를 출력하면 자연히 가장 큰 값이 만들어져 출력됩니다.

 

 

⭐ 배움

  • 그리디!!!😖

 

 

 

반응형
저작자표시 (새창열림)

'🏄‍♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글

[ 백준 1520 해설 ] ( python ) 내리막 길  (0) 2022.06.28
[ 백준 1987 해설 ] ( python ) 알파벳  (0) 2022.06.27
[ 백준 1654 해설 ] ( python ) 랜선 자르기  (0) 2022.06.27
[ 백준 2805 해설 ] ( python ) 나무 자르기  (0) 2022.06.27
[ 백준 18352 해설 ] ( python ) 특정 거리의 도시 찾기  (0) 2022.06.26
    '🏄‍♀️ 코딩테스트/🐍 Python' 카테고리의 다른 글
    • [ 백준 1520 해설 ] ( python ) 내리막 길
    • [ 백준 1987 해설 ] ( python ) 알파벳
    • [ 백준 1654 해설 ] ( python ) 랜선 자르기
    • [ 백준 2805 해설 ] ( python ) 나무 자르기
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바