제주코딩베이스캠프 Python 61 ~ 70제

이하연·2020년 8월 10일
0

문제61 : 문자열 압축하기

문자열을 입력받고 연속되는 문자열을 압축해서 표현
입력

aaabbbbcdddd

출력

a3b4c1d4
  • 방법 1
m = 'aaabbbbcddddaa'
changeString = m[0]
count = 0
result = ''

for i in m :
    if changeString == i :
        count+=1
    else :
        result += str(count) + changeString
        count = 1
        changeString = i

result += str(count) + changeString

print(result)
  • 방법 2
import  re

user_input = 'aaabbbbcddddaa'
rule = re.findall('(\\w)(\\1*)',user_input)
str1 =  ''

for i,j in rule :
     str1+= str(len(j)+1) + i

print(str1)

문제62 : 20190923출력하기

기준은
1. 코드 내에 숫자가 없어야 합니다.
2. 파일 이름이나 경로를 사용해서는 안됩니다.
3. 시간, 날짜 함수를 사용해서는 안됩니다.
4. 에러 번호 출력을 이용해서는 안됩니다.
5. input을 이용해서는 안됩니다.

s = 'bccddddddddd'

zero = s.count('a')
one = s.count('b')
two = s.count('c')
nine = s.count('d')

print(two,zero,one,nine,one,zero,one,one,sep='')

문제63 : 친해지고 싶어

어떤 입력값이 주어지면 앞 글자만 줄여서 출력
입력

복잡한 세상 편하게 살자

출력

복세편살
str1 = '복잡한 세상 편하게 살자'
a = list(map(str,str1.split()))
b = map(str,str1.split()) #이것도 가
result=''

for i in a :
    result+=i[0]

print(result)

문제64 : 이상한 엘레베이터

정량N에 정확히 맞춰야만 움직이는 화물용 엘베
화물은 7kg,3kg 두 가지이며 팔이 아픈 은후는 가장 적게 화물을 옮기고 싶습니다.
예를 들어 정량이 24kg이라면 3kg 8개 옮기는 것 보단
7kg 3개, 3kg 1개 즉 4개로 더 적게 옮길 수 있습니다.
입력

정량 N이 입력됩니다.

출력

가장 적게 옮길 수 있는 횟수를 출력합니다
만약 어떻게 해도 정량이 N이 되지 않는다면 -1을 출력
weight = 31
quota = 0

while weight > 2 :
    if weight > 7 :
        quota += weight // 7
        weight = weight % 7
    else :
        quota += weight // 3
        weight = weight % 3


if weight == 0 :
    print(quota)

else :
    print(-1)

문제65 : 변형된 리스트

a = [1,2,3,4]
b = [a,b,c,d]
이런 리스트가 있을 때 [[1,a],[2,b],[3,c],[4,d]] 이런 식으로 a,b 리스트가 번갈아가면서 출력되게 해주세요

방법1

a = [1,2,3,4]
b = ['a','b','c','d']
c = []

for i in range(len(a)) :
    if i%2 == 0 :
        c.append([a[i],b[i]])
    else :
        c.append([b[i],a[i]])
print(c)

방법2

a = [1,2,3,4]
b = ['a','b','c','d']
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 : 블럭탑쌓기

탑을 쌓기 위해 각 크기별로 준비된 블럭들을 정해진 순서에 맞게 쌓아야 합니다.
1. 블럭은 알페벳 대문자로 표기
2. 규칙에 없는 블럭이 사용될 수 있습니다.
3. 중복된 블럭은 존재하지 않습니다.
입력

탑 = ["ABCDEF","BCAD","ADEFQRX","BEDFG","EFGHZ"]
규칙 = "ABD"

출력

["가능","불가능","가능","가능","가능"]
top = ["ABCDEF","BCAD","ADEFQRX","BEDFG","EFGHZ"]
rule = "ABD"


def allString(allString, rule) :
    list = []
    result = []
    for subString in allString :
        for word in subString :
            if word in rule :
                list.append(rule.index(word))
        result.append(match(list))
        list= []
    return result

