반응형
250x250
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
- 백준
- 백준 알고리즘
- 공모주청약
- BFS
- 사회조사분석사 2급 독학
- 사회조사분석사2급실기신청꿀팁
- 공모주 청약
- 2월공모주
- 그리디
- 파이썬 정렬
- 사회조사분석사2급실기신청
- 사회조사분석사 2급 공부방법
- 알고리즘
- 사회조사분석사 2급 필기 요약정리
- 머신러닝
- 정렬
- 사회조사분석사 2급
- 오미크론 자가격리
- DFS
- 시물레이션
- 현대엔지니어링
- 벽부수고이동하기 파이썬
- 공모주
- 사회조사분석사 2급 필기 시험시간
- 사회조사분석사 2급 접수
- 너비우선탐색
- 현대엔지니어링 수요예측
- 사회조사분석사 2급 기출문제집
- 사이킷런
- 사회조사분석사 2급 필기 공부방법
Archives
- Today
- Total
세상을 바꾸는 데이터
[백준 1744번] 수 묶기 - 파이썬 본문
문제 링크:
https://www.acmicpc.net/problem/1744
풀이 과정:
첫 번째 접근 방법
수를 오름차순 정렬한 후에 두 수를 곱하고 이를 정답 값에 대입하면 최적의 해가 도출될까??
코드를 작성해보았더니 예제의 정답값과 모두 맞았지만 반례가 존재했다.
n = 5이고 다음과 같은 5개의 숫자를 입력했을 때 (-537, -435), (81, 157), (257) 이렇게 묶어서 답이 출력된다.
(81, 157)이 아니라 (157 * 257)로 묶여야 최댓값을 도출할 수 있다.
5
-537
81
-435
257
157
두번째 접근 방법
음수, 양수, 그리고 1을 케이스별로 리스트를 나누어 계산해보면 어떨까??
음수는 오름차순 정렬, 양수는 내림차순 정렬, 1은 곱하기 대신 더하는 방식으로 말이다.
(여기서 0은 음수에 속하게 된다. 수 묶음이 (음수, 0)이 되어야 손해를 적게 본다.)
이렇게 한다면 최적의 해를 도출할 수 있을 것이다. 이제 코드를 작성해보자.
풀이 코드:
# 1744번 수 묶기
n = int(input())
# 음수, 양수, 1 리스트 만들기
minus_list = []
plus_list = []
one_list = []
ans = 0
# 입력값 받기
for i in range(n):
input_num = int(input())
if input_num > 1:
plus_list.append(input_num)
elif input_num <= 0:
minus_list.append(input_num)
else:
one_list.append(input_num)
plus_list.sort(reverse=True)
minus_list.sort()
# 양수 계산
# 양수의 개수가 홀수라면 제일 작은 값을 정답에 더하기
if len(plus_list) %2 == 1:
ans += plus_list[len(plus_list)-1]
for j in range(0, len(plus_list)-1, 2):
ans += plus_list[j] * plus_list[j+1]
# 양수의 개수가 짝수면 두 수를 곱하고 정답에 더하기
else:
for j in range(0, len(plus_list), 2):
ans += plus_list[j] * plus_list[j+1]
# 음수 계산(0 포함)
# 음수의 개수가 홀수라면 제일 작은 값을 정답에 더하기
if len(minus_list) %2 == 1:
ans += minus_list[len(minus_list)-1]
for j in range(0, len(minus_list)-1, 2):
ans += (minus_list[j]) * (minus_list[j+1])
# 음수의 개수가 짝수면 두 수를 곱하고 정답에 더하기
else:
for j in range(0, len(minus_list), 2):
ans += (minus_list[j]) * (minus_list[j+1])
# 수 1에 대해 계산
for j in range(len(one_list)):
ans += one_list[j]
# 정답 출력
print(ans)
문제를 풀면서 느낀 점은 항상 내가 생각한 방식의 반례가 있는지 찾아보는 것이 중요하다.
나는 백준의 질문검색을 통해 반례 예시를 대입하여 내 풀이와 일치한 지 확인해본다.
소스코드 작성이 끝나면 이 질문검색을 통해 게시판에 올려진 코드들을 분석해보면서 복습할 수 있다.
https://www.acmicpc.net/board/search/all/problem/1744
728x90
반응형
'PS Study > BOJ(백준)' 카테고리의 다른 글
[백준 10773번] 제로 - 파이썬 (29) | 2022.02.02 |
---|---|
[백준 7568번] 덩치 - 파이썬 (18) | 2022.01.31 |
[백준 16953번] (A -> B) - 파이썬 (6) | 2022.01.29 |
[백준 2941번] 크로아티아 알파벳 - 파이썬 (17) | 2022.01.28 |
[백준 1439번] 뒤집기 - 파이썬 (5) | 2022.01.27 |
Comments