Search

입문

나이 출력

def solution(age): return 2023 - age # 2022 - age + 1
Python
복사

몫 구하기

def solution(num1,num2): return num1 // num2
Python
복사

두 수의 곱

def solution(num1,num2): return num1 * num2
Python
복사

나머지 구하기

solution = lambda num1, num2 : num1 % num2
Python
복사

숫자 비교하기

# 같으면 1, 다르면 -1 리턴 def solution(num1,num2): if num1 == num2: return 1 else : return -1
Python
복사

각도기

def solution(angle): if angle < 90 : return 1 elif angle == 90 : return 2 elif angle < 180 : return 3 else : return 4
Python
복사
# 다른 풀이 # def solution(angle): answer = (angle // 90) * 2 + (angle % 90 > 0) * 1 return answer
Python
복사

두 수의 나눗셈

trunc() / int() : 0으로 향하는 내림, 단순히 소수점을 버림 ( floor() : 위로 향하는 내림)
def solution(num1,num2): return int(num1 / num2 * 1000)
Python
복사
import math def solution(num1,num2): return math.trunc(num1/num2*1000)
Python
복사

양꼬치

def solution(n, k): answer = 12000*n + 2000*(k-(n//10)) return answer
Python
복사

배열의 평균값

sum()
len()
def solution(numbers): return sum(numbers) / len(numbers)
Python
복사

머쓱이보다 키 큰 사람

def solution(array, height): cnt = 0 for i in array: if i > height: cnt += 1 return cnt
Python
복사

중복된 숫자 개수

.count() : 배열의 원소 수를 세는 함수
def solution(array, n): cnt = 0 for i in array: if i == n: cnt += 1 return cnt
Python
복사
def solution(array,n): return array.count(n)
Python
복사

짝수의 합

def solution(n): sum = 0 while n > 0 : if n % 2 == 0: sum += n n -= 1 return sum
Python
복사
range()
def solution(n): sum = 0 for i in range(2,n+1): if i % 2 == 0: sum += i return sum
Python
복사
def solution(n): return sum([i for i in range(2,n+1,2)])
Python
복사

피자 나눠먹기(1)

def solution(n): if n % 7 != 0: answer = n//7 + 1 else : answer = n//7 # 딱 나눠떨어질 경우 몫으로 피자 수 계산 return answer
Python
복사
몫만으로 간단하게 구현 가능한 코드
def solution(n): return (n - 1) // 7 + 1
Python
복사

배열 두 배 만들기

def solution(numbers): answer = [i*2 for i in numbers] return answer
Python
복사
map() 활용하기
def solution(numbers): return list(map(lambda x : x * 2, numbers))
Python
복사

문자열 뒤집기

[::-1] : 슬라이싱 이용하기 (원본 바뀌지 않음)
reverse() : 메서드 이용하기 (원본 바뀜)
reversed() : 내장 함수 이용하기 (iterator 객체의 형태로 반환하기 때문에 내장함수 list()를 적용해줘야 한다, 원본 바뀌지 않음)
def solution(my_string): return my_string[::-1]
Python
복사
def solution(my_string): return list(reversed(my_string))
SQL
복사

배열 원소의 길이

def solution(strlist): answer = [] for i in strlist: answer.append(len(i)) return answer
Python
복사
def solution(strlist): return [len(i) for i in strlist]
Python
복사

짝수 홀수 개수

def solution(num_list): even = 0 odd = 0 for i in num_list: if i % 2 == 0: even += 1 else : odd += 1 answer = [even, odd] return answer
Python
복사
def solution(num_list): answer = [0,0] for i in num_list: answer[i%2] += 1 # 나머지값으로 짝수, 홀수 한꺼번에 처리 return answer
Python
복사
def solution(num_list): answer = [0,0] for i in num_list: if i%2 == 0: # 짝수 answer[0] += 1 else : answer[1] += 1 return answer
Python
복사

최댓값 만들기(1)

def solution(numbers): numbers.sort(reverse=True) # 내림차순 정렬 a = numbers[0] # 가장 큰 수 b = numbers[1] # 두번째로 큰 수 return a * b
Python
복사

특정 문자 제거하기

strip : 양 끝의 불필요한 문자를 제거 (앞 뒤 붙어있는 문자만 삭제 가능)
replace : 지정 문자열을 치환하여 삭제 ( 문자열 안에 있는 불필요한 문자 삭제 가능 )
translate : 여러 개로 지정한 문자열을 한번에 삭제
re.sub() : 복잡한 패턴의 문자열을 치환하여 삭제
def solution(my_string, letter): answer = my_string.replace(letter,'') return answer
Python
복사

아이스 아메리카노

def solution(money): answer = [0,0] answer[0] = money // 5500 answer[1] = money % 5500 return answer
Python
복사
def solution(money): answer = [money // 5500, money % 5500] return answer
Python
복사

피자 나눠먹기(3)

def solution(slice, n): if n % slice == 0: # 나머지가 없으면 몫이 필요한 판의 수다 answer = n // slice else : answer = n // slice + 1 return answer
Python
복사

배열 자르기

def solution(numbers, num1, num2): return numbers[num1:num2+1]
Python
복사

점의 위치 구하기

def solution(dot): if dot[0] > 0 and dot[1] > 0 : return 1 elif dot[0] > 0 and dot[1] < 0 : return 4 elif dot[0] < 0 and dot[1] > 0 : return 2 else: return 3
Python
복사

삼각형의 완성조건(1)

def solution(sides): sides.sort() #오름차순 정렬 if sides[2] < sides[0] + sides[1]: # 삼각형 조건 return 1 else: return 2
Python
복사
def solution(sides): return 1 if sides[0] + sides[1] > sides[2] else 2
Python
복사

문자 반복 출력하기

이중 for 문
구분자.join(리스트) :
‘’.join(리스트) : [’a’,’b’,’c’] 이런 식의 리스트를 ‘abc’의 문자열로 합쳐서 반환해주는 함수
‘구분자’.join(리스트) : ‘_’.join([’a’,’b’,’c’]) 라면 ‘a_b_c’ 의 문자열로 합쳐서 반환해줌
def solution(my_string,n): answer = [] for i in range(len(my_string)): # 각 원소에 대해서 for j in range(n): # n번씩 반복 answer.append(my_string[i]) return ''.join(answer)
Python
복사

편지

def solution(message): answer = len(message)*2 return answer
Python
복사

자릿수 더하기

str() : 숫자를 문자타입으로 변경
int() : 숫자모양의 문자를 숫자타입으로 변경
def solution(n): answer = [int(i) for i in str(n)] return sum(answer)
Python
복사

배열의 유사도

def solution(s1, s2): sum = 0 for i in s1: if s2.count(i) == 1: sum += 1 return sum
Python
복사
더 나은 코드
def solution(s1,s2): count = 0 for val in s1: if val in s2: count += 1 return count
SQL
복사
set() + intersection()
# 리스트 중복 찾기 a = [2,3,4] b = [4,5,6] common = set(a).intersection(b) print(common) # {4} # 위의 공식을 사용해보면 답은 아래와 같이 할 수 있다
Python
복사
# 리스트 중복 찾기 a = [2,3,4] b = [4,5,6] common = set(a).intersection(b) print(common) # {4} # 위의 공식을 사용해보면 답은 아래와 같이 할 수 있다 def solution(s1,s2): return len(set(s1).intersection(s2))
Python
복사

순서쌍의 개수

def solution(n): count = 0 for i in range(1,n+1): if n % i == 0: count += 1 return count
Python
복사
def solution(n): return len([i for i in range(1, n+1) if n%i == 0])
Python
복사

제곱수 판별하기

def solution(n): x = n ** (1/2) # 일단 제곱근을 구한다음 if x % 1 == 0: # 정수 1로 나눴을 때 나머지가 생기지 않는다면 return 1 # 제곱수가 되고 else: return 2
Python
복사

옷가게 할인 받기

import math def solution(price): if price >= 500000: return math.trunc(price*0.8) elif price >= 300000: return math.trunc(price*0.9) elif price >= 100000: return math.trunc(price*0.95) else : return price
Python
복사
math 모듈을 불러올 필요 없이 int() 함수를 이용해서도 소수점을 버릴 수 있다.
def solution(price): if price >= 500000: price = price*0.8 elif price >= 300000: price = price*0.9 elif price >= 100000: price = price*0.95 return int(price)
Python
복사

문자열안에 문자열

def solution(str1, str2): if str1.count(str2) >= 1: return 1 else: return 2
Python
복사
def solution(str1,str2): return 1 if str2 in str1 else 2
Python
복사

중앙값 구하기

def solution(array): array.sort() if len(array) % 2 == 0: # 짝수 idx = len(array) // 2 result = (array[idx-1] + array[idx]) / 2 else: # 홀수 idx = len(array) // 2 result = array[idx] return result
Python
복사
하지만 문제의 원소 개수가 홀수로 주어질 것을 감안해서 아래와 같이 코드를 짤 수 있다.
def solution(array): return sorted(array)[len(array)//2]
Python
복사
.sort() 와 sorted() 의 차이 - .sort()는 원본 리스트를 바꿔주며, 아무런 값도 반환하지 않는다. - sorted() 함수는 원본 리스트를 바꿔주는 것이 아니기 때문에 새로운 리스트로 생성한다. 따라서 반환되는 값이 있으며 변수를 지정해줘야 한다.

모음 제거

def solution(my_string): vowel = ('a','e','i','o','u') for i in my_string: if i in vowel: # 모음에 속하면 my_string = my_string.replace(i,'') # 해당 원소를 문자열에서 제거해준다. return my_string
Python
복사
def solution(my_string): return "".join([i for i in my_string if not(i in 'aeiou')])
Python
복사
def solution(my_string): vowel = ['a','e','i','o','u'] for v in vowel: my_string = my_string.replace(v,'') return my_string
Python
복사

숨어있는 숫자의 덧셈(1)

import re def solution(my_string): answer = re.findall(r'\d', my_string) # 결과는 문자형인 숫자를 원소로 갖는 리스트 answer = [int(i) for i in answer] # 숫자형으로 변환해준다 return sum(answer) # 리스트 원소들을 더한다.
Python
복사

정규표현식

findall(pattern,string)

문자열의 pattern에 해당하는 내용들을 찾고, 그 내용들을 리스트로 리턴한다.

개미군단

def solution(hp): general = hp // 5 # 장군 개미의 개수 soldier = (hp % 5) // 3 # 병정 개미의 개수 normal = ((hp % 5) % 3) // 1 # 일반 개미의 개수 return general + soldier + normal
Python
복사

주사위의 개수

def solution(box, n): a = box[0] // n # 가로에 들어가는 주사위의 개수 b = box[1] // n # 세로에 들어가는 주사위의 개수 c = box[2] // n # 높이에 들어가는 주사위의 개수 answer = a*b*c return answer
Python
복사

세균 증식

def solution(n, t): answer = n * (2**t) return answer
Python
복사
 다른 풀이
비트시프트(<< , >>)
왼쪽 시프트 연산자 (<<) : 2를 곱한 것과 같은 효과
ex) n << m : n * 2의 m승
오른쪽 시프트 연산자 (>>) : 2로 나눈 것과 같은 효과
ex) n >> m : n / 2의 m승
def solution(n,t): return n << t
Python
복사

n의 배수 고르기

def solution(n, numlist): answer = [i for i in numlist if i % n == 0] return answer
Python
복사

직각삼각형 출력하기

n = int(input()) for i in range(n): print((i+1)*"*")
Python
복사

문자열 정렬하기(1)

import re def solution(my_string): answer = re.findall(r'\d',my_string) # 문자열에 숫자 모양이 나타난다면 answer = [int(i) for i in answer] # 해당 값들을 정수로 변환한 뒤 리스트 원소로 저장 answer = sorted(answer) return answer
Python
복사
isdigit() : 문자열에서 사용할 수 있는 메서드. 문자열이 ‘숫자’로만 이루어져있는지 확인하는 함수
문자가 ‘단 하나’라도 있다면 False를 반환하고, 모든 문자가 ‘숫자’로만 이루어져있으면 True를 반환한다.
< 사용법 >
1) str.isdigit(”판단하고자 하는 문자열”)
2)”판단하고자 하는 문자열”.isdigit()
주의할 점은 음수를 뜻하는 “-” 나 소수점의 “.”를 문자로 판단하기 때문에 실수나 음수를 판단하지 못한다는 것이다.
“-2”.isdigit(), “1.234”.isdigit() 모두 False 가 된다.
def solution(my_string): return sorted([int(i) for i in my_string if i.isdigit()])
Python
복사

