728x90
문제
입출력
전체 코드
import sys
N_MIN = 1; N_MAX = 100000
K_MIN = 0
LIST_VALUE_MIN = 1; LIST_VALUE_MAX = 10000000
class Change2List:
def __init__ (self):
self.N, self.K, self.A, self.B = None, None, None, None
self.max_sum = None
def inputAllValue(self):
self.inputNK()
self.A = self.inputList()
self.B = self.inputList()
def inputNK(self):
nk = input().split()
if len(nk)!=2: sys.exit() # 두개를 입력받은 것이 맞는지
if any(i.isalpha() for i in nk): sys.exit() # 원소 중에 하나라도 문자열이 잇을 경우
N, K = int(nk[0]), int(nk[1])
if N<N_MIN or N>N_MAX: sys.exit()
if K<K_MIN or K>N: sys.exit()
self.N = N
self.K = K
def inputList(self):
l = input().split()
if len(l)!=self.K: sys.exit() # N개를 입력받은 게 맞는 지
if any(i.isalpha() for i in l): sys.exit() # 원소 중에 하나라도 문자열이 잇을 경우
return [int(i) for i in l]
def changeValue(self):
for i in range(self.K):
min_a = min(self.A) # a 배열 최솟값
max_b = max(self.B) # b 배열 최댓값
self.A[self.A.index(min_a)] = max_b
self.B[self.B.index(max_b)] = min_a
def run(self):
self.inputAllValue()
self.changeValue()
self.max_sum = sum(self.A)
print(self.max_sum)
if __name__ == "__main__":
test = Change2List()
test.run()
요약용
# 주요 코드
N, K = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
for i in range(K):
min_a = min(a) # a 배열 최솟값
max_b = max(b) # b 배열 최댓값
a[a.index(min_a)] = max_b
b[b.index(max_b)] = min_a
푼 방법
🔆 문제 요약
- 입력 값
- 두 배열의 원소 N개
- 배열 A, B
- 원소는 모두 자연수
- 바꿔칠 수 있는 횟수 K번
- 출력 값
- 배열 A의 모든 원소의 합이 최대가 될 수 있는 합
🔆예외 사항
- N과 K를 입력받을 때
- N이 1이상 100,000이하 자연수인가
- K가 0이상 N이하의 자연수인가(횟수니까)
- 입력받을 때 길이가 2가 맞는가→ 아닐 경우 종료
- 문자열이 들어갓을 경우
- 두 배열의 길이가 같은가
- 배열의 모든 원소는 1이상 10,000,000보다 작은 자연수인가
- 문자열이 들어갔을 경우
🔆기능 사항
- inputAllValue() : 필요한 입력값들을 입력받는 함수를 호출함
- inputNK()
- N : 1이상 100,000이하 자연수
- K : 0이상 N이하의 자연수
- inputList() : 배열의 모든 원소는 1이상 10,000,000보다 작은 자연수
- inputNK()
- changeValue() : 바꿔치기하는 함수
- a의 최솟값과 b의 최댓값을 바꿈
- run() : 해당 클래스를 돌리기 위한 함수
풀이
import sys
N_MIN = 1; N_MAX = 100000
K_MIN = 0
LIST_VALUE_MIN = 1; LIST_VALUE_MAX = 10000000
- 입력 값들의 min/max 조정
- 파이썬에는 상수가 없다
def __init__ (self):
self.N, self.K, self.A, self.B = None, None, None, None
self.max_sum = None
- 입력값들 초기화
- max_sum : 배열 A의 모든 원소의 합이 최대가 될 수 있는 합
def inputAllValue(self):
self.inputNK()
self.A = self.inputList()
self.B = self.inputList()
- 필요한 입력값들을 입력받기 위한 함수
def inputNK(self):
nk = input().split()
if len(nk)!=2: sys.exit() # 두개를 입력받은 것이 맞는지
if any(i.isalpha() for i in nk): sys.exit() # 원소 중에 하나라도 문자열이 잇을 경우
N, K = int(nk[0]), int(nk[1])
if N<N_MIN or N>N_MAX: sys.exit()
if K<K_MIN or K>N: sys.exit()
self.N = N
self.K = K
- 따로 만들고 싶었는데 N과 K를 같이 입력 받아야 해야해서 이케 만듬
- 입력 받았을 때 map()을 안 썼냐면, 사용자가 어떤 ㅈ같은 입력값을 넣을 지 모르기 때문임
- 정수만 넣어야 하는데, 문자열을 넣는 다는 등
- 별의 별 기상천외한 것들을 넣기 때문에 일단 리스트로 분리만 했다
- sys.exit() : 이상한 값 넣으몐 프로그램 강종함
- any() : 안에 있는 조건 중에 하나라도 만족하면 true 반환
- 여기서는 nk = ['5', '3']을 돌면서, 원소(문자열 이겠주?)가 알파벳(한글 포함)인지 확인함
- tmi로 문자열.isdigit()은 해당 문자열이 숫자이면 true를 반환함
- 그 아래는 입력값의 조건을 확인하고 틀리면 강종
- 모든 조건을 만족하면 인스턴스에 저장
def inputList(self):
l = input().split()
if len(l)!=self.K: sys.exit() # N개를 입력받은 게 맞는 지
if any(i.isalpha() for i in l): sys.exit() # 원소 중에 하나라도 문자열이 잇을 경우
return [int(i) for i in l]
- 두 개의 배열 a,b를 입력받기 위한 함수
- 마찬가지로 사용자가 이상한 값을 넣을까바 일단 조건 검사 후 int로 변환하여 반환함
def changeValue(self):
for i in range(self.K):
min_a = min(self.A) # a 배열 최솟값
max_b = max(self.B) # b 배열 최댓값
self.A[self.A.index(min_a)] = max_b
self.B[self.B.index(max_b)] = min_a
- 메인 코드쥬?
- 문제의 주 내용은 A배열의 최솟값과 B배열의 최댓값을 교환하는거다
- 그래서 일단 A배열의 최솟값을 min_a에 저장, B배열의 최댓값을 min_b에 저장함
- 교환하는 방법은 index()함수를 써서 min_a와 min_b의 위치를 찾고 바꿔주기만 하면 됨
- index()는 중복된 값이 있을 때는 리스트 앞쪽에 위치한 값의 인덱스를 반환함
'python > 23년도 겨울 방학 코딩 스터디' 카테고리의 다른 글
[이코테] part 3_3주차_p.323 문자열 압축 (3) (1) | 2023.02.01 |
---|---|
[이코테] part 3_3주차_p.322 문자열 재정렬 (2) (0) | 2023.02.01 |
[이코테] part 3_3주차_p.321 럭키 스트레이트 (1) (0) | 2023.02.01 |
[이코테] part 2_2주차_p.201 떡볶이 떡 만들기 (0) | 2023.02.01 |
[이코테] part 2_3주차_p.99 1이 될 때까지 (0) | 2023.02.01 |