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)
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)
data = list(map(str, input().split())) for sentence in data: print(sentence[0], end = "")
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
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)
예를 들면 정해진 순서가 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 비교
- 악수는 모두 1대 1로 진행이 된다.
- 민규를 제외한 모든 참가자는 자신을 제외한 참가자와 모두 한번씩 악수를 한다.
- 같은 상대와 중복된 악수는 카운트 하지 않는다.
- 민규를 제외한 참가자는 행사를 모두 마쳤다.
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는 중간에 나간 사람(민규)의 악수 횟수
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
골드바흐의 추측(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에서 뺏을 때 소수 값이 나오면 출력
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 [빠리의 택시 운전사]
- 마지막 방법이 정말 깔끔하다고 느꼈는데... 저렇게 생각하기가 쉽지 않았다..