암호 해독

def solution(cipher, code): answer = [] for i in range(len(cipher)): if (i+1) % code == 0: answer.append(cipher[i]) answer = "".join(answer) return answer
Python
복사
위의 작성한 코드는 정답은 갖지만 틀리다고 나온다. 이유가 뭘까? >> 결과가 문자열이 아닌 리스트로 나왔기 때문이다.
def solution(cipher, code): answer = '' for i in range(len(cipher)): if (i+1) % code == 0: # code의 배수번째에 해당하는 값이라면 answer += cipher[i] return answer
Python
복사

대문자와 소문자

string.upper() : 문자열을 모두 대문자로 변경하고 싶을 때
string.lower() : 문자열을 모두 소문자로 변경하고 싶을 때
string.isupper() : 문자열이 대문자인지 판별하는 함수
모두 대문자이면 True, 하나라도 소문자이면 False
string.islower() : 문자열이 소문자인지 판별하는 함수
모두 소문자이면 True, 하나라도 대문자이면 False
def solution(my_string): answer = '' for i in my_string: if i.isupper(): # 대문자라면 answer += i.lower() else: # 소문자라면 answer += i.upper() return answer
Python
복사

가위 바위 보

def solution(rsp): answer = '' for i in rsp: if int(i) == 2: answer += "0" elif int(i) == 0: answer += "5" else: answer += "2" return answer
Python
복사

