<문제>
세준이는 컵 3개를 탁자 위에 일렬로 엎어놓았다. 컵의 번호는 맨 왼쪽 컵부터 순서대로 1번, 2번 3번이고, 세준이는 이 컵을 이용해서 게임을 하려고 한다.
먼저 1번 컵의 아래에 공을 하나 넣는다. 세준이는 두 컵을 고른 다음, 그 위치를 맞바꾸려고 한다. 예를 들어, 고른 컵이 1번과 2번이라면, 1번 컵이 있던 위치에 2번 컵을 이동시키고, 동시에 2번 컵이 있던 위치에 1번 컵을 이동시켜야 한다. 이때 공은 움직이지 않기 때문에, 공의 위치는 맨 처음 1번 컵이 있던 위치와 같다.
세준이는 컵의 위치를 총 M번 바꿀 것이며, 컵의 위치를 바꾼 방법이 입력으로 주어진다. 위치를 M번 바꾼 이후에 공이 들어있는 컵의 번호를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 컵의 위치를 바꾼 횟수 M이 주어지며, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 컵의 위치를 바꾼 방법 X와 Y가 주어지며, X번 컵과 Y번 컵의 위치를 서로 바꾸는 것을 의미한다. X와 Y의 값은 3보다 작거나 같고, X와 Y가 같을 수도 있다.

컵을 이동시킨 후에 공이 컵 바깥에 있는 경우는 없다.

 

출력

첫째 줄에 공이 들어있는 컵의 번호를 출력한다. 공이 사라져서 컵 밑에 없는 경우에는 -1을 출력한다.

 

💡문제 해결 아이디어

  • list.index(값) 사용
# 바꾼 횟수 입력 받기
m = int(input())
# 첫번째 위치에 공 있음
cup = [0, 1, 0, 0]

for i in range(m):
  a, b = map(int, input().split())
  cup[a], cup[b] = cup[b], cup[a] # 공 위치 변경

print(cup.index(1)) # 공이 있는(1) 인덱스 출력
<문제>
인하은행에는 ATM이 1대밖에 없다. 지금 이 ATM앞에 N명의 사람들이 줄을 서있다. 사람은 1번부터 N번까지 번호가 매겨져 있으며, i번 사람이 돈을 인출하는데 걸리는 시간은 Pi분이다.
사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라지게 된다. 예를 들어, 총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 = 39분이 된다.
줄을 [2, 5, 1, 4, 3] 순서로 줄을 서면, 2번 사람은 1분만에, 5번 사람은 1+2 = 3분, 1번 사람은 1+2+3 = 6분, 4번 사람은 1+2+3+3 = 9분, 3번 사람은 1+2+3+3+4 = 13분이 걸리게 된다. 각 사람이 돈을 인출하는데 필요한 시간의 합은 1+3+6+9+13 = 32분이다. 이 방법보다 더 필요한 시간의 합을 최소로 만들 수는 없다.
줄을 서 있는 사람의 수 N과 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어졌을 때, 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

 

출력

첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.

 

💡문제 해결 아이디어

  • 인출하는데 필요한 시간이 가장 적은 사람이 먼저 인출할 수록 총 소요 시간이 짧아짐
  • sum 함수 사용
n = int(input())
time = list(map(int, input().split()))

time.sort() # 인출하는 시간 오름차순 정렬
cnt = 0 # 총 소요 시간

for i in range(1, n+1):
  cnt += sum(time[:i]) # 리스트의 0번재 수부터 i번째 수까지 더해줌
print(cnt)
<문제>
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

 

입력

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.

 

출력

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

 

힌트

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

 

💡문제 해결 아이디어

  • 빨리 끝나는 회의 순서대로 정렬을 해야한다. 빨리 끝날 수록 더 많은 회의를 진행 할 수 있음
  • 시작시간을 오름차순으로 정렬하고, 끝나는 시간을 기준으로 다시 오름차순을 진행

 

n = int(input())
array = [] 

for i in range(n):
  start, end = map(int, input().split())
  array.append((start, end))

