TIL. 201101_PYTHON(4)

YS C·2020년 11월 1일
0

PYTHON

목록 보기
4/4

61-70 리뷰

61: 문자열 압축하기

data = list(input())
s = ''
count = 0
s += data[0]
for i in range(0, len(data) -1):
    count += 1
    if data[i] != data[i+1]: # 문자열이 바뀔 때 처리 !
        s += str(count)
        s += data[i+1]
        count = 0
    if len(data)-2 == i: # 문자열의 마지막 문자 처리 !
        count += 1
        s += str(count) 
print(s)

62: 20190923 출력하기

data = "aacdddddddddeee"
a = str(data.count("a"))
b = str(data.count("b"))
c = str(data.count("c"))
d = str(data.count("d"))
e = str(data.count("e"))
print(a+b+c+d+b+d+a+e)

63: 친해지고 싶어

data = list(map(str, input().split()))
for sentence in data:
    print(sentence[0], end = "")

64: 이상한 엘레베이터

num = int(input())
def check(num):
    if num % 7 == 0:
        return num // 7
    elif (num % 7) % 3 == 0:
        return (num // 7) + ((num % 7) // 3)
    elif num % 3 == 0:
        return num // 3
    else:
        return -1 
print(check(num))
  • 이렇게 처리할 수 도 있음!(답안)
# 답안
N = int(input())
result = 0
while True:
    if N%7 ==0:
        result += N//7
        print(result)
        break
    N -= 3
    result += 1
    if N < 0:
        print(-1)
        break

65: 변형된 리스트

a = [1, 2, 3, 4]
b = ['a','b','c','d']
l = []
for i in range(0, len(a)):
    if i % 2 == 0:
        l.append([a[i],b[i]])
    else:
        l.append([b[i],a[i]])
print(l)
  • 답안이 조금 더 깔끔 (zip함수)
# 답안
a = input().split(' ')
b = input().split(' ')
c = []
count = 0
for i, j in zip(a, b):
    if count % 2 == 0:
        c.append([i, j])
    else:
        c.append([j, i])
    count += 1
print(c)

66: 블럭탑쌓기

예를 들면 정해진 순서가 BAC 라면 A 다음 C가 쌓아져야 합니다.
선행으로 쌓아야 하는 블럭이 만족된 경우라면 탑이 무너지지 않습니다.
1. B를 쌓지 않아도 A와 C를 쌓을 수 있습니다.
2. B 다음 블럭이 C가 될 수 있습니다.
3. 블럭은 알파벳 대문자로 표기합니다.
4. 규칙에 없는 블럭이 사용될 수 있습니다.
5. 중복된 블럭은 존재하지 않습니다.

탑 = ["ABCDEF", "BCAD", "ADEFQRX", "BEDFG", "EFGHZ"]
규칙 = "ABD"
result = []
def solution(top, rule):
    l = []
    for e in rule:
        if e in top:
            l.append(top.index(e))
    if l == sorted(l):
        result.append("가능")
    else:
        result.append("불가능")
for i in range(0, len(탑)):
    solution(탑[i], 규칙)            
print(result)
  • 답안
# 답안
탑 = ["ABCDEF", "BCAD", "ADEFQRX", "BEDFG", "EFGHZ"]
규칙 = "ABD"
result = []
def solution(top, rule):
    st = rule.index(rule[0]) # 기준점을 잡는다...
    for e in top:
        if e in rule:
            if st > rule.index(e):
                return "불가능"
            st = rule.index(e) # 기준점을 바꾸면서 규칙을 다시 확인한다... index를 비교한다 !
    return "가능"
for i in range(0, len(탑)):
    result.append(solution(탑[i], 규칙))           
print(result)
  • 내가 푼 것과 답안의 차이 !
    나는 rule을 for문으로 돌리고 탑의 index 값을 가져와서 sorted로 비교 !
    답안은 rule값 하나를 기준으로 잡고, 탑을 for문으로 돌리며 기준으로 잡은 값과 index 비교

67: 민규의 악수

  1. 악수는 모두 1대 1로 진행이 된다.
  2. 민규를 제외한 모든 참가자는 자신을 제외한 참가자와 모두 한번씩 악수를 한다.
  3. 같은 상대와 중복된 악수는 카운트 하지 않는다.
  4. 민규를 제외한 참가자는 행사를 모두 마쳤다.
def solution(n):
    a = 1
    while (a * (a - 1)) / 2 < n:
        a += 1
    t = int(n - ((a - 1) * (a - 2) / 2))
    print([t, a]) 
solution(int(input()))
  • a는 행사 참가자
  • t는 중간에 나간 사람(민규)의 악수 횟수

68: 버스 시간표

data = ["12:30", "13:20", "14:13"]
time = list(map(int, input().split(':')))
time = time[0] * 60 + time[1]
time_change = []
result = []
for i in range(0, len(data)):
    e = list(map(int, data[i].split(':')))
    minute_convert = e[0] * 60 + e[1]
    time_change.append(minute_convert) 
for i in range(0, len(time_change)):
    change = time_change[i] - time
    if change < 0:
        result.append('지나갔습니다')
    elif change > 0:
        hour = change // 60
        if hour < 10:
            hour = '0'+ str(hour)
        minute = change % 60
        if minute < 10:
            minute = '0' + str(minute)
        result.append(f'{hour}시간 {minute}분')        
print(result)
  • zfill 사용할 수 있다 !
  • 파이썬 문자열 앞 0으로 채우기 !
  • "3".zfill(3) -> 003

69: 골드바흐의 추측

골드바흐의 추측(Goldbach's sonjecture)은 오래전부터 알려진 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것이다. 이때 하나의 소수를 두 번 사용하는 것은 허용한다. -위키백과

위 설명에서 2보다 큰 모든 짝수를 두 소수의 합으로 나타낸 것을 골드바흐 파티션이라고 합니다.

예)
100 == 47 + 53
56 == 19 + 37

2보다 큰 짝수 n이 주어졌을 때, 골드바흐 파티션을 출력하는 코드를 작성하세요.

# 소수 구하기
def prime_list(n):
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    sieve = [True] * n
    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:           # i가 소수인 경우
            for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
                sieve[j] = False
    # 소수 목록 산출
    return [i for i in range(2, n) if sieve[i] == True]
#골드바흐 파티션
prime_numbers = prime_list(10000) # 10000까지의 수에서 소수를 다 구해 놓는다 !
number = int(input())
one_prime = 2
l = []
while True:
    if one_prime == 2:
        if one_prime in prime_numbers:
            two_prime = number - one_prime
            if two_prime in prime_numbers:
                l.append((one_prime, two_prime))
        one_prime += 1
    else:    
        if one_prime in prime_numbers:
            two_prime = number - one_prime
            if two_prime in prime_numbers:
                l.append((one_prime, two_prime))
        one_prime += 2
    if one_prime > number:
        break
print(l)
  • 에라토스테네스의 체를 통해서 일정 수준 이상의 소수를 전부 구해 놓고,
  • number를 받았을 때 구해 놓은 소수를 하나하나 비교하는 방식으로 풀이
  • 소수 2부터 시작해서 홀수 값만 비교 ! 왜...? -> 짝수값은 소수가 될 수 없음
  • 소수 값 하나와 그 소수 값을 number에서 뺏을 때 소수 값이 나오면 출력

70: 행렬 곱하기

a = ([1, 2],
     [2, 4])
b = ([1, 0],
     [0, 3])
def check(a, b):
    if len(a[0]) != len(b):
        print(-1) 
    else:
        result_1 = (a[0][0] * b[0][0] + a[0][1] * b[1][0])
        result_2 = (a[0][0] * b[0][1] + a[0][1] * b[1][1])
        result_3 = (a[1][0] * b[0][0] + a[1][1] * b[1][0])
        result_4 = (a[1][0] * b[0][1] + a[1][1] * b[1][1])
        print(f"([{result_1}, {result_2}], [{result_3}, {result_4}])")    
check(a, b)
  • 답안
a = ([1, 2],
     [2, 4])
b = ([1, 0],
     [0, 3])
def sol(a, b):
    c = []
    if len(a[0]) == len(b):
        for i in range(len(a)):
            c.append([0]*len(b[0])) # 값이 들어갈 자리를 셋팅 0으로 !
            print(c)
        for i in range(len(c)): # (0, 0) -> (1, 0)
            for j in range(len(c[i])): # (0, 0) -> (0, 1)
                for k in range(len(a[i])): # A[0][0] * B[0][0] -> A[0][1] * B[1][0] 
                    c[i][j] += a[i][k] * b[k][j] # for문 3개 돌리기...아...
        return c
    else:
        return -1
sol(a, b)
  • list comprehension + zip함수로 문제를 푼 경우
a = ([1, 2],
     [2, 4])
b = ([1, 0],
     [0, 3])
def productMatrix(A, B):
    return [[sum(a*b for a, b in zip(A_row,B_col)) for B_col in zip(*B)] for A_row in A] # zip(*) -> 열(column)으로 묶어준다...
productMatrix(a, b)
  • 출처: https://geonlee.tistory.com/110 [빠리의 택시 운전사]
  • 마지막 방법이 정말 깔끔하다고 느꼈는데... 저렇게 생각하기가 쉽지 않았다..

0개의 댓글