가장 큰 수 찾기

max() : 배열에서 가장 큰 값 찾기
array.index(값) : 배열 또는 리스트에서 값에 해당하는 위치 찾기
def solution(array): answer = [] for i in array: if i == max(array): answer.append(i) # 가장 큰 값과 answer.append(array.index(i)) # 그 값의 위치 return answer
Python
복사
훨씬 간단하게
def solution(array): return [max(array),array.index(max(array))]
Python
복사

약수 구하기

def solution(n): answer = [] for i in range(1,n+1): if n % i == 0: answer.append(i) answer.sort() # 원본값은 변하지 않음. return answer
Python
복사
이제 아래 리스트 안 for문으로 간단하게 표현해보자
def solution(n): answer = [i for i in range(1,n+1) if n % i == 0] return answer
Python
복사

배열 회전시키기

def solution(numbers, direction): answer = [] if direction == 'right': for i in range(len(numbers)): if i == len(numbers)-1: answer.insert(0,numbers[i]) else: answer.insert(i+1,numbers[i]) else: for i in range(len(numbers)): if i == 0: answer.insert(len(numbers)-1,numbers[i]) else: answer.insert(i-1,numbers[i]) return answer
Python
복사
더 간단하고 깔끔한 코드
→ for 반복문을 사용할 필요가 없다. 슬라이싱방법을 사용하면 됨.
def solution(numbers, direction): if direction == 'right': answer = [numbers[-1]] + numbers[:len(numbers)-1] else: answer = numbers[1:] + [numbers[0]] return answer
Python
복사
한줄로 더 깔끔하게하면
def solution(numbers, direction): return [numbers[-1]] + numbers[:-1] if direction == 'right' else numbers[1:] + [numbers[0]]
Python
복사

