DAY 4,5
def solution(n):
answer = 0
if n%7 == 0:
answer = n/7
else:
answer = n//7 +1
return answer
def solution(n):
pizza=1
while (6*pizza)%n!=0:
pizza+=1
return pizza
회고
문제의 의도를 파악하여 풀지않고 예제만 보면서 코드를 짰다
해당 문제는 최소공배수를 구하는 거였는데 while문을 떠올렸음에도 냅다 코드부터 치고보는게 문제였다
def solution(slice, n):
if n%slice==0:
return n//slice
else:
return n//slice+1
def solution(slice, n):
d, m = divmod(n, slice)
return d + int(m != 0)
divmod()
몫과 나머지를 동시에 구하고 싶을 때 사용한다
두 개의 숫자를 인자로 받아, 첫번 째 숫자를 두번 째 숫자로 나눈 몫과 나머지를 튜플(tuple) 형태로 반환
def solution(price):
answer = 0
if price >=500000:
answer = price - price*0.2
elif price >=300000:
answer = price - price*0.1
elif price >= 100000:
answer = price - price*0.05
else:
answer = price
return int(answer)
테스트코드에서 에러가 났는데 이걸 유추하는 연습도 필요할것 같다
어디가 문제지 고민하다보니 소숫점, 할인 적용을 받지 않는 else부분을 생각하지 않아서 통과하지 못했다
def solution(money):
answer = []
cup = money//5500
answer.append(cup)
answer.append(money-cup*5500)
return answer
def solution(money):
return [money//5500, money%5500]
난 바보가 분명함
애초에 일의자리까지 값이 주어지지 않으니 바로 %로 해결하면됨...
DAY 6,7
def solution(num_list):
answer = []
odd, even=0,0
for x in num_list:
if x%2==0:
even+=1
else:
odd+=1
answer.append(even)
answer.append(odd)
return answer
def solution(num_list):
answer=[0,0]
for x in num_list:
answer[x%2]+=1
return answer
2로 나눴을 때 나머지값이 0,1 둘 중 하나로 나오기때문에, answer 배열의 0,1 위치에 맞춰 누적합을 넣으면 코드가 더 간단해진다
def solution(my_string, n):
answer=""
for x in my_string:
answer+=x*n
return answer
def solution(my_string, n):
return ''.join( x*n for x in my_string)
파이썬 컴프리헨션을 사용한 리펙토링 코드
파이썬 코테를 공부하다보면 생소한 for 문들이 보이는데 자주 사용하도록 노력하자
def solution(my_string, letter):
answer = ''
for x in my_string:
if x!= letter:
answer+=x
return answer
def solution(my_string, letter):
return my_string.replace(letter, '')
.replace()
를 사용해 문자열을 ''로 바꿔 코드를 더 줄일 수 있다
def solution(angle):
answer = 0
if angle<90:
answer=1
elif angle==90:
answer=2
elif angle<180:
answer=3
else:
answer=4
return answer
def solution(n, k):
sheep = n*12000
drink = (k-(n//10))*2000
return sheep+drink
def solution(n, k):
return 12000*n + 2000*(k-n//10)
나 되게 비효율적으로 짜는구나 새삼 깨달음
연산자 우선순위 생각해서 괄호 줄이기, 불필요한 변수 사용 줄이기
def solution(n):
answer = 0
for i in range(2,n+1):
if i%2==0:
answer+=i
return answer
def solution(n):
return sum( x for x in range(2, n+1, 2))
- 파이썬 컴프리헨션 사용
- 2~n 범위에서 2씩 증가하는 값을 sum으로 합한다
DAY8
새벽에 끝냄
def solution(age):
answer = ''
age_list = []
# 알파벳 문자 배열 생성
for i in range(97, 123):
age_list.append(chr(i))
# 문자열 자르기
for x in str(age):
answer += age_list[int(x)]
return answer
아스키코드로 생성하는건 쉽게 했는데 age를 자르는 부분에서 의외로 걸렸다. enumerate 써야하나 10으로 나누고 몫구해서 돌려야 하나 비효율적으로 생각했음
def solution(age):
# age = "2" "3"
# i = 0, 1
return ''.join([chr(int(i) + 97) for i in str(age)])
def solution(emergency):
answer = []
danger = sorted(emergency, reverse=True) # [76, 24, 3]
for i in emergency:
answer.append(danger.index(i)+1)
return answer
필요한 아이디어는 다 생각을 하는데 코드정리가 안되어 있어서인지 비효율적으로 왔다갔다 하는 느낌 ;ㅅ;
2023.06.14 DAY9
- 문제 난이도가 점점 어려워지는듯
- 리펙토링하면서 복습하니까 시간이 제법 걸림
def solution(hp):
answer = 0
while hp > 0:
if hp%5 !=0:
answer += hp//5
hp = hp%5
if hp%3 !=0:
answer += hp//3
hp = hp%3
else:
answer += hp//3
hp = 0
else:
answer += hp//5
hp = 0
answer +=hp
hp=0
return answer
print(solution(hp))
난 바본가..?
if 문으로 전부 해결해야한다는 강박이 있는듯. 사고를 확장하자...
def solution(hp):
answer = 0
ant = [5,3,1]
for x in ant:
if hp==0:
break
answer += hp//x
hp = hp%x
return answer
배열로 전체 돌리면서 answer에 몫 저장, 나머지를 hp와 치환하여 hp==0일 경우 멈추기.
def solution(letter):
answer = ''
morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
q = letter.split(' ')
for x in q:
answer+=morse[x]
return answer
morse={} 이런 형태를 처음봐서 어떤식으로 접근해야할지 어려웠다. 파이썬의 {} 형식은 dict, dctionary 형태인 key, value 튜플 형식이다
morse를 전체 돌리고 split으로 나눈 q를 비교해 같으면 answer에 넣는 방식을 생각했는데 비효율적이었다. 단순하게 생각하자.
def solution(letter):
answer = ''
morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
return ''.join(morse[x] for x in letter.split(' '))
def solution(rsp):
answer = ''
for x in rsp:
if x =='2':
answer+='0'
elif x == '0':
answer +='5'
elif x == '5':
answer +='2'
return answer
def solution(rsp):
compare = {'0':'5', '2':'0', '5':'2' }
return ''.join(compare[i] for i in rsp)
모스부호 문제에서 봤던 튜플을 사용해서 문제를 풀수 있다
from math import factorial as fac
def solution(balls, share):
answer = 0
n = fac(balls)
m = fac(share)
b = fac(balls - share)*m
return n/b
파이썬 factorial을 import하여 사용하기
Day10
다시풀이
- 2차원으로 만들기
- 공던지기
def solution(numbers, direction):
answer = []
if direction == "right":
answer.append(numbers.pop())
for x in numbers:
answer.append(x)
else:
a = numbers.pop(0)
for x in numbers:
answer.append(x)
answer.append(a)
return answer
rotate가 생각 안나서 비효율적으로 풀었다...
def solution(numbers, direction):
if direction == "right":
answer = [numbers[-1]] + numbers[:len(numbers)-1]
else:
answer = numbers[1:] + [numbers[0]]
return answer
내 코드를 개선한다면 위의 코드와 같을듯. 불필요한 append보다는 슬라이싱을 사용
from collections import deque
def solution(numbers, direction):
numbers = deque(numbers)
if direction == "right":
numbers.rotate(1)
else:
numbers.rotate(-1)
return list(numbers)
deque의 rotate를 사용한 방식.
deque를 떠올렸지만 어떻게 써야할지를 몰라서 못사용함.
사용법 숙지하기
DAY 11,12
from math import factorial
def solution(n):
k=10
while n<factorial(k):
k-=1
return k
파이썬 팩토리얼
from math import factorial
def solution(my_string):
answer = []
for x in my_string:
if x.isdigit():
answer.append(int(x))
answer.sort()
return answer
def solution(my_string):
return sorted(int(x) for x in my_string if x.isdigit())
def solution(my_string):
answer = 0
for x in my_string:
if x.isdigit():
answer+=int(x)
return answer
def solution(my_string):
return sum(int(x) for x in my_string if x.isdigit())
sum()
을 사용할때 밖으로 빼서 한번에 묶기
def solution(n):
answer = []
d = 2
while d<=n:
if n%d==0:
if d not in answer:
answer.append(d)
n=n//d
else:
d+=1
return answer
set() -> list()로 중복을 없앴는데 이부분이 문제인것 같아서 기존코드에 not in을 사용해서 조건문을 수정함
시간복잡도...?문제인가?
DAY13
def solution(s):
answer =0
num = list(s.split(" "))
for i in range(len(num)):
if num[i]!="Z":
answer+=int(num[i])
else:
answer-=int(num[i-1])
return answer
리스트에 공백을 제거해서 문자열을 넣고 합을 구했다
스택을 사용하는 방식으로 리펙토링 해봄
def solution(s):
answer = []
for x in s.split():
if x != 'Z':
answer.append(int(x))
else:
answer.pop()
return sum(answer)
파이썬에서
문자열.split()
을 사용할때 괄호안의 파라미터에 아무런 값이 없을 경우 띄어쓰기, 엔터를 구분하여 문자열을 나눈다
def solution(my_string):
answer = []
arr = list(my_string)
for x in arr:
if x not in answer:
answer.append(x)
return "".join(answer)
문제 자체는 쉬웠는데 처음엔 왜 이중 for문으로 전체 탐색을 하려고 했는지 모르겠음 ㅎㅎ not in이 생각나서 위 문제 처럼 list를 사용했으나 문자열 자체만으로 구할 수 있는 간단한 문제였다
def solution(my_string):
answer = ''
for x in my_string:
if x not in answer:
answer+=x
return answer
DAY14,15
def solution(order):
answer = 0
game = [3,6,9]
while order>0:
t = order%10
if t in game:
answer+=1
order = order//10
return answer
이어진 숫자를 한자리 수로 나누는 방식이 떠오르지 않아서 10나누기를 사용함.
def solution(order):
answer = 0
order = str(order)
return order.count('3') + order.count('6') + order.count('9')
이어진 숫자를 문자열로 변환하기
동일한 문자열이 있는지문자열.count()
를 활용해서 사용
def solution(cipher, code):
answer = ''
for x in range(code-1, len(cipher), code):
answer+=cipher[x]
return answer
증가폭을 range만 떠올림; 슬라이싱 잘 활용하도록 하자
def solution(cipher, code):
answer = cipher[code-1::code]
return answer
파이썬 슬라이싱
a[7::2] # 인덱스 7부터 2씩 증가시키면서 리스트의 마지막 요소까지 가져옴
def solution(numbers):
nums=["zero","one","two","three","four","five","six","seven","eight","nine"]
for idx, x in enumerate(nums):
numbers = numbers.replace(x, str(idx))
return int(numbers)
리스트까지는 만들었는데 이 문자열을 어떻게 대응해서 바꾸지 고민하다가 검색해봄
enumerate로 리스트를 받아와 대응되는 x값을 numbers에서 찾아 해당 인덱스를 문자열로 변환함
for ch in s.split()
를 사용하려고 했으나 주어진 값이 "abcabcabc"임으로 split()을 나눠도 문자열 통짜로 됨!list(s)
사용 (문자열 자체인 s를 사용해도 됨)딕셔너리.items()
사용def solution(s):
word = dict()
for ch in list(s):
if ch not in word.keys():
word[ch] = 0
word[ch] += 1
return ''.join(sorted([ch[0] for ch in word.items() if ch[1]==1]))
def solution(s):
answer = ''
for x in s:
if s.count(x)==1:
answer+=x
return ''.join(sorted(answer))
- 문자열을 탐색하여 문자가 하나밖에 없는것을 answer에 저장
문자열.count()
- 문자가 하나씩 밖에 없는 answer를 오름차순 정렬하여 문자열로 반환
DAY 16,17
def solution(array):
answer = []
max_num = sorted(array, reverse=True)
idx = array.index(max_num[0])
return [max_num[0],idx]
def solution(array):
return [max(array), array.index(max(array))]
따로 변수에 내림차순 정렬후 최대값에 대응하는 인덱스를 찾았는데 다른 코드를 보니 max(array)
만으로 최대값을 한번에 찾을 수 있었다
def solution(my_string):
s = my_string.split(' ')
answer = int(s[0])
for x in range(1, len(s), 2):
if s[x]=='+':
answer+=int(s[x+1])
else:
answer-=int(s[x+1])
return answer
split으로 정리하고 범위를 지정하는것 까지는 좋았는데 2번씩 띄어서 계산한다는걸 생각 못하고 막혀버림,,, 반성하자ㅏㅏ
def solution(my_string):
return eval(my_string)
파이썬 내장함수
eval(문자열)
문자로 표현된 표현식을 계산해준다. 코테 풀때는 요긴하겠지만
서버입장에서는 해당 명령어로 인해 해킹, 공격을 받을 수 있는 허점이 될 수 있다
def solution(num, k):
answer = -1
num = str(num)
for x in num:
if x == str(k):
return num.index(x)+1
return answer
def solution(num, k):
answer = -1
for idx, x in enumerate(str(num)):
if x == str(k):
return idx+1
return answer
enumerate를 사용하는 방식
def solution(n, numlist):
answer = []
for x in numlist:
if x%n==0:
answer.append(x)
return answer
def solution(n, numlist):
return [x for x in numlist if x%n==0]
def solution(n):
# answer = 0
# n = str(n)
# for x in n:
# answer += int(x)
return sum(int(x) for x in str(n))
def solution(quiz):
answer = []
for x in quiz:
s= x.split()
if s[1] == '+':
if(int(s[0])+int(s[2])) == int(s[len(s)-1]):
answer.append("O")
else:
answer.append("X")
else:
if(int(s[0])-int(s[2])) == int(s[len(s)-1]):
answer.append("O")
else:
answer.append("X")
return answer
DAY18, 19
DAY20
# key[0], value[1] 탐색
x = [dt[0] for dt in dots]
y = [dt[1] for dt in dots]
# 오름차순 정렬 lambda식
dots = sorted(key = lambda dt:dt[1])
def solution(dots):
answer = 0
x = [dt[0] for dt in dots]
y = [dt[1] for dt in dots]
w = max(x) - min(x)
h = max(y) - min(y)
area = w*h
return area
2차원 배열 탐색, enumerate, 딕셔너리 같은 구현 부분이 아직 부족함
for문을 통해 key, value 값만 탐색 가능
최대값은 비교없이 바로 배열에서 찾을 수 있다
테케에서 막혔을때 반례를 찾는 공부가 필요할것 같다
다른 사람들의 코드를 봐도 어떤 점에서 다르고 뭘 염두했는지 감이 안잡혔다
위의 코드는 끝까지 이동 한 뒤 반대로 이동하면 좌표가 달라지는 부분을 염두하지 않았다. and조건에서 한값이 막히면 바로 contiue로 넘어가버린다
["left", "left", "left", "right", "right", "right", "right"], [5, 5] 테케를 줬을때 [2,0] 이아닌 [-3,0]이 나옴
def solution(keyinput, board):
x=y=0
xarea = board[0]//2
yarea = board[1]//2
for key in keyinput:
if key =="up":
if y>=yarea:
y=yarea
else:
y+=1
elif key == "down":
if y<=-yarea:
y=-yarea
else:
y-=1
elif key == "left":
if x<=-xarea:
x=-xarea
else:
x-=1
elif key == "right":
if x>=xarea:
x=xarea
else:
x+=1
return [x,y]
def solution(keyinput, board):
x_lim,y_lim = board[0]//2,board[1]//2
move = {'left':(-1,0),'right':(1,0),'up':(0,1),'down':(0,-1)}
x,y = 0,0
for k in keyinput:
dx,dy = move[k]
if abs(x+dx)>x_lim or abs(y+dy)>y_lim:
continue
else:
x,y = x+dx,y+dy
return [x,y]
테케 에러ㅎㅎ 문자열 조합... 공부하자
def solution(polynomial):
xnum = 0
const = 0
for c in polynomial.split(' + '):
if c.isdigit():
const+=int(c)
else:
xnum = xnum+1 if c=='x' else xnum+int(c[:-1])
if xnum == 0:
return str(const)
elif xnum==1:
return 'x + '+str(const) if const!=0 else 'x'
else:
return f'{xnum}x + {const}' if const!=0 else f'{xnum}x'
- 안전지대 다시풀이
def solution(my_string):
answer = 0
for x in my_string:
if x.isalpha():
my_string = my_string.replace(x,' ')
for i in my_string.split():
answer+=int(i)
return answer
digit를 기준으로 나눴을때 변수 하나를 더 둬서 앞으로 체크를 하는 방식을 하려고했으나... 코드구현이 점점 복잡해졌다. 반대로 알파벳 기준으로 분별해 공백으로 바꾸고 공백 기준으로 숫자로 변환함
def solution(my_string):
intch = "0"
answer = 0
for ch in my_string:
if ch.isdigit():
intch += ch
else:
answer += int(intch)
intch = "0"
answer += int(intch)
return answer
digit 기준으로 나눈 코드
연속된 숫자를 어떻게 판별하나갸 관건이었는데 else에서 바로 answer를 숫자화 시켜 바꿈, intch변수를 사용해서 초기화 or 문자열 합침을 두가지 활용한거 보고 감탄함
def solution(sides):
answer = 0
sides.sort()
a,b = sides
c=0
# b가 가장 클 경우 a+c<b, [3+c]<6
# c=[0<1,2,3<a+b(6)]
for c in range(b-a+1, b+1):
answer+=1
# c가 가장 클 경우 a+b>c, [3+6]>c
for c in range(b+1,a+b):
answer+=1
return answer
def solution2(spell, dic):
answer=0
for word in dic:
ch = 0
for x in spell:
if x in word:
ch+=1
if ch == len(spell):
return 1
return 2
길이 체크를 spell로 해줬어야함
- 겹치는 선분의 길이 다시풀이
def solution(a, b):
# 기약분수인지 판별 // 기약분수로 만들기
for i in range(2, a + 1):
if a % i == 0 and b % i == 0:
a = a // i
b = b // i
# 소인수 분해
num = [] # 소인수 저장
i = 2
while i <= b: # 소인수 구하기
if b % i == 0:
b //= i #나눈값의 몫을 대입
num.append(i)
else:
i += 1
if all(i in [2, 5] for i in num):
# 소인수가 2와 5만 존재하면 유한소수 그렇징 않으면 무한소수
return 1
return 2
print(solution(13,14))
DAY23
def solution(numlist, n):
answer = sorted(numlist, key=lambda x: (abs(x-n), -x))
return answer
기준을 삼아서 정렬하는 문제는 lambda 사용하기
매개변수 x가 numlist값들을 순회하면서 절대값(abs)를 사용하여 기준값 n에서 가장 작은 값을 내림차순(-x)으로 정렬한다
갑작스런 이석증으로 쉬어감 ;ㅅ;
마지막 부분부터 난이도가 헬이라 속도를 줄였다
def solution(id_pw, db):
for [x, y] in db:
if x == id_pw[0]:
if y == id_pw[1]:
return "login"
else:
return "wrong pw"
return "fail"
이차원 배열 탐색이 아직 어색함.
key, value값을 자유자재로 다룰 수 있도록 연습필요
from itertools import permutations
def solution(babbling):
answer=0
baby = ["aya","ye","woo","ma"]
temp=[]
# 모든 경우의 수
for i in range(1, len(baby)+1):
for j in permutations(baby, i):
temp.append(''.join(j))
# cnt
for k in babbling:
if k in temp:
answer+=1
return answer
항상 순열, 조합 관련된 문제는 제대로 풀지 못했는데 from itertools import permutations
를 활용하여 전체 경우의 수를 만들고 같은 경우를 세는 코드를 공부함
순열 Promutations
- 서로다른 n개에서 r개를 선택할때 순서를 고려하여, 중복없이 뽑을 경우의 수
nPr = n!/(n-r)!
- A,B,C 에서 순서에 상관있고, 중복없이 뽑을 경우의 수
from itertools import permutations arr = ['a','b','c'] for x in permutations(arr,2): print(x) """ ('a', 'b') ('a', 'c') ('b', 'a') ('b', 'c') ('c', 'a') ('c', 'b') """
조합 Combinations
- 서로다른 n개에서 r를 선택할 때 순서를 고려하지 않고, 중복없이 뽑는 경우의 수
nCr = n!/r!(n-r)!
from itertools import combinations arr = ['a','b','c'] for y in combinations(arr,2): print(y) """ ('a', 'b') ('a', 'c') ('b', 'c') """
def solution(before, after):
cnt=0
answer=0
for x in before:
if before.count(x)==after.count(x):
cnt+=1
if cnt == len(before):
answer=1
return answer
[-1::]로 풀었다가 지문을 재대로 못읽어서 테케 에러남
딕셔너리를 활용헤서 같은 값을 모으려다가 count()
를 활용
def solution(i, j, k):
answer = 0
for c in range(i, j+1):
for find in str(c):
if str(k)==find:
answer+=1
return answer
겁나 비효율적으로 풀었다
def solution(i, j, k):
return sum(str(x).count(str(k)) for x in range(i, j+1))
위에서 count풀어 놓고 활용을 못하네,,,
def solution(bin1, bin2):
answer = ''
ad = int(bin1,2) + int(bin2,2)
answer = bin(ad)
return answer[2:]
def solution(bin1, bin2):
return bin(int(bin1,2)+int(bin2,2))[2:]
십진수를 이준수로 변환
b = bin(16) print(b) # 0b10000
이진수를 십진수로 변환
a = int('0b10000', 2) print(a) # 16
- 치킨쿠폰 다시 풀기
from collections import deque
def solution(A, B):
qA=deque(A)
qB=deque(B)
for i in range(len(A)):
if qA==qB:
return i
qA.rotate(1)
return -1
원래 append(pop())를 사용하려고 했는데 어떤 이유에서인지 에러가 자꾸나 rotate를 사용했다
def solution(A,B):
A, B = list(A), list(B)
for cnt in range(len(A)):
if A == B:
return cnt
A.insert(0,A.pop())
return -1