알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string):
answer = [0] * 52
c = [ord(i) for i in list(my_string)]
for i in c:
if 65 <= i <= 90:
answer[i-65] +=1
else:
answer[i-71] +=1
return answer
문자열을 아스키코드로 변경해서 A~Z까지는 65~90, a~z 까지는 97~122로 변경
[A,B,C,D,E,F,G,H...]
[65,66,67,68,69,70,,,]
0,1,2,3,4,5,6,7 ,,,,> 인덱스 번호
값이 65일 때 0번째 인덱스에 +1을 하는 방식
배열 만들기 1
문제 설명
정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
def solution(n, k):
answer = [i for i in range(1, n+1) if i % k == 0]
return sorted(answer)
글자 지우기
문제 설명
문자열 my_string과 정수 배열 indices가 주어질 때, my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, indices):
answer = ''
for i in range(len(my_string)):
if i not in indices:
answer += my_string[i]
return answer
카운트 다운
문제 설명
정수 start_num와 end_num가 주어질 때, start_num에서 end_num까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
def solution(start, end):
return [i for i in range(start, end-1, -1)]
가까운 1 찾기
문제 설명
정수 배열 arr가 주어집니다. 이때 arr의 원소는 1 또는 0입니다. 정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 작은 인덱스를 찾아서 반환하는 solution 함수를 완성해 주세요.단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.
문제 설명 : 크면서 X > 크거나 같은 O 으로 수정하고 풀어야 맞음
테스트 케이스 3번이 아무리 봐도 맞는데 아니라해서 봤더니,, 설명 문제 ㅡㅡ
def solution(arr, idx):
answer = -1
for i in range(len(arr)):
if i >= idx and arr[i] == 1:
answer = i;
break;
return answer
문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 앞의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, n):
return my_string[:n]
접두사인지 확인하기
문제 설명
어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.문자열 my_string과 is_prefix가 주어질 때, is_prefix가 my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.
문자열 배열 intStrs와 정수 k, s, l가 주어집니다. intStrs의 원소는 숫자로 이루어져 있습니다.배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.
def solution(intStrs, k, s, l):
answer = []
for i in intStrs:
intList = list(i)
res = ''.join(intList[s:s+l])
if int(res) > k:
answer.append(int(res))
return answer
이것저것 형변환을 많이 사용한 것 같다. 생각해보니 리스트로 변환할 것 없이 문자열 자체를 슬라이싱하면 되는데 왜 리스트로 변환해서 슬라이싱 할 생각을 했지 . .ㅎㅎ
def solution(intStrs, k, s, l):
return [int(intstr[s:s+l]) for intstr in intStrs if int(intstr[s:s+l]) > k]
다른 사람 풀이 :
문자열을 바로 슬라이싱해서 int로 변환하고, 조건문으로 값이 k 이상인 값들만 뽑아냈다. 굿굿..
부분 문자열 이어 붙여 문자열 만들기
문제 설명
길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_strings, parts):
answer = ''
for i in range(len(my_strings)):
answer += my_strings[i][parts[i][0]:parts[i][1]+1]
return answer
my_strings와 parts의 길이가 같고, 같은 인덱스 안의 값들을 사용하는 것이므로 인덱스를 활용하려고 생각하며 풀었다.
한번에 풀려고 하지 않고 하나하나 해석하면서 푸니까 좀 더 빨리 풀리는 듯!
def solution(my_strings, parts):
answer = ""
for i, (s, e) in enumerate(parts):
answer += my_strings[i][s:e+1]
return answer
다른 사람의 좀 더 간단한 풀이, enumerate 함수도 잘 사용하면 유용한 것 같다.
문자열의 뒤의 n글자
문제 설명
문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 뒤의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, n):
return my_string[-n:]
음수 인덱스 사용해서 문자열 뒤에서부터 슬라이싱 !
접미사 배열
문제 설명
어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.문자열 my_string이 매개변수로 주어질 때, my_string의 모든 접미사를 사전순으로 정렬한 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string):
return sorted([my_string[i:] for i in range(len(my_string))])
인덱스 0부터 +1씩 문자열 슬라이싱 > 사전순으로 정렬
접미사인지 확인하기
문제 설명
어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.문자열 my_string과 is_suffix가 주어질 때, is_suffix가 my_string의 접미사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, is_suffix):
lst = [my_string[i:] for i in range(len(my_string))]
return 1 if is_suffix in lst else 0
방금 푼 물제에 조건문만 붙여서 접미사 배열 안에 해당 접미사가 있는지만 확인하여 1, 0 리턴
boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요. (x1 ∨ x2) ∧ (x3 ∨ x4)
def solution(x1, x2, x3, x4):
return (x1 or x2) and (x3 or x4)
주사위 게임 3
문제 설명
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
며칠 전에 풀었던 주사위 게임 풀이에서 set 함수로 중복된 값을 추리고 len 함수로 개수를 알아내 문제를 풀었던 기억이 있다. 이 방식으로 접근해보았을 때
p p p p > 1
p p p q > 2
p p q q > 2
p p q r > 3
p q r t > 4
> 값이 2로 동일할 때 어떻게 구분할 것인가?
> p p q r 일 때의 연산이 q * r 인데 어떤게 p,q,r을 어떻게 구분할 것인가? 의 문제가 생겼다 ..... 음
def solution(a, b, c, d):
answer = 0
lst = [a,b,c,d]
length = len(set(lst))
count = [lst.count(i) for i in lst]
if length == 1: answer = 1111 * a
elif length == 4 : answer = min(a,b,c,d)
elif length == 2:
if 3 in count:
p = [lst[index] for index, value in enumerate(count) if value == 3]
q = [lst[index] for index, value in enumerate(count) if value == 1]
answer = (10 * p[0] + q[0])**2
else:
answer = (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
else:
answer_values = [lst[index] for index, value in enumerate(count) if value == 1]
answer = answer_values[0] * answer_values[1]
return answer
머리 쥐어짜내가며 짠 코드 ..뇌절코드.. 한시간 넘게 걸려서 짠......코드예요 ....
1. length가 2일 때
1-1. p p p q 인 경우 count가 3임
1-2. p p q q 인 경우, a==b면 c==d이기 때문에 어차피 값이 2개밖에 없으니 a,c를 p,q로 활용해서 연산
2. length가 3일 때, p p q r 인 경우
count값이 1 > q, r 을 구해야하므로
값이 1을 만족할 때의 인덱스를 사용해서 lst에서 값을 구함.
아우 어렵게도 짰다 그쵸 ..
암튼 [lst[index] for index, value in enumerate(count) if value == n] 이 코드를 위주로 생각해서 짰고,
value가 n을 만족할 때의 인덱스를 사용해서 값을 구한 것입니다!
def solution(a, b, c, d):
l = [a,b,c,d]
c = [l.count(x) for x in l]
print(c)
if max(c) == 4:
return 1111*a
elif max(c) == 3:
print(l[c.index(3)])a
return (10*l[c.index(3)]+l[c.index(1)])**2
elif max(c) == 2:
if min(c) == 1:
return eval('*'.join([str(l[i]) for i, x in enumerate(c) if x == 1]))
else:
return (max(l) + min(l)) * abs(max(l) - min(l))
else:
return min(l)
다른 사람 풀이:
애초에 4,3,2,1의 기준값을 나눈 것부터 나랑 달랐다.
나는 set을 기준으로 나누었는데 다른사람들은 count함수를 기준으로 나누었다.
다른 부분이 예를들어 p p p q 라면 set은 > p, q만남고 값이 2가 되는데
count를 사용해서 lst 배열대로 남겨두 [3, 3, 3, 1]이 되어 max(c)를 하였을 때 값이 3이 나온다.
이렇게 해야 뒤에서 인덱스를 구할 때 편해서 이 방법이 훨씬 ... 나은 것 같다.
내가 푼 방법은 하나하나 계산을 한 느낌이랄까 ....
count랑 index함수를 사용한 풀이를 제대로 처음본 것 같다.
c = [l.count(x) for x in l] : 리스트의 특정 원소 개수를 세서 c에 저장한다.
1. max(c) == 4일 때, 특정 원소 개수가 4개일 때 > 모두 같은 값
2. max(c) == 3일 때, 특정 원소 개수가 3개일 때 > 3개 같은 값, 1개만 다름
3. max(c) == 2일 때
3-1 min(c)는 1일 때 p p q r 인 경우
c의 값이 1일 때의 인덱스를 구해서 두 값을 곱함
3-2 p p q q 인 경우
값이 어차피 2개이니 list에서 최솟값과 최댓값을 이용해 p, q로 보고 계산
어려운데 .. 그래도 새로운 것을 알아가는 것 같아서 좋슴니다.
비록 제 시간은 훅.. 날아가버렸지만요 ㅠ
글자 이어 붙여 문자열 만들기
문제 설명
문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다. my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, index_list):
return ''.join(my_string[i] for i in index_list)
9로 나눈 나머지
문제 설명
음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.
문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, queries):
for s, e in queries:
my_string = my_string.replace(my_string[s:e+1], my_string[s:e+1][::-1])
return my_string
인덱스 s~e 부분을 뒤집어서 replace함수로 대체하는 방법을 사용했는데, 반례가 계속 나와서 결국 방법을 바꿨다.
def solution(my_string, queries):
for s, e in queries:
my_string = my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]
return my_string
replace 함수를 사용하지 않고 슬라이싱만 이용해서 s~e부분을 뒤집고 앞뒤로는 그대로 가져가기
문제들 난이도가 오락가락하는게 병주고 약주는 건가 ..... 주사위 문제에서 멘탈나갔는데 3,4,5는 그래도 순탄히 풀리고,, 이게 완전 기초일텐데 다른 건 얼마나 어려울까 .....ㅎㅎㅎㅎㅜㅜㅜ 어제 삼전 sw 어쩌고 신청을 해놔서 사전 문제 풀려고 봤는데 진짜 도저히 모르겠더라고요 ..... 그래두 꾸준히 해보자 아자잣
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
def solution(arr, queries):
for s, e, k in queries:
for i in range(s, e+1):
if i % k == 0:
arr[i] += 1
return arr
어제 문제랑 비슷해서 손쉽게 푸나 했더니 비슷한듯 다른 문제...
인덱스 s~e까지 자르는게 아니라 배열은 그대로 가져가되
s~e까지만 반복하고, 그 안에서 i가 k의 배수일 때, 해당하는 배열에만 1을 더했다.
배열 만들기 2
문제 설명
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
def solution(l, r):
answer = []
Xlist= set(['1','2','3','4','6','7','8','9'])
for i in range(l, r+1):
num = set(str(i))
if num & Xlist:
pass
else:
answer.append(i)
if not answer:
answer.append(-1)
return answer
Xlist와 l~r사이의 숫자 중에 교집합이 있으면(0, 5가 아닌 값이 있으면) pass
교집합이 없으면 (0, 5만 남아있을테니) 그때의 값을 answer에 append하기
def solution(l, r):
answer = []
for num in range(l, r + 1):
if not set(str(num)) - set(['0', '5']):
answer.append(num)
return answer if answer else [-1]
다른 사람 풀이:
if not set(str(num)) - set(['0', '5']): 값을 집합으로 표현하고
집합 - 집합 = 비어있으면 >> 1,2,3,4,6,7,8,9의 값이 없다는 것이니 그때의 값을 배열에 저장
이런 신박한 방법을 어찌 생각해내시는지.....
카운트 업
문제 설명
정수 start_num와 end_num가 주어질 때, start_num부터 end_num까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
def solution(start, end):
answer = []
for i in range(start, end+1):
answer.append(i)
return answer
응? 갑자기 이렇게 쉬운게 나와버린다고? 감사합니다.
def solution(start, end):
return list(range(start, end + 1))
def solution(start, end):
return [i for i in range(start, end+1)]
파이썬은 사기야 .. 코드를 효율적으로 줄여쓰는 연습을 해보자 .....!
콜라츠 수열 만들기
문제 설명
모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.
def solution(n):
answer = [n]
while n != 1:
if n % 2 == 0:
n //= 2
else:
n = 3 * n + 1
answer.append(n)
return answer
1. n이 1일 때까지 무한 반복
2. 짝, 홀수일 때 연산다르게 하고, 배열에 값 저장
배열 만들기 4
문제 설명
정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.
def solution(arr):
stk = []
i = 0
while i < len(arr):
if not stk:
stk.append(arr[i])
i += 1
elif stk and stk[-1] < arr[i]:
stk.append(arr[i])
i += 1
else:
stk.pop()
return stk
문제 읽으면서 코드썼는데 정답이라 기뻐했는데 if, elif문 실행부분 똑같네 ......요.......ㅎ
정신 몽롱한 상태로 푸는 것은 좋지 않습니다 ...... 그래도 이제 잘 수 있어 기뻐요!
def solution(arr):
stk = []
for i in range(len(arr)):
while stk and stk[-1] >= arr[i]:
stk.pop()
stk.append(arr[i])
return stk
def solution(l):
l.append(l[-1]-l[-2] if l[-1]>l[-2] else l[-1]*2)
return l
삼항 연산자로 간단하게도 가능
수 조작하기 1
문제 설명
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다."w" : n이 1 커집니다."s" : n이 1 작아집니다."d" : n이 10 커집니다."a" : n이 10 작아집니다.위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
def solution(n, control):
for i in control:
if i == "w": n += 1
elif i == "s": n -= 1
elif i == "d": n += 10
else: n -= 10
return n
제일 많은 정석적인.. 풀이? 인듯
def solution(n, control):
answer = n
c = { 'w':1, 's':-1, 'd':10, 'a':-10}
for i in control:
answer += c[i]
return answer
딕셔너리를 이용해서 키-값으로 더한 풀이, 신박하다
수 조작하기 2
문제 설명
정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다."w" : 수에 1을 더한다."s" : 수에 1을 뺀다."d" : 수에 10을 더한다."a" : 수에 10을 뺀다.그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
def solution(numLog):
answer = ''
for i in range(1, len(numLog)):
if numLog[i-1] + 1 == numLog[i]:
answer += "w"
elif numLog[i-1] - 1 == numLog[i]:
answer += "s"
elif numLog[i-1] + 10 == numLog[i]:
answer += "d"
else:
answer += "a"
return answer
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
def solution(arr, queries):
for query in queries:
for i in range(1, 2):
j = query[i-1]
k = query[i]
arr[j], arr[k] = arr[k], arr[j]
return arr
중첩 반복문 .. 이런 문제에 쓰면 안된다는 것을 알지만 해결법이 떠오르지 않았어 ㅠ
def solution(arr, queries):
for a,b in queries:
arr[a],arr[b]=arr[b],arr[a]
return arr
다른 사람 풀이:
반복문 이렇게 두 개의 값을 가져올 수 있는지.. 몰랐어요 ~~^^
쿼리 안의 쿼리를 인덱스로 이용해서 리스트 원소 교환
수열과 구간 쿼리 2
문제 설명
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
def solution(arr, queries):
answer = []
temp = []
for s,e,k in queries:
new_arr = arr[s:e+1]
temp = [i for i in new_arr if i > k]
if temp:
value = min(temp)
answer.append(value)
else:
answer.append(-1)
return answer
아오 .....어렵다 .....ㅠㅠ 힌트랑 이것저것 도움받고 결국 성공 ...
1. arr 배열을 인덱스 s~e까지 자르기
2. 잘린 배열을 반복문을 통해 k보다 큰 값 찾아서 temp에 넣기
3. temp가 비어있지 않을 때, temp의 최솟값 찾기, 비어있으면 answer은 -1
문자열 code가 주어집니다.code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.mode가 0일 때code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.mode가 1일 때 code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
def solution(code):
mode = False
ret = ''
for i in range(len(code)):
if mode == False:
if code[i]!="1" and i%2==0:
ret += code[i]
mode = not mode if code[i] == "1" else mode
else:
if code[i]!="1" and i%2==1:
ret += code[i]
mode = not mode if code[i] == "1" else mode
if ret == '':
ret = "EMPTY"
return ret
아직은 요령이 없어서 문제 설명 곧이 곧대로 해석해서 코드를 짜는 것 같다.
1. if문으로 mode > 0,1 구분
2. 0일 때, code[i]가 1이 아니고, 짝수일 때 문자 추가 + code[i]가 1이면 토글
3. 1일 때, code[i]가 1이 아니고, 홀수일 때 문자 추가 + code[i]가 1이면 토글
4. 만들어진 문자열 ret이 빈 문자열이면 EMPTY 반환
def solution(code):
answer = ''
mode = 0
for i in range(len(code)):
if code[i] == '1':
mode ^= 1
else:
if i % 2 == mode:
answer += code[i]
return answer if answer else 'EMPTY'
다른 사람 풀이 :
1. code 문자열에서 "1"을 만날 때마다 mode를 토글하는 코드 : mode ^= 1
(문자열이 1이면 추가 안하고 토글만)
2. if i % 2 == mode: >(mode == 0 and i % 2 ==0) or (mode == 1 and i % 2 ==1) 로 해석할 수 있음
> 그래서 mode 0이고 짝수이거나, mode 1이고 홀수일 때, 문자열 추가!
3. 만약 answer가 비어 있다면 "EMPTY"를 반환
등차수열의 특정한 항만 더하기
문제 설명
두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.
def solution(a, d, included):
res = 0
for i in range(len(included)):
res += (a + i*d) if included[i] == True else 0
return res
다행히?도 등차수열 합공식이 기억이 나서 활용했다.
불린 배열이 True일 때의 항만 더하기
주사위 게임 2
문제 설명
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
def solution(a, b, c):
answer = 0
if a != b and b != c and a != c:
answer = a + b + c
elif a == b == c:
answer = (a + b + c) * (a**2 + b**2 + c**2) * (a**3 + b**3 + c**3)
else: answer = (a + b + c) * (a**2 + b**2 + c**2)
return answer
set([a, b, c)] : 주어진 리스트로부터 집합을 생성 > 집합은 중복된 원소를 허용하지 않고, 따라서 중복 값은 하나로 축소됨.
a,b,c 값을 비교하여 생성된 집합의 길이가
1이면 3개의 수가 다 같은 것, 2면 어느 2개의 수가 같은 것, 3이면 3개의 수가 모두 다름.
요렇게 활용해서 값을 추출한다.
원소들의 곱과 합
문제 설명
문제 설명 정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.
def solution(num_list):
sum = 0
cal = 1
for i in range(len(num_list)):
sum += num_list[i]
cal *= num_list[i]
sum = sum ** 2
return 1 if cal < sum else 0
def solution(num_list):
s = sum(num_list) ** 2
m = eval('*'.join([str(n) for n in num_list]))
return 1 if s > m else 0
다른 사람 풀이:
python 내장함수들을 잘 활용하는 것 같다.
sum 함수로 리스트의 모든 요소를 더하고 제곱함.
eval 함수 : 문자열로 표현된 파이썬 식(expression)을 실행하고 결과를 반환
리스트의 각 요소를 문자열로 변환한 리스트 생성 > 각 요소를 * 로 연결 > eval 함수로 수식 실행
이어 붙인 수
문제 설명
정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.
def solution(num_list):
even = ""
odd = ""
for i in num_list:
if i % 2 == 0:
even += str(i)
else:
odd += str(i)
return int(even) + int(odd)
정수 num과 n이 매개 변수로 주어질 때, num이 n의 배수이면 1을 return n의 배수가 아니라면 0을 return하도록 solution 함수를 완성해주세요.
def solution(num, n):
return 1 if num % n == 0 else 0
나이쓰
def solution(num, n):
return int(num % n == 0)
다른 사람 풀이 : true => 1, false => 0 을 활용해서 이렇게 풀 수도 있군
공배수
문제 설명
정수 number와 n, m이 주어집니다. number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 return하도록 solution 함수를 완성해주세요.
def solution(num, n, m):
return 1 if num % n == 0 and num % m == 0 else 0
def solution(number, n, m):
return int(bool(number % n == 0) & bool(number % m == 0))
다른 사람 풀이 :
bool - true/false >> int - 1,0 출력
oh... damn~~~~
홀짝에 따라 다른 값 반환하기
문제 설명
양의 정수 n이 매개변수로 주어질 때, n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return 하고 n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요.
def solution(n):
res = 0
if n%2==1:
for i in range (1, n+1, 2):
res += i
else:
for i in range(2, n+1, 2):
res += i*i
return res
정답이지만 제 코드는 상당히 기네요. 뭔가 짧고 신박한 다른 사람 풀이 보면 킹받음
def solution(n):
if n%2:
return sum(range(1,n+1,2))
return sum([i*i for i in range(2,n+1,2)]
다른 사람 풀이 :
[i*i for in range(2, n+1, 2)] > 리스트 컴프리헨션 표현식
조건 문자열
문제 설명
문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.두 수가 n과 m이라면">", "=" : n >= m"<", "=" : n <= m">", "!" : n > m"<", "!" : n < m두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.
def solution(ineq, eq, n, m):
res = 0
if eq == "=":
cal = ineq + eq
if cal == ">=":
res = int(bool(n >= m))
elif cal =="<=":
res = int(bool(n <= m))
else:
cal = ineq
if cal == ">":
res = int(bool(n > m))
elif cal =="<":
res = int(bool(n < m))
return res
제 코드ㅡㅡ 너무우 길어요
def solution(ineq, eq, n, m):
return int(eval(str(n)+ineq+eq.replace('!', '')+str(m)))
다른 사람 풀이 :
1. 느낌표를 공백으로 대체
2. n과 m을 문자열로 변환하여 ineq와 eq 문자열과 함께 문자열을 생성
3. eval함수로 문자열을 평가하여 비교식 실행
4. 정수로 변환하여 최종 결과 반환 ( True는 1로, False는 0으로)
eval 문자열을 파이썬 코드로 해석하고 실행함. 단일 표현식을 평가하는 데 사용되며, 표현식은 변수, 연산자, 함수 호출 등이 포함될 수 있다.
replace('!', ' ')
특정 부분 문자열을 다른 문자열로 대체하는 데 사용됩니다. replace('!', ' ')는 문자열에서 모든 느낌표(!)를 공백으로 대체하는 것을 의미
flag에 따라 다른 값 반환하기
문제 설명
두 정수 a, b와 boolean 변수 flag가 매개변수로 주어질 때, flag가 true면 a + b를 false면 a - b를 return 하는 solution 함수를 작성해 주세요.
def solution(a, b, flag):
return a + b if flag else a - b