외계행성의 나이

아스키 코드를 모른다면
def solution(age): answer = '' word = ['a','b','c','d','e','f','g','h','i','j'] for i in str(age): answer += word[int(i)] return answer
Python
복사
아스키 코드를 활용하면
chr() : 아스키코드 → 문자열로 변환하는 함수
def solution(age): answer = '' return answer.join([chr( ) for i in str(age)])
Python
복사

최댓값 만들기(2)

.sort(reverse=True)
max()
def solution(numbers): # 음수끼리 곱했을 경우도 고려 numbers.sort(reverse=True) # 내림차순으로 정렬 return max(numbers[0]*numbers[1],numbers[-1]*numbers[-2])
Python
복사

인덱스 바꾸기

def solution(my_string, num1, num2): my_string = list(my_string) my_string[num2],my_string[num1] = my_string[num1],my_string[num2] return ''.join(my_string)
Python
복사

피자 나눠 먹기(2)

def solution(n): pizza = 1 while (6*pizza) % n != 0: pizza += 1 return pizza
Python
복사

숫자 찾기

리스트로 풀기 : list.count(’문자’)
def solution(num, k): n = list(map(int,str(num))) if n.count(k) >= 1: answer = n.index(k)+1 # 특정 원소의 위치 찾기 else: answer = -1 # 없다면 -1 출력 return answer
Python
복사
문자열로 풀기 : string.find(’문자’)
def solution(num,k): return -1 if str(k) not in str(num) else str(num).find(str(k)) + 1
Python
복사

369 게임

# for 반복문 사용 def solution(order): answer = 0 for i in str(order): if i == '3' or i == '6' or i =='9': answer += 1 return answer
Python
복사
# .count('특정원소') 함수 사용 def solution(order): order = str(order) return order.count('3') + order.count('6') + order.count('9')
Python
복사
대박 풀이
def solution(order): return sum(map(lambda x: str(order).count(str(x)),[3,6,9]))
Python
복사

문자열 정렬하기(2)

.sort() / sorted() : 문자열, 리스트 모두 사용 가능
str.lower()
list()
‘’.join() : 리스트를 문자열로 바꿀 때 사용
def solution(my_string): my_string = my_string.lower() # 모두 소문자로 변환 my_string = list(my_string) # 리스트로 변환 my_string.sort() # 오름차순 정렬 return ''.join(my_string)
Python
복사
def solution(my_string): return ''.join(sorted(my_string.lower()))
Python
복사

합성수 찾기

def solution(n): answer = [] cnt = 0 for i in range(1,n+1): for j in range(1,i+1): if i % j == 0: answer.append(i) if answer.count(i) >= 3: cnt += 1 return cnt
Python
복사
또는 아래와 같이 리스트를 사용하지 않고 할 수도 있다.
def solution(n): answer = 0 for i in range(1,n+1): cnt = 0 for j in range(1,i+1): if i % j == 0: cnt += 1 if cnt >= 3: answer += 1 return answer
Python
복사

중복된 문자 제거

# for 반복문 사용 def solution(my_string): answer = [] for i in list(my_string): if answer.count(i) == 0: # if i not in answer: answer.append(i) return ''.join(answer) # 리스트 원소들을 합쳐 문자로 반환
Python
복사
# 딕셔너리로 사용하는 방법 def solution(my_string): result = dict.fromkeys(my_string) return ''.join(list(result))
Python
복사

리스트 중복제거 방법 3가지

1.
set을 이용하는 방법
중복을 허용하지 않고 순서가 없다는 성질을 사용
→ list(set(리스트))
2.
for 반복문을 이용하는 방법 : 원소들의 순서가 중요할 때
a.
중복 제거된 값들이 들어갈 리스트를 만들고
b.
for 반복문에서 값들을 하나씩 돌면서
c.
새로 생성한 리스트에 값을 넣는다. 이때, 이미 리스트에 값이 있는지 확인하면 된다.
3.
dictionary 를 이용하는 방법 : 원소들의 순서가 중요할 때
중복을 허용하지 않는다는 성질을 사용. 딕셔너리는 키값이 중복되면 안된다.
a.
딕셔너리 메서드의 dict.fromkeys(iterable)
인자로 들어온 iterable 데이터(리스트, 튜플, 문자)를 key값으로 해서 딕셔너리 자료형을 만들어주는 작업을 하는 메서드 → 중복이 제거된 key값들을 다시 리스트로 변환하면 된다.
ex)
arr = [6,5,6,4,4,1,1,2,3,9,8,7,9,8,7] result1 = dict.fromkeys(arr) # 리스트 값들을 key로 변경 print(result1) # {6: None, 5: None, 4: None, 1: None, 2: None, 3: None, 9: None, 8: None, 7: None} result2 = list(result1) # list(dict.fromkeys(arr)) print(result2) # [6,5,4,1,2,3,9,8,7]
Python
복사

모스부호(1)

글자와 글자 사이는 공백 하나
단어와 단어 사이는 공백 두개
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' } def solution(letter): answer = '' for word in letter.split(' '): for char in word.split(' '): answer += morse[char] return answer
Python
복사