# 회의의 시작 시간과 끝나는 시간이 같을 수 있으므로 
# 시작시간을 기준으로 정렬을 한 뒤, 끝나는 시간을 기준으로 정렬을 한번 더 해줌
array.sort(key = lambda x: (x[0]))
array.sort(key = lambda x: (x[1]))

last = 0 # 회의의 마지막 시간을 저장할 변수
cnt = 0 # 회의 개수를 저장할 변수
for s, e in array:
  if s >= last: # 시작시간이 회의의 마지막 시간보다 크거나 같을경우
    cnt += 1
    last = e

print(cnt)

'Python > 백준' 카테고리의 다른 글

[백준 - 구현] 1032 명령 프롬프트  (0) 2023.01.03
[백준] 1026 보물  (0) 2023.01.02
[백준 - 구현] 1547 공  (0) 2022.08.04
[백준 - 그리디 알고리즘] 11399 ATM  (0) 2022.08.03
[백준 - 그리디 알고리즘] 11047 동전0  (0) 2022.08.03
<문제>
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

 

출력

첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

n, k = map(int, input().split())
count = 0

array = []

for i in range(n):
  array.append(int(input())) # 입력받은 동전을 저장

array.sort(reverse = True) # 오름차순으로 주어졌으므로 내림차순으로 정렬

for coin in array:
  count += k // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
  k %= coin

print(count)

 

 

 


내가 한 solution

num, base = map(int, input().strip().split(' '))

output = 0
for i in range(len(str(num))):
    output += int(str(num)[-1-i])*(base**i)

print(output)

 

 

 

파이썬의 int(x, base = 10)함수는 진법 변환을 지원

num, base = map(int, input().strip().split(' '))

print(int(str(num), base))
  • int(x, radix) : radix 진수로 표현된 문자열 x를 10진수로 변환 후 반환
  • 주의할 점은 첫번째 인자가 무조건 문자열


내가 한 solution

