프로그래머스 코딩테스트 입문 Lv.0 100문제 파이썬 풀이
파이썬 입문자인 저의 풀이와 본받을 코드를 모아서 복습하는 글입니다.
프로그래머스 코딩테스트 입문 Lv.0 100문제
https://school.programmers.co.kr/learn/challenges/beginner?order=recent
입문 문제가 기초 트레이닝 문제보다 오히려 더 쉬운 것 같습니다.
정답률 높은 순으로 풀면 자신감이 붙어서 좋습니다.
한 문제에서 오래 막히는 경우, 질문으로 코드 남겨서 반례 요청 후 다른 문제 풀고 다시 와서 풀면 효율적입니다.
난이도 Lv. 0 100문제 풀이
옹알이 (1)
def solution(babbling):
answer = 0
says = ["aya", "ye", "woo", "ma"]
for cur_str in babbling:
cut_str = cur_str
for say_word in says:
if say_word in cur_str:
cut_str = cut_str.replace(say_word, " ")
if len(cut_str.strip()) == 0 :
answer += 1
return answer
다음에 올 숫자
def solution(common):
answer = 0
diff = {}
common_len = len(common)
common_last_val = common[common_len-1]
for i in range(0, 2):
diff[i] = (common[i], common[i+1] - common[i])
if diff[0][1] == diff[1][1]:
answer = common_last_val + diff[0][1]
else:
answer = common_last_val * (diff[1][0] / diff[0][0])
return answer
연속된 수의 합
def solution(num, total):
answer = []
i = -num
while True:
answer.append(i)
if len(answer) > num:
answer.pop(0)
if sum(answer) == total:
return answer
i = i+1
종이 자르기
def solution(M, N):
return M * N - 1
문자열 밀기
def solution(A, B):
count = 0
for i in range(len(A), 0, -1):
if A[i:] + A[:i] == B:
return count
else:
count += 1
return -1
def solution(A, B):
return (B*2).find(A)
잘라서 배열로 저장하기
def solution(my_str, n):
return [my_str[i:i+n] for i in range(0, len(my_str), n)]
7의 개수
def solution(array):
answer = 0
for v in array:
for char in str(v):
if char == "7":
answer += 1
return answer
def solution(array):
return str(array).count("7")
문자열 정렬하기 (2)
def solution(my_string):
return "".join(sorted(my_string.lower()))
세균 증식
def solution(n, t):
for i in range(t):
n *= 2
return n
def solution(n, t):
return n << t
제곱수 판별하기
import math
def solution(n):
return 1 if math.sqrt(n) == int(math.sqrt(n)) else 2
def solution(n):
return 1 if (n ** 0.5).is_integer() else 2
문자열안에 문자열
def solution(str1, str2):
return 1 if str2 in str1 else 2
OX퀴즈
def solution(quiz):
answer = []
for v in quiz:
quizArr = v.split(" = ")
if eval(quizArr[0]) == int(quizArr[1]):
answer.append("O")
else:
answer.append("X")
return answer
자릿수 더하기
def solution(n):
return sum(int(v) for v in str(n))
def solution(n):
return sum(list(map(int, str(n))))
n의 배수 고르기
def solution(n, numlist):
return [v for v in numlist if v % n == 0]
숫자 찾기
def solution(num, k):
num_list = list(str(num))
for v in num_list:
if int(v) == k:
return num_list.index(v)+1
return -1
배열의 유사도
def solution(s1, s2):
return len([v for v in s1 if v in s2])
def solution(s1, s2):
return len(set(s1) & set(s2))
문자열 계산하기
def solution(my_string):
return eval(my_string)
가장 큰 수 찾기
def solution(array):
max_num = max(array)
return [max_num, array.index(max_num)]
편지
def solution(message):
return len(message) * 2
약수 구하기
def solution(n):
return [v for v in range(1, n+1) if n % v == 0]
한 번만 등장한 문자
def solution(s):
s_dict = dict()
for v in s:
if v in s_dict:
s_dict[v] += 1
else:
s_dict[v] = 1
return "".join(sorted(v for v in s if s_dict[v] == 1))
def solution(s):
return "".join(sorted(v for v in s if s.count(v) == 1))
인덱스 바꾸기
def solution(my_string, num1, num2):
my_list = list(my_string)
my_list[num1] = my_string[num2]
my_list[num2] = my_string[num1]
return "".join(my_list)
def solution(my_string, num1, num2):
my_list = list(my_string)
my_list[num1], my_list[num2] = my_string[num2], my_string[num1]
return "".join(my_list)
영어가 싫어요
def solution(numbers):
num_hash = {"zero": "0", "one": "1", "two": "2",
"three": "3", "four": "4", "five": "5",
"six": "6", "seven": "7", "eight": "8", "nine": "9"}
for v in num_hash.keys():
numbers = numbers.replace(v, num_hash[v])
return int(numbers)
def solution(numbers):
num_list = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
for i, v in enumerate(num_list):
numbers = numbers.replace(v, str(i))
return int(numbers)
대문자와 소문자
def solution(my_string):
return my_string.swapcase()
암호 해독
def solution(cipher, code):
return cipher[code-1::code]
369게임
def solution(order):
num_set = {"3", "6", "9"}
return len([v for v in str(order) if v in num_set])
가까운 수
def solution(array, n):
i = 0
while True:
if n - i in array:
return n - i
elif n + i in array:
return n + i
i += 1
삼각형의 완성조건 (1)
def solution(sides):
max_num = max(sides)
sides.remove(max_num)
return 1 if max_num < (sides[0] + sides[1]) else 2
def solution(sides):
return 1 if max(sides) < (sum(sides) - max(sides)) else 2
중복된 문자 제거
def solution(my_string):
answer = ""
for v in my_string:
if v not in answer:
answer += v
return answer
k의 개수
def solution(i, j, k):
answer = 0
for num in range(i, j+1):
for num_part in str(num):
if int(num_part) == k:
answer += 1
return answer
A로 B 만들기
def solution(before, after):
return 1 if sorted(before) == sorted(after) else 0
이진수 더하기
def solution(bin1, bin2):
answer = ""
maxLen = max(len(bin1), len(bin2))
cur_bin1, cur_bin2, up = 0, 0, 0
for i in range(maxLen):
if len(bin1) > i:
cur_bin1 = int(bin1[-1 + -i])
else:
cur_bin1 = 0
if len(bin2) > i:
cur_bin2 = int(bin2[-1 + -i])
else:
cur_bin2 = 0
line_sum = cur_bin1 + cur_bin2 + up
if line_sum >= 2:
up = 1
line_sum = line_sum -2
else:
up = 0
answer += str(line_sum)
if up == 1:
answer += str(up)
return answer[::-1]
def solution(bin1, bin2):
return bin(int(bin1, 2) + int(bin2, 2))[2:]
치킨 쿠폰
def solution(chicken):
service_sum = 0
while chicken >= 10:
service = chicken // 10
coupon = chicken % 10
chicken = service + coupon
service_sum += service
return service_sum
로그인 성공?
def solution(id_pw, db):
db_hash = dict(db)
user_id, pw = id_pw
if user_id in db_hash.keys():
if db_hash[user_id] == pw:
return "login"
else:
return "wrong pw"
return "fail"
등수 매기기
def solution(score):
answer = [0] * len(score)
score_list = [(v[0] + v[1]) / 2 for v in score]
copy_list = score_list.copy()
rank_hash = dict()
rank = 0
while score_list:
max_score = max(score_list)
rank += 1
if max_score not in rank_hash:
rank_hash[max_score] = rank
score_list.remove(max_score)
for i, v in enumerate(copy_list):
answer[i] = rank_hash[v]
return answer
def solution(score):
sort_list = sorted([sum(v) for v in score], reverse = True)
return [sort_list.index(sum(v))+1 for v in score]
특이한 정렬
def solution(numlist, n):
sortlist = []
for v in numlist:
sortlist.append((abs(v - n), v))
sortlist.sort()
for i in range(len(sortlist)-1):
cur_k, cur_v = sortlist[i]
next_k, next_v = sortlist[i+1]
if cur_k == next_k and cur_v < next_v:
sortlist[i] = (next_k, next_v)
sortlist[i+1] = (cur_k, cur_v)
return [v for k, v in sortlist]
def solution(numlist, n):
numlist.sort(key = lambda x: (abs(n - x), -x))
return numlist
유한소수 판별하기
def solution(a, b):
# 최대공약수 구하기
for i in range(a, 1, -1):
if b % i == 0 and a % i == 0:
# 분모를 최대공약수로 나눈 몫으로 변경
b //= i
break
# 분모에서 2의 배수 모두 제거
while b % 2 == 0:
b //= 2
# 분모에서 5의 배수 모두 제거
while b % 5 == 0:
b //= 5
# 분모가 1이 아니면 분모의 소인수가 2와 5만 존재하지 않는 것
return 1 if b == 1 else 2
분자와 분모의 최대공약수로 약분하면 기약분수를 만들 수 있습니다. 소인수는 약수가 소수인 수를 말합니다.
겹치는 선분의 길이
def solution(lines):
sets = [set(range(min(l), max(l))) for l in lines]
return len(sets[0] & sets[1] | sets[0] & sets[2] | sets[1] & sets[2])
선분의 길이는 시작점부터 끝점인 max(l) 전까지의 구간으로 셀 수 있습니다.
set 자료구조로 중복을 제거할 수 있습니다.
sets 리스트에서 선들의 교집합을 찾고, 교집합들을 합집합을 계산하여 공통된 좌표의 수를 반환합니다.
평행
def solution(dots):
line_1_x_diff = dots[2][0] - dots[0][0]
line_1_y_diff = dots[2][1] - dots[0][1]
line_2_x_diff = dots[3][0] - dots[1][0]
line_2_y_diff = dots[3][1] - dots[1][1]
if (line_2_x_diff / line_1_x_diff) == (line_2_y_diff / line_1_y_diff):
return 1
line_1_x_diff = dots[1][0] - dots[0][0]
line_1_y_diff = dots[1][1] - dots[0][1]
line_2_x_diff = dots[3][0] - dots[2][0]
line_2_y_diff = dots[3][1] - dots[2][1]
if (line_2_x_diff / line_1_x_diff) == (line_2_y_diff / line_1_y_diff):
return 1
return 0
파이썬에서 //는 나누고 소수점 이하를 버린 몫을 반환합니다.
기울기를 비교할 때, /로 나눠서 소수점도 비교해야 테스트 케이스 2를 통과할 수 있습니다.
저주의 숫자 3
def solution(n):
answer = 0
for _ in range(n):
answer += 1
while answer % 3 == 0 or "3" in str(answer):
answer += 1
return answer
외계어 사전
def solution(spell, dic):
for word in dic:
isWord = True
for v in spell:
if v not in word:
isWord = False
if isWord == True:
return 1
return 2
def solution(spell, dic):
for word in dic:
if not set(spell) - set(word):
return 1
return 2
삼각형의 완성조건 (2)
def solution(sides):
a, b = sides
answer = 0
for _ in range(abs(a - b), max(sides)):
answer += 1
for _ in range(max(sides)+1, sum(sides)):
answer += 1
return answer
안전지대
def solution(board):
answer = 0
addArea = [[-1, -1], [-1, 0], [-1, 1],
[0, -1], [0, 0], [0, 1],
[1, -1], [1, 0], [1, 1]]
for i in range(0, len(board)):
for j in range(0, len(board[i])):
safe = True
# 좌표 더하기
for [x, y] in addArea:
added_x = i+x
added_y = j+y
if (added_x < 0 or added_x >= len(board)):
continue
if (added_y < 0 or added_y >= len(board[i])):
continue
if (board[added_x][added_y] == 1):
safe = False
break
if safe == True:
answer += 1
return answer
def solution(board):
n = len(board)
danger = set()
for i, row in enumerate(board):
for j, x in enumerate(row):
if not x:
continue
danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1,0,1])
return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)
숨어있는 숫자의 덧셈 (2)
def solution(my_string):
digit_str = ""
answer = 0
for v in my_string:
if v.isdigit():
digit_str += v
else:
if digit_str != "":
answer += int(digit_str)
digit_str = ""
if digit_str != "":
answer += int(digit_str)
return answer
def solution(my_string):
new_str = "".join(v if v.isdigit() else " " for v in my_string)
return sum(int(v) for v in new_str.split())
다항식 더하기
def solution(polynomial):
polyList = polynomial.strip().split(" + ")
x_count = 0
num = 0
answer = ""
for i, v in enumerate(polyList):
if v[-1] == "x":
if v == "x":
x_count += 1
else:
x_count += int(v.replace("x", ""))
print(v.replace("x", ""))
else:
num += int(v)
if x_count == 1:
answer = "x"
elif x_count > 1:
answer = str(x_count) + "x"
if num > 0:
if answer != "":
answer += " + "
answer += str(num)
return answer
최댓값 만들기 (2)
def solution(numbers):
minus_list = []
plus_list = []
minus_1, minus_2, plus_1, plus_2 = 0, 0, 0, 0
for v in numbers:
if v >= 0:
plus_list.append(v)
else:
minus_list.append(v)
# 테스트 케이스 7번, +- 원소가 1개씩인 경우
if len(minus_list) == 1 and len(plus_list) == 1:
return minus_list[0] * plus_list[0]
if plus_list:
plus_1 = max(plus_list)
plus_list.remove(plus_1)
if plus_list:
plus_2 = max(plus_list)
if minus_list:
minus_1 = min(minus_list)
minus_list.remove(minus_1)
if minus_list:
minus_2 = min(minus_list)
return max(int(minus_1 * minus_2), int(plus_1 * plus_2))
def solution(numbers):
numbers.sort()
return max(numbers[0] * numbers[1], numbers[-1] * numbers[-2])
캐릭터의 좌표
def solution(keyinput, board):
cur_location = [0, 0]
key_hash = {"up":(0, 1), "down":(0, -1), "left":(-1, 0), "right":(1, 0)}
max_x, max_y = int((board[0]-1)/2), int((board[1]-1)/2)
min_x, min_y = -max_x, -max_y
for key in keyinput:
cur_x, cur_y = cur_location
if (key == "right" and cur_x < max_x) or (key == "left" and cur_x > min_x):
cur_location[0] += key_hash[key][0]
if (key == "up" and cur_y < max_y) or (key == "down" and cur_y > min_y):
cur_location[1] += key_hash[key][1]
return cur_location
직사각형 넓이 구하기
def solution(dots):
x = [v[0] for v in dots]
y = [v[1] for v in dots]
return (max(x) - min(x)) * (max(y) - min(y))
배열 원소의 길이
def solution(strlist):
return [len(v) for v in strlist]
컨트롤 제트
def solution(s):
s_list = s.split()
answer = 0
for i in range(len(s_list)):
if s_list[i] == "Z":
answer -= int(s_list[i-1])
else:
answer += int(s_list[i])
return answer
소인수분해
def solution(n):
answer = []
for i in range(2, n+1):
if n % i == 0:
append_yn = True
for j in range(2, i):
if i % j == 0:
append_yn = False
break
if append_yn:
n = n / i
answer.append(i)
return answer
숨어있는 숫자의 덧셈 (1)
def solution(my_string):
return sum([int(v) for v in my_string if ord(v) >= ord("0") and ord(v) <= ord("9")])
def solution(my_string):
return sum(int(v) for v in my_string if v.isdigit())
문자열 정렬하기 (1)
def solution(my_string):
my_list = list(my_string)
my_list.sort()
return [int(v) for v in my_list if ord(v) >= ord("0") and ord(v) <= ord("9")]
def solution(my_string):
return sorted([int(v) for v in my_string if v.isdigit()])
모음 제거
def solution(my_string):
rm_set = ("a", "e", "i", "o", "u")
return "".join([v for v in my_string if v not in rm_set])
팩토리얼
def solution(n):
i = 1
while factorial(i) <= n:
i += 1
return i - 1
def factorial(n):
if n == 1:
return 1
return n * factorial(n-1)
def solution(n):
i = 1
factorial = 1
while factorial <= n:
i += 1
factorial = factorial * i
return i - 1
최댓값 만들기(1)
def solution(numbers):
numbers.sort(reverse=True)
return numbers[0] * numbers[1]
def solution(numbers):
numbers.sort()
return numbers[-1] * numbers[-2]
합성수 찾기
def solution(n):
answer = 0
for i in range(4, n+1):
count = 0
for v in range(1, i+1):
if i % v == 0:
count += 1
if count >= 3:
answer += 1
return answer
주사위의 개수
def solution(box, n):
x, y, z = box
return (x // n) * (y // n) * (z // n)
배열 회전시키기
def solution(numbers, direction):
if direction == "right":
numbers.insert(0, numbers.pop())
else:
numbers.append(numbers.pop(0))
return numbers
def solution(numbers, direction):
if direction == 'right':
return [numbers[-1]] + numbers[:-1]
else:
return numbers[1:] + [numbers[0]]
공 던지기
def solution(numbers, k):
index = (k-1) * 2
num_len = len(numbers)
while index > num_len:
index -= num_len
return numbers[index]
def solution(numbers, k):
return numbers[(k - 1) * 2 % len(numbers)]
2차원으로 만들기
def solution(num_list, n):
answer = []
for i in range(0, len(num_list), n):
sub_list = []
for j in range(n):
sub_list.append(num_list[i + j])
answer.append(sub_list)
return answer
def solution(num_list, n):
answer = []
for i in range(0, len(num_list), n):
answer.append(num_list[i:i+n])
return answer
점의 위치 구하기
def solution(dot):
x, y = dot
if x > 0 and y > 0:
return 1
elif x < 0 and y > 0:
return 2
elif x < 0 and y < 0:
return 3
else:
return 4
구슬을 나누는 경우의 수
def solution(balls, share):
return factorial(balls) / (factorial(balls - share) * factorial(share))
def factorial(n):
if n <= 1:
return 1
return n * factorial(n-1)
import math
def solution(balls, share):
return math.comb(balls, share)
가위 바위 보
def solution(rsp):
win_case = {"2":"0", "0":"5", "5":"2"}
answer = ''
for v in rsp:
answer += win_case[v]
return answer
def solution(rsp):
win_case = {"2":"0", "0":"5", "5":"2"}
return "".join(win_case[v] for v in rsp)
모스부호 (1)
def solution(letter):
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'
}
answer = ''
letter_list = letter.split()
for v in letter_list:
answer += morse[v]
return answer
def solution(letter):
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[v] for v in letter.split())
개미 군단
def solution(hp):
count = 0
while hp > 0:
if hp >= 5:
ant = int(hp / 5)
hp -= (ant * 5)
elif hp >= 3:
ant = int(hp / 3)
hp -= (ant * 3)
elif hp >= 1:
ant = int(hp / 1)
hp -= (ant * 1)
count += ant
return count
def solution(hp):
return hp // 5 + (hp % 5) // 3 + (hp % 5) % 3
순서쌍의 개수
def solution(n):
return len([i for i in range(1, n+1) if n % i == 0])
진료순서 정하기
def solution(emergency):
max_dict = dict()
clone_list = emergency.copy()
for i in range(len(emergency)):
max_v = max(emergency)
max_dict[max_v] = len(max_dict) + 1
emergency.remove(max_v)
for i, v in enumerate(clone_list):
clone_list[i] = max_dict[v]
return clone_list
외계행성의 나이
def solution(age):
return "".join(chr(ord('a') + int(v)) for v in str(age))
배열 자르기
def solution(numbers, num1, num2):
return numbers[num1:num2+1]
짝수의 합
def solution(n):
return sum(i for i in range(n+1) if i % 2 == 0)
def solution(n):
return sum(i for i in range(2, n+1, 2))
양꼬치
def solution(n, k):
return (n * 12000) + ((k - int(n / 10)) * 2000)
def solution(n, k):
return (n * 12000) + ((k - n // 10) * 2000)
각도기
def solution(angle):
if angle == 180:
return 4
elif angle == 90:
return 2
elif angle > 90 :
return 3
else:
return 1
특정 문자 제거하기
def solution(my_string, letter):
return my_string.replace(letter, "")
문자 반복 출력하기
def solution(my_string, n):
return "".join(v * n for v in my_string)
짝수 홀수 개수
def solution(num_list):
answer = [0, 0]
for v in num_list:
if v % 2 == 0:
answer[0] += 1
else:
answer[1] += 1
return answer
직각삼각형 출력하기
n = int(input())
for i in range(1, n+1):
print("*"*i)
문자열 뒤집기
def solution(my_string):
return my_string[::-1]
배열 뒤집기
def solution(num_list):
return list(reversed(num_list))
def solution(num_list):
return num_list[::-1]
나이 출력
def solution(age):
return 2022 - age+1
아이스 아메리카노
def solution(money):
return [money // 5500, money % 5500]
옷가게 할인 받기
def solution(price):
sale_per = 0
if price >= 500000:
sale_per = 20
elif price >= 300000:
sale_per = 10
elif price >= 100000:
sale_per = 5
return price if sale_per == 0 else int(price - (price * sale_per / 100))
배열의 평균값
def solution(numbers):
return sum(numbers) / len(numbers)
피자 나눠 먹기 (3)
def solution(slice, n):
return (n + (slice-1)) // slice
def solution(slice, n):
return (n - 1) // slice + 1
피자 나눠 먹기 (2)
def solution(n):
pizza = 6
while pizza % n != 0:
pizza += 6
return pizza / 6
피자 나눠 먹기 (1)
def solution(n):
return (n + 6) // 7
def solution(n):
return (n - 1) // 7 + 1
짝수는 싫어요
def solution(n):
return [i for i in range(n+1)][1::2]
def solution(n):
return [i for i in range(1, n+1, 2)]
최빈값 구하기
def solution(array):
cnt_set = set()
max_count = 0
for v in array:
cnt_set.add((array.count(v), v))
for k, v in cnt_set:
if k == max(cnt_set)[0]:
max_count += 1
if max_count > 1:
return -1
else:
return max(cnt_set)[1]
중앙값 구하기
def solution(array):
array.sort()
return array[int(len(array) / 2)]
def solution(array):
return sorted(array)[len(array) // 2]
나머지 구하기
def solution(num1, num2):
return num1 % num2
배열 두 배 만들기
def solution(numbers):
return [v * 2 for v in numbers]
분수의 덧셈
def solution(numer1, denom1, numer2, denom2):
answer = []
numer = (numer1 * denom2) + (numer2 * denom1)
denom = denom1 * denom2
gcd = denom
for i in range(gcd, 0, -1):
if numer % i == 0 and denom % i == 0:
gcd = i
break
# 기약분수 : 분자와 분모의 최대공약수로 약분한 몫
answer.append(numer // gcd)
answer.append(denom // gcd)
return answer
import math
def solution(numer1, denom1, numer2, denom2):
answer = []
numer = (numer1 * denom2) + (numer2 * denom1)
denom = denom1 * denom2
gcd = math.gcd(numer, denom)
answer.append(numer // gcd)
answer.append(denom // gcd)
return answer
math 라이브러리를 사용하면, 최대공약수를 간편하게 구할 수 있습니다.
숫자 비교하기
def solution(num1, num2):
return 1 if num1 == num2 else -1
두 수의 나눗셈
def solution(num1, num2):
return int(num1 / num2 * 1000)
몫 구하기
def solution(num1, num2):
return int(num1 / num2)
두 수의 곱
def solution(num1, num2):
return num1 * num2
두 수의 차
def solution(num1, num2):
return num1 - num2
두 수의 합
def solution(num1, num2):
return num1 + num2
머쓱이보다 키 큰 사람
def solution(array, height):
return len([i for i in array if i > height])
중복된 숫자 개수
def solution(array, n):
return len([v for v in array if v == n])
def solution(array, n):
return array.count(n)
Leave a comment