팩토리얼

for 반복문
재귀함수 사용
math 라이브러리 사용
 팩토리얼 구현하기
# 재귀함수로 팩토리얼 구현하기 def my_factorial(n): if(n > 1): return n * my_factorial(n-1) else: return 1 a = int(input('팩토리얼을 구할 숫자를 입력하시오: ')) print(my_factorial(a))
Python
복사
# for문을 사용해서 팩토리얼 구현하기 a = int(input('팩토리얼을 구할 숫자를 입력하시오: ')) result = 1 for item in range(1,a+1,1): result *= item print(result)
Python
복사
# math 라이브러리를 이용해서 팩토리얼 구현하기 import math a = int(input('팩토리얼을 구할 숫자를 입력하시오: ')) print(math.factorial(a))
Python
복사
 정답
# 정수 n이 주어질 때 i! <= n 을 만족하는 가장 큰 정수 i를 리턴하는 함수 만들기 # 제한 사항 : 0 < n ≤ 3,628,800(= 10!) from math import factorial def solution(n): k = 10 while n < factorial(k): k -= 1 return k
Python
복사

A로 B 만들기

def solution(before, after): before = list(before) after = list(after) answer = 0 for b in before: if before.count(b) == after.count(b): answer += 1 return 1 if answer == len(before) else 0
Python
복사
 훨씬 좋은 풀이
before 와 after는 어차피 알파벳으로 이루어져 있기때문에 각자 정렬을 한 뒤 비교했을 때 같다면 1, 다르면 0을 출력하면 간단하게 코드를 짤 수 있다.
def solution(before, after): before = sorted(before) after = sorted(after) if before == after: return 1 else: return 0
Python
복사

2차원으로 만들기

numpy 사용하기
np.array().reshape 사용하기
import numpy as np def solution(num_list,n): return (np.array(num_list).reshape((len(num_list)//n, n))).tolist()
Python
복사

k의 개수

def solution(i, j, k): answer = 0 for i in range(i,j+1): for j in str(i): if j in str(k): answer += 1 return answer
Python
복사
 다른 풀이
def solution(i,j,k): answer = 0 for x in range(i,j+1): answer += sum([1 for x in list(str(x)) if x == str(k)]) return answer
Python
복사

가까운 수

이진탐색 알고리즘을 이용한다.
def solution(array, n): return array[sorted([[index,abs(n-num),num] for index, num in enumerate(array)], key=lambda x: (x[1],x[-1]))[0][0]]
Python
복사
def solution(array,n): array.sort(key = lambda x: (abs(n-x), x-n)) answer = array[0] return answer
Python
복사

진료순서 정하기

enumerate 사용하기
def solution(emergency): dict = {num: index for index, num in enumerate(sorted(emergency,reverse=True),start=1)} return [dict[x] for x in emergency]
Python
복사

한 번만 등장한 문자

def solution(s): answer = '' for i in s: if s.count(i) == 1: answer += i elif s.count(i) >= 2: pass return ''.join(sorted(answer))
Python
복사

7의 개수

리스트의 값들을 문자형태로 바꾼 뒤 문자열로 만들기
def solution(array): answer = '' for i in array: answer += str(i) return answer.count('7')
Python
복사

이진수 더하기

2진수 → 10진수로 변경해주기 : int(숫자, 2)
10진수 → 2진수로 변경해주기 : bin()
def solution(bin1, bin2): a = int(bin1,2) b = int(bin2,2) answer = bin(a+b) return answer[2:] # Ob 없애주기 위해
Python
복사

숨어있는 숫자의 덧셈(2)

import re def solution(my_string): result = 0 answer = re.findall(r'[0-9]+', my_string) for i in answer: result += int(i) return result
Python
복사

공 던지기 —> 풀지 못함!!!

def solution(numbers,k): players = numbers[0::2] if len(numbers) % 2 == 0 else numbers[0::2] + numbers[1::2] return players[(k % len(players)) - 1]
Python
복사
def solution(numbers,k): index = 0 while k > 1: index += 2 index %= len(numbers) k -= 1 return numbers[index]
Python
복사

분수의 덧셈

최대공약수 구하는 코드 암기하기
# 최적화된 gcd(최대공약수)를 활용한 solution def gcd(a,b): if a % b == 0: return b return gcd(b, a % b) # 재귀함수 활용 def solution(denum1, num1, denum2, num2): boonmo = num1 * num2 boonja = denum1 * num2 + denum2 * num1 # 최대공약수 게산 gcd_value = gcd(boonmo, boonja) # gcd로 나눈 값을 answer에 저장 answer = [boonja / gcd_value, boonmo / gcd_value] return answer
Python
복사
def solution(denum1, num1, denum2, num2): # 두 분수의 합 계산 boonmo = num1 * num2 boonja = num1 * denum2 + num2 * denum1 # 최대공약수로 약분하기 위해 최대공약수 계산하기 start = max(boonmo, boonja) gcd_value = 1 for num in range(start,0,-1): # 하나씩 줄여나가면서 최대공약수 찾아나가기 if boonmo % num == 0 and boonja % num == 0: gcd_value = num break # 분모와 분자를 최대공약수로 약분한 값을 저장하기 answer = [boonja / gcd_value , boonmo / gcd_value] return answer
Python
복사
# math library 를 활용한 solution import math def solution(denum1, num1, denum2, num2): boonmo = num1 * num2 boonja = denum1 * num2 + denum2 * num1 gcd_value = math.gcd(boonmo, boonja) answer = [boonja / gcd_value, boonmo / gcd_value] return answer
Python
복사

최빈값 구하기

list 사용(최빈값 1개 vs 여러개)

숫자로 이루어진 list에서 가장 많이 등장한 최빈값을 출력하세요
1) 리스트(input)의 최댓값만큼 [0]으로만 이루어진 새로운 list(new_list) 를 만든다.
2) input의 각 값을 new_list의 위치라고 생각한다.
ex) input의 첫번째 숫자를 4라고 했을 때, new_list의 4번째(실제 index=3) 값에 +1를 해준다.
즉, input의 값이 나올때마다 new_list의 input 값과 같은 위치에 값을 +1씩 증가시켜나간다.
→ 따라서 new_list의 10번째 값(index=9)이 5라고 한다면 input에서 10이라는 숫자가 5번 나온 것이다.

