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