def match(sequence) :
    if sequence == sorted(sequence) :
        return "가능"
    else :
        return "불가능"



print(allString(top,rule))

문제67 : 민두의 악수

참가자인 민두는 몇명의 사람들과 악수를 한 후 중간에 일이 생겨 집으로 갔다.
이 행사에서 진행된 악수는 총 n 번이라 했을 때
민두는 몇번의 악수를 하고 집을 갔고 이때 민두를 포함한 행사 참가자는 몇명일까?

  • 악수는 모두 1대 1로 진행이 된다.
  • 민두를 제외한 모든 참가자는 자신을 제외한 참가자와 모두 한번씩 악수를 한다.
  • 같은 상대와 중복된 악수는 카운트 하지 않는다.
  • 민두를 제외한 참가자는 행사를 모두 마쳤다.
    입력 : 행사에서 진행된 악수 횟수 59
    출력 : [민두의 악수횟수, 행사참가자][4,12]
"""
악수 n번
민두 악수횟수 m번
행사 참가자 수 p명

n = (p-2)+...+1 +count
n = (p-2)(p-1)/2 +count
"""

n= 59
count = 0
p = 0
answer = []
while True :
    a = p* (p+1) // 2
    p+=1
    if n< a :
        break
        
count = n - (p-2)*(p-1)//2
print(count,p)

문제68 : 버스 시간표

입력

["12:30","13:20","14:13"]
"12:40"

출력

['지나갔습니다.', '00:00', '00:40', '01:33']
  • 버스 시간표와 현재 시간이 입력으루 주어집니다.
  • 출력 포맷은 "00시00분"입니다.
    만약 1시간 3분이 남았으면 "01시간03분"으로 출력해야 합니다.
  • 버스 시간표에 현재 시간보다 이전인 버스가 있다면 '지나갔습니다.'라고 출력합니다.
def minute(time) :
    # a = int(time.split(':')[0])
    # b = int(time.split(':')[1])
    # print(a, b)
    # print(int(time.split(':')[0]) * 60 + int(time.split(':')[1]))
    return int(time.split(':')[0]) * 60 + int(time.split(':')[1])

def changeTime(time2) :
    return '{0:02d}:{1:02d}'.format(time2//60,time2%60)

# 02d 는 d를 최소 너비 2 로 지정하고 왼쪽에 0을 채움, d는 정수형 

def sol(timeList,nowTime) :
    answer = []
    for time1 in timeList :
        if minute(time1) - minute(nowTime) < 0 :
            answer.append('지나갔습니다.')
        else :
            answer.append(changeTime(minute(time1)-minute(nowTime)))
    return answer

timeList = ["12:30","12:40","13:20","14:13"]
print(sol(timeList,"12:40"))

format 문법


문제69 : 골드바흐의 추측

from itertools import combinations_with_replacement

def sosu(n) :
    num = set(range(2,n+1))
    for i in range(2,n+1) :
        if i in num :
            num -= set(range(2*i,n+1,i))
    return num

def goldbach(sosuList,number) :
    result = []
    for i in combinations_with_replacement(sosuList,2) :
        if i[0]+i[1] == number :
            result.append(i)
    return result

n = 100
print(goldbach(sosu(n),n))
출력 : [(3, 97), (11, 89), (17, 83), (29, 71), (41, 59), (47, 53)]

문제70 : 행렬 곱하기

행렬 2개가 주어졌을 때 곱할 수 있는 행렬인지 확인하고 곱할 수 있다면 그 결과를, 곱할 수 없다면 -1을 출력하는 프로그램을 만들어주세요.

  • 라이브러리 사용은 금지
    입력
a = ([1,2],
     [2,4])
b = ([1,0],
     [0,3])
출력 : ([1,6],[2,12])
import numpy as np

a = ([1,2],[2,4])
b = ([1,0],[0,3])

procession_a = np.array(a)
procession_b = np.array(b)

print(procession_a.dot(procession_b))

파이썬 행렬 numpy에 관한 링크

0개의 댓글