a, b = map(int, input().strip().split(' '))
print(a//b, a%b)

 

divmod 와 unpacking 사용

print(*divmod(a, b))
  • divmod(x, y) -> x를 y로 나눈 몫과, 나머지가 들어있는 tuple을 리턴
  • 무조건 divmod를 사용하는게 좋은 방법은 아님
  • divmod는 작은 숫자를 다룰 때는 a//b, a%b 보다 느림. 대신, 큰 숫자를 다룰 때는 divmod가 더 빠름

unpacking 

  • 여러 개의 객체를 포함하고 있는 하나의 객체를 풀어서 보여주는 것
>> print(divmod(5, 2))
(2, 1) # 튜플 형태의 하나의 객체를 반환

>> print(*divmod(5, 2))
2 1 # 튜플 내 2와 1이라는 int형 객체를 각각 반환

enumerate는 '열거하다' 라는 뜻

순서가 있는 자료형(리스트, 튜플, 문자열)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴

for문과 함께 자주 사용

 

 

for i, name in enumerate(['body', 'foo', 'bar']):
    print(i, name)

[출력]

>> 0 body
     1 foo
     2 bar

 

순서값과 함께 body, foo, bar가 순서대로 출력됨

enumerate를 for문과 함께 사용하면 자료형의 현재 순서(index)와 그 값을 쉽게 알 수 있음

 

'Python > 공부' 카테고리의 다른 글

파이썬 n진수 변환  (0) 2023.01.07
파이썬 최대공약수, 최소공배수 함수 - gcd, lcm  (2) 2023.01.05
입력  (0) 2022.12.31
리스트 컴프리헨션  (0) 2022.12.31
클래스  (0) 2022.03.18

클래스 개념

클래스

     무엇인가를 계속해서 만들어낼 수 있는 설계 도면

     별모양, 하트모양같은 뽑기의 틀

인스턴스

     클래스에 의해서 만들어진 피조물

     별 또는 하트가 찍힌 뽑기

 

# 클래스의 가장 간단한 예
class Simple:
    pass

# Simple 클래스의 인스턴스
a = Simple()



 

이야기 형식으로 클래스 기초 쌓기

클래스 변수

class Service:
    secret = "영구는 배꼽이 두 개다."

pey = Service()

pey.secret
>>> "영구는 배꼽이 두 개다."

클래스 함수

class Service :
    secret = "영구는 배꼽이 두 개다."    <- 유용한 정보
    def sum(self, a, b):    <- 더하기 서비스
        result = a + b
        print("%s + %s = %s입니다." % (a, b, result))

pey = Service()

pey.sum(1, 1)
>>> 1 + 1 = 2입니다.

self 간단히 살펴보기

class Service :
    secret = "영구는 배꼽이 두 개다."
    def sum(self, a, b):
        result = a + b
        print("%s + %s = %s입니다." % (a, b, result))

pey = Service()

pey.sum(1, 1)
>>> 1 + 1 = 2입니다.

더하기 서비스에 가입했는지 여부를 확인하기 위한 장치 추가

sum 함수의 첫 번째 입력값을 통해 가입 여부를 판단

pey라는 아이디를 가진 사람은 다음 처럼 sum 함수를 사용

pey.sum(pey, 1, 1)

sum 함수는 첫 번째 입력값을 가지고 가입한 사람인지 아닌지를 판단

따라서 첫 번째 입력 인수로 pey라는 아이디를 주면 sum 함수는 pey라는 아이디가 이미 가입되어 있는 것을 확인한 후 서비스를 제공해 줄 것이다.

 

클래스 내 함수의 첫 번째 인수는 무조건 self로 사용해야 인스턴스의 함수로 사용할 수 있다.

 

self 제대로 알기

사용자에게 이름을 입력받아서 더하기 서비스를 제공할 때 앞 부분에 그 이름을 넣어주기

class Service :
    secret = "영구는 배꼽이 두 개다."    
    def setname(self, name):
        self.name = name
    def sum(self, a, b): 
        result = a + b
        print("%s님 %s + %s = %s입니다." % (self.name, a, b, result))

pey = Service()

pey.setname("홍길동")

pey.sum(1, 1)
>>> 홍길동님 1 + 1 = 2입니다.

__init__이란 무엇인가?

아이디를 부여해 줄 때 사람의 이름을 입력받아야만 아이디를 부여해 해주는 방식으로 바꾸기

"인스턴스를 만들 때 항상 실행된다"

class Service :
    secret = "영구는 배꼽이 두 개다."    
    def __init__(self, name):
        self.name = name
    def sum(self, a, b): 
        result = a + b
        print("%s님 %s + %s = %s입니다." % (self.name, a, b, result))

pey = Service("홍길동")

pey.sum(1, 1)
>>> 홍길동님 1 + 1 = 2입니다.

클래스 자세히 알기

클래스란 인스턴스를 만들어내는 공장

클래스는 해당 인스턴스의 설계도라고 할 수 있음

클래스의 구조

class 클래스 이름[(상속 클래스명)]:
    <클래스 변수1>
    <클래스 변수2>
    ...
    <클래스 변수N>
    def 클래스 함수 1(self[, 인수1, 인수2, ...]):
        <수행할 문장1>
        <수행할 문장2>
        ...
    def 클래스 함수 2(self[, 인수1, 인수2, ...]):
        <수행할 문장1>
        <수행할 문장2>
        ...
    def 클래스 함수 N(self[, 인수1, 인수2, ...]):
        <수행할 문장1>
        <수행할 문장2>
        ...
    ...

class라는 키워드는 클래스를 만들 때 사용되는 예약어, 그 바로 뒤에 클래스 이름을 입력해야 한다.

클래스 이름 뒤에 상속할 클래스가 있다면 괄호() 안에 상속할 클래스 이름을 입력한다.

클래스 내부에는 클래스 변수와 클래스 함수들이 있다.

 

사칙연산 클래스 만들기

클래스를 어떻게 만들지 먼저 구상하기

  • 사칙연산 클래스 FourCal
  • 사칙연산을 하려면 두 숫자를 입력받아야겠군 setdata 메서드
  • 더하기 기능 sum 메서드
  • 빼기 기능 sub 메서드
  • 나누기 기능 div 메서드
  • 곱하기 기능 mul 메서드

클래스 만들기

class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def sum(self):
        result = self.first + self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def div(self):
        result = self.first / self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result

'박씨네 집' 클래스 만들기

클래스 구상하기

  • '박씨네 집 ' 클래스 HousePark
  • 박씨 가족의 '이름'을 설정하려면? setname 메서드 -> __init__메서드
  • 박씨 가족 중 한 사람이 여행 가고 싶은 곳을 출력해 볼까? travel 메서드

클래스 만들기

class HousePark:
    lastname = "박"
    #def setname(self, name):
    #    self.fullname = self.lastname + name
    def __init__(self, name):
        self.fullname = self.lastname + name
    def travel(self, where):
        print("%s, %s여행을 가다." %( self.fullname, where))

>>>pey = HousePark("응용")
>>>pey.travel("태국")
박응용, 태국여행을 가다.

클래스의 상속

어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것

class 상속받을 클래스명(상속할 클래스명)

 

'김씨네 집'이라는 HouseKim을 만들어보자

HouseKim이라는 클래스가 HousePark 클래스를 상속받는 예제

class HouseKim(HousePark):
    lastname="김"

>>>juliet = HouseKim("줄리엣")
>>>juliet.travel("독도")
김줄리엣, 독도여행을 가다.

메서드 오버라이딩

class HouseKim(HousePark):
    lastname="김"
    def travel(self, where, day):
        print("%s, %s여행을 %d일 가네." %( self.fullname, where, day))

>>>juliet = HouseKim("줄리엣")
>>>juliet.travel("독도", 3)
김줄리엣, 독도여행을 3일 가네.

연산자 오버로딩

연산자 오버로딩이란 연산자(+, -, *, /, ...)를 객체끼리 사용할 수 있게 하는 기법

class HousePark:
    lastname = "박"
    def __init__(self, name):
        self.fullname = self.lastname + name
    def travel(self, where):
        print("%s, %s여행을 가다." %(self.fullname, where))
    def love(self, other):
        print("%s, %s 사랑에 빠졌네" %(self.fullname, other.fullname))
    def __add__(self, other):
        print("%s, %s 결혼했네" %(self.fullname, other.fullname))

class HouseKim(HousePark):
    lastname="김"
    def travel(self, where, day):
        print("%s, %s여행을 %d일 가네." %( self.fullname, where, day))

>>>pey = HousePark("응용")
>>>juliet = HouseKime("줄리엣")
>>>pey.love(juliet)
>>>pey + juliet
박응용, 김줄리엣 사랑에 빠졌네
박응용, 김줄리엣 결혼했네

'박씨네 집' 클래스 완성하기

class HousePark: lastname ="박"
    def __init__(self, name):
        self.fullname = self.lastname + name
    def travel(self, where):
        print("%s %s여행을 가다." %(self.fullname, where))
    def love(self, other):
        print("%s, %s 사랑에 빠졌네"%(self.fullname, other.fullname))
    def __add__(self, other):
        print("%s, %s 결혼했네"%(self.fullname, other.fullname))
    def fight(self, other):
        print("%s, %s 싸우네"%(self.fullname, other.fullname))
    def __sub__(self, other):
        print("%s, %s 이혼했네"%(self.fullname, other.fullname))

class HouseKim(HousePark):
    lastname = "김"
    def travel(self, where, day):
        print("%s %s여행 %d일 가네." %(self.fullname, where, day))

pey = HousePark("응용")
juliet = HouseKim("줄리엣")
pey.travel("부산")
juliet.travel("부산",3)
pey.love(juliet)
pey + juliet
pey.fight(juliet)
pey - juliet

>>>박응용 부산여행을 가다.
>>>김줄리엣 부산여행 3일 가네.
>>>박응용, 김줄리엣 사랑에 빠졌네
>>>박응용, 김줄리엣 결혼했네
>>>박응용, 김줄리엣 싸우네
>>>박응용, 김줄리엣 이혼했네

'Python > 공부' 카테고리의 다른 글

파이썬 n진수 변환  (0) 2023.01.07
파이썬 최대공약수, 최소공배수 함수 - gcd, lcm  (2) 2023.01.05
입력  (0) 2022.12.31
리스트 컴프리헨션  (0) 2022.12.31
Python 내장함수 - enumerate  (0) 2022.03.23

+ Recent posts