python/23년도 겨울 방학 코딩 스터디

[이코테] part 2_1주차_p.182 두 배열의 원소 교체

소곡이 2023. 1. 17. 00:42
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보다 작은 자연수
  • 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()는 중복된 값이 있을 때는 리스트 앞쪽에 위치한 값의 인덱스를 반환함