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 |
Tags
- 데이터베이스
- SDK
- 온디바이스AI
- 반효경
- 인터럽트
- 코딩테스트 [ ALL IN ONE ]
- recoverability
- 코딩애플
- 개발남노씨
- 김영한
- Git
- 시스템프로그래밍
- 시그널 핸들러
- Extendable hashing
- B tree 데이터삽입
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- 백엔드
- CPU 스케줄링
- vite
- concurrency control
- 운영체제와 정보기술의 원리
- 쉬운 코드
- 프로세스 주소 공간
- 트랜잭션
- 갤럭시 S24
- 운영체제
- SQL
- 커널 동기화
- 네트워크
- 쉬운코드
Archives
- Today
- Total
티끌모아 태산
[백 준/구현] 2309: 일곱 난쟁이 본문
728x90
https://www.acmicpc.net/problem/2309
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
for문
arr = []
for i in range(9):
n = int(input())
arr.append(n)
one = 0
two = 0
SUM = sum(arr) # 총합
for i in range(9):
for j in range(i+1, 9):
if SUM - (arr[i] + arr[j]) == 100:
one, two = arr[i], arr[j]
break # 반복문 탈출
arr.remove(one)
arr.remove(two)
for i in sorted(arr):
print(i)
간단하게 생각하면 결국 9명 중 7명을 뽑아 그 합이 100이면 해당 원소값들을 오름차순으로 출력해주면 된다. 그런데 단순 반복문을 7개 중첩하는 것은 매우 비효율적이므로 반대로 생각을 해보자. 9명 중 2명을 뽑아 그 2명 키의 합을 전체 키에서 뺀 값이 100이라면 반복문을 7회->2회만 중첩하여 실행시키면 된다.
조합, combination
from itertools import combinations
arr = []
for i in range(9):
n = int(input())
arr.append(n)
for i in combinations(arr, 7):
if sum(i) == 100:
for j in sorted(i):
print(j)
break
이렇게 조합 라이브러리를 사용해서 풀어도된다.
itertools 사용하기
파이썬에 내장된 itertools패키지의 combinations모듈과 permutations모듈을 통해 쉽게 순열과 조합을 구할 수 있다. 이때, 만들어진 순열과 조합은 튜플의 형태로 리스트에 담겨서 반환된다. -> [(0, 1, 2), (0,1,3) ...(3,4,5)]
조합
from itertools import combinations
arr = [0, 1, 2, 3, 4, 5]
print(list(combinations(arr, 3)))
순열
from itertools import permutations
arr = [0, 1, 2, 3, 4, 5]
print(list(permutations(arr, 3)))
추가 학습
[20, 7, 23 , 19, 10, 15, 25, 8, 13] 이라는 배열 중에서 하나의 index를 고정하고 그 다음 index와 하나씩 더하는 로직은 다음과 같다.
height = [20, 7, 23, 19, 10, 15, 8, 13]
for i in range(len(height)):
for j in range(i+1, len(height))
또한 반복문을 사용할 때 break 걸어주는거 잊지 않고 고려하기!
C++ 코드
// ConsoleApplication2.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[9]; // 9개의 정수를 저장할 배열
int sum = 0; // 모든 정수의 합을 저장할 변수
for (int i = 0; i < 9; i++) {
cin >> arr[i]; // 사용자로부터 9개 정수를 입력받아 arr에 저장
sum += arr[i]; // 각 입력값을 더해 전체 합 계산
}
sort(arr, arr + 9); // arr을 오름차순으로 정렬
// 합이 100이 되는 조합 찾기
for (int i = 0; i < 8; i++) {
for (int j = 1; j < 9; j++) {
if (sum - arr[i] - arr[j] == 100) {
// 조합 출력
for (int k = 0; k < 9; k++) {
// 두 정수 를 제외한다. || == OR
if (k == i || k == j) continue;
cout << arr[k] << '\n';
}
return 0; // 프로그램 종료
}
}
}
return 0;
}
728x90
'백준 문제 > 문자열,누적합,구현' 카테고리의 다른 글
[백 준/구현] 10988: 팰린드롬인지 확인하기 (0) | 2023.12.26 |
---|---|
[백 준/구현] 2979: 트럭 주차 (0) | 2023.12.26 |
[백 준/구현] 10808: 알파벳 개수 (1) | 2023.12.26 |