경우1) 최빈값이 1개인 경우

input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11] # 사실은 최빈값이 두개 max_input = max(input) new_list = [0] * max_input for i in input: new_list[i-1] += 1 print('new_list의 index를 1부터라고 했을 때, 최빈값은 %d이며, 총 %d번 나왔다' %(new_list.index(max(new_list))+1, max(new_list))) # new_list의 index를 1부터라고 했을 때, 최빈값은 6이며, 총 6번 나왔다
Python
복사

경우2) 최빈값이 여러개인 경우

input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11] max_input = max(input) new_list = [0] * max_input for i in input: new_list[i-1] += 1 num = 0 # 최빈값의 개수 초기화 my_most = 0 # 최빈값을 알기 위한 변수 -> new_list의 위치 + 1 for k in new_list: my_most += 1 if k == max(new_list) num += 1 # 최빈값일 경우만 증가시킨다 print('input 리스트에서, 여러 최빈값중 %d번째 최빈값은 %d이며, 총 %d번 나왔다.' %(num,my_most,max(new_list))) print('이 input리스트에서 최빈값의 개수는 %d개 이다' %num)
Python
복사

잘라서 배열로 저장하기

def solution(my_str, n, num = 0): answer = [] q = len(my_str) // n r = len(my_str) % n for i in range(q): answer.append(my_str[num:n*(i+1)]) num += n if r != 0: answer.append(my_str[-r:]) return answer
Python
복사
 훨씬 간단한 코드
range(0,len(my_str),n) 을 활용
def solution(my_str,n): return [my_str[i:i+n] for i in range(0,len(my_str),n)]
Python
복사

소인수분해

 소인수 분해 구현 코드
결국 소인수분해는 2로 나눠지는지, 나눠지지 않는다면 값을 하나씩 더한 뒤 나누는 방식으로 코드를 짜주면 된다.
def factorization(x): d = 2 answer = [] while d <= x: # 반복루프 조건 if x % d == 0: # 2로 나누어떨어지는지 검사 if d not in answer: answer.append(d) x = x / d else: d += 1 # 나누어 떨어지지 않으면 값을 하나씩 더해가면서 반복
Python
복사
# solution def solution(n, d = 2): answer = [] while d <= n: if n % d == 0: n = n / d if d not in answer: answer.append(d) else: d += 1 return answer
Python
복사

영어가 싫어요

enumerate : 리스트에서도 for에서 인덱스와 값을 모두 사용할 수 있음
replace
def solution(numbers): nums = ['zero','one','two','three','four','five','six','seven','eight','nine'] for index,num in enumerate(nums): numbers = numbers.replace(num,str(index)) return int(numbers)
Python
복사

문자열 계산하기

eval() : 자체 내장 함수
→ 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환해준다.
result = eval("(3 + 5) * 7") print(result)
Python
복사
# solution def solution(my_string): return eval(my_string)
Python
복사

구슬을 나누는 경우의 수

def solution(balls, share): answer = 0 boonmo = 1 boonja = 1 for i in range(balls - share): boonmo = boonmo * (balls - i) for i in range(1,balls - share + 1): boonja = boonja * i return boonmo / boonja
Python
복사
math 라이브러리의 comb() 함수
import math def solution(balls, share): return math.comb(balls,share)
Python
복사
factorial 함수 만들어주고 활용하기
nCr = n! / r!(n-r)!
def factorial(n): result = 1 for i in range(1,n+1): result *= i return result def solution(balls, share): answer = factorial(balls) / (factorial(share)*factorial(balls - share)) return answer
Python
복사

종이 자르기

def solution(M, N): answer = (M-1) + M * (N-1) return answer
Python
복사

외계어 사전 → 꼭 복습하기!!

def solution(spell, dic): spell = {i: 0 for i in spell} for x in dic: if len(x) == len(spell): for y in x: if y in spell: spell[y] += 1 else: break if len(set(spell.values())) == 1 and sum(set(spell.values())) == 1: return 1 spell = {i: 0 for i in spell} return 2
Python
복사

컨트롤 제트

stack 자료구조 이해하기
나중에 들어간 것이 먼저 나오는 자료구조( LIFO : LAST IN FIRST OUT)
입력값을 숫자와 문자로 구분하기
split() : 문자열을 특정 문자를 기준으로 나눠 리스트로 반환
숫자와 숫자가 아닌 것으로 구분
try~ except ~ : 예외처리를 하기 위해 사용하는 문법, try를 수행한 뒤 에러가 안난다면 except를 수행하지 않고 건너뜀. 에러가 발생할 경우 except를 수행하게 됨
데이터가 숫자라면 stack에 append함수를 사용해서 쌓아주고, ‘Z’가 들어오면 pop함수를 이용해서 마지막 것부터 꺼낸다.
input_data = "1 2 Z 3" print('input:', input_data.split()) print() for data in input_data.split(): print(data) ----------------------------------------- input : ['1','2','Z','3'] 1 2 Z 3
Python
복사
input_data = "1 -2 Z 3" for data in input_data.split(): # 이때 음수값도 숫자로 구분해야되기 때문에 try: num = int(data) print('num:', num) except: print('str:', data)
Python
복사
input_data = "1 -2 Z 3" stack = [] for data in input_data.split(): try: num = int(data) stack.append(num) except: if stack: # stack에 데이터가 있으면 실행, 없으면 실행 x pop_data = stack.pop() print('stack:', stack)
Python
복사
# solution # result 변수를 만들어서 결과들을 더해주고 빼준다 # -> 숫자가 나온다면 하나씩 result에 더해주고 stack에 쌓는다. # -> 'Z'가 나온다면 stack에서 하나를 pop한 후, result에서 빼준다.input_data = "1 -2 Z 3" def solution(s): stack = [] for num in s.split(): try: stack.append(int(num)) except: if stack: # stack에 값이 있으면 수행 stack.pop() # stack의 마지막 값을 뽑아서 삭제 return sum(stack)
Python
복사

삼각형의 완성조건(2)

def solution(sides): # 주어진 두 변의 길이 중 최대 길이가 있을 경우 # max(sides) < min(sides) + unknown # 주어진 두 변 중 최대 길이가 없는 경우 # unknown < sum(sides) return sum(sides) - (max(sides) - min(sides)) - 1
Python
복사
 위의 식을 정리하면 ( 주어진 변수의 최솟값 * 2 -1 ) 이 나머지 변수가 될 수 있는 값의 개수다.
def solution(sides): return 2 * min(sides) - 1
SQL
복사

캐릭터의 좌표

def solution(keyinput, board): answer = [0,0] for key in keyinput: if key == 'left' and abs(answer[0] - 1) < (board[0] / 2): answer[0] -= 1 elif key == 'right' and abs(answer[0] + 1) < (board[0] / 2): answer[0] += 1 elif key == 'up' and abs(answer[1] + 1) < (board[1] / 2): answer[1] += 1 elif key == 'down' and abs(answer[1] - 1) < (board[1] / 2): answer[1] -= 1 continue return answer
Python
복사
 다른 풀이
def solution(keyinput,board): # [가로,세로] dirs = {"left":(-1,0), "right":(1,0), "up":(0,1), "down":(0,-1)} H, V = (board[0] + 1) // 2, (board[1] + 1) // 2 # 한계값 지정 H_cur, V_cur = 0, 0 # 초기값(시작점) for d in keyinput: H_mov, V_mov = dirs[d] H_new, V_new = H_cur + H_mov, V_cur + V_mov if abs(H_new) < H and abs(V_new) < V: H_cur, V_cur = H_new, V_new return [H_cur,V_cur]
Python
복사

로그인 성공?

def solution(id_pw, db): # id_pw 의 원소들이 모두 일치하면 "login" 리턴 # 아이디가 일치하지 않으면 "fail" 리턴 # 비밀번호가 일치하지 않으면 "wrong pw" 리턴 my_id, my_pw = id_pw for db_id, db_pw in db: if my_id == db_id: # 아이디가 같은 경우에 if my_pw == db_pw: # 패스워드도 같으면 return 'login' else: # 패스워드는 다르면 return 'wrong pw' return 'fail' # 아이디가 같지 않으면
Python
복사

직사각형 넓이 구하기

def solution(dots): x = [dot[0] for dot in dots] # x위치 값들 y = [dot[1] for dot in dots] # y위치 값들 len_x = max(x) - min(x) len_y = max(y) - min(y) return len_x * len_y
Python
복사

문자열 밀기 —> 꼭 다시 풀기!!(너무 어려움…ㅠㅠ)

최대 반복 루프는 다시 자기자신으로 돌아오기 위한 값이므로 문자의 길이라고 생각하면 된다.
def solution(A, B): for idx in range(len(A)): # hello -> 0,1,2,3,4 if A == B: return idx A = A[-1] + A[:-1] return -1
Python
복사

치킨 쿠폰

def solution(chicken): answer = 0 while chicken >= 10: div = chicken // 10 mod = chicken % 10 answer += div chicken = div + mod # 남은 쿠폰의 수(=시켜 먹은 치킨의 수) return answer
Python
복사

유한소수 판별하기

: 기약분수 중 소수로 나타냈을 때 분모가 2나 5의 인자만 가지고 있어야 함
유클리드 호제법(최대공약수)
소인수 분해
from math import gcd # 최대공약수 구하는 기본 함수 def solution(a,b): b //= gcd(a,b) # 분모, 분자의 최대공약수로 분모를 나누기 while b % 2 == 0: # 분모를 2로 소인수 분해하기 b //= 2 while b % 5 == 0: # 분모를 5로 소인수 분해하기 b //= 5 return 1 if b==1 else 2 # 2와 5로 소인수 분해해서 1만 남게되면 유한소수, 아니면 무한소수
Python
복사
하지만 math 라이브러리를 쓰지 말라고 하면 어떡할까요?
이때 필요한 개념이 유클리드 호제법입니다.
from 인공지능 공작소
유클리드 호제법은 2가지만 기억하면 된다.
1.
다음 단계에서 분모는 분자가 된다.
2.
다음 단계에서 나머지는 분모가 된다.
이를 코드로 구현해보면
def gcd(a,b): if a % b == 0: return b else: return gcd(b, a%b) # 재귀함수 이용
Python
복사
자 이제는 소인수 분해는 어떻게 구현되는지 살펴봅시다.
from 은공지능 공작소
이제 위의 구성을 코드로 구현해보면
def factorization(x): d = 2 # 나누는 시작점을 2부터 시작한다 output = [] while d <= x: # 2부터 시작해서 input인 x까지 반복한다. if x % d == 0: output.append(d) x /= d else: d += 1 return output
Python
복사
그럼 이제 문제를 유클리드 호제법 + 소인수 분해를 이용해서 풀어보겠습니다.
def gcd(a,b): # 최대공약수 함수 if a % b == 0: return b else: return gcd(b,a%b) def factorization(x): # 소인수분해 함수 d = 2 output = [] while d <= x: if x % d == 0: output.append(d) x /= d else: d += 1 return output def solution(a,b): divide_num = gcd(a,b) # 최대공약수 result = b // divide_num for num in factorization(result): if num not in [2,5]: return 2 return 1
Python
복사

특이한 정렬

sorted() 함수 내부에 key 라는 인자를 사용해서 정렬 기준을 내맘대로 설정할 수 있다
def solution(numlist, n): return sorted(numlist, key = lambda x : (abs(n-x), -x)) # 첫번째 기준: 절댓값이 작은 값, 두번째 기준: 그 중에 큰 값
Python
복사

등수 매기기

def solution(score): # 2차원의 배열 answer = [] average = [sum(num) / len(num) for num in score] sort_avg = sorted(average,reverse=True) # 내림차순 정렬 # print(average) for i in average: answer.append(sort_avg.index(i)+1) return answer
Python
복사

저주의 숫자 3

def solution(n): answer = 0 for i in range(n): # 단순 반복 횟수 answer += 1 while answer % 3 == 0 or '3' in str(answer): answer += 1 return answer
Python
복사

다항식 더하기

def solution(polynomial): polynomial = polynomial.split(" + ") x, num = 0, 0 for i in polynomial: if i.isnumeric(): num += int(i) else: if len(i) == 1: x += 1 else: x += int(i[:-1]) # print(x,num) if x == 0 and num == 0: return "0" if x == 0: return str(num) if x == 1: x = "" if num == 0: return str(x) + "x" return str(x) + "x + " + str(num)
Python
복사

최빈값 구하기

def solution(array,num = 0): answer = [] freq = {x: array.count(x) for x in set(array)} if len(freq) == 1 and len(freq) == len(array): return array[0] for x in freq.keys(): if freq[x] == max(freq.values()): answer.append(x) if len(answer) >= 2: return -1 else: return answer[0]
Python
복사

ox 퀴즈

계산 수식처럼 생긴 문자열을 계산해주는 함수 : eval()def solution(quiz):
def solution(quiz): answer = [] for equation in quiz: equ, ans = equation.split("=") equ_result = eval(equ) if equ_result == int(ans): answer.append("O") else: answer.append('X') return answer
Python
복사

다음에 올 숫자

def solution(common): # 등차인지 먼저 판별 : 최소 common의 길이는 3이상이니까 if common[1] - common[0] == common[2] - common[1]: return common[-1] + (common[1] - common[0]) else: return common[-1] * (common[1] / common[0])
Python
복사

연속된 수의 합

def solution(num, total): x, cnt = num, 0 for i in range(num): cnt += i a = (total - cnt) / x answer = [] for i in range(num): answer.append(a) a += 1 return answer
Python
복사

안전지대 → 다시!

안전 지역에서 위험 지역을 빼는 알고리즘은 효율적이지 않다.
차라리 하나하나씩 확인하면서 안전지역인지 확인하는 알고리즘이 낫다.
def solution(board): safe = 0 N = len(board) for r_idx in range(N): for c_idx in range(N): dirs = ((-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)) if board[r_idx][c_idx] == 0: is_safe = True # 8방향에 1이 있는지 체크 for r_mov, c_mov in dirs: r_new, c_new = r_idx + r_mov, c_idx + c_mov if r_new in range(N) and c_new in range(N): if board[r_new][c_new] == 1: # 안전지대가 아닌 지역 is_safe = False if is_safe: safe += 1 return safe
Python
복사

겹치는 선분의 길이

SQL
복사