
오늘은 파이썬으로 푼 코딩테스트 문제들에 대해 리뷰하겠다.
앞의 문제들은 백준의 문제들이고, 뒤의 문제들은 프로그래머스에서 푼 문제들이다.
문제
영식이는 숫자를 셀 때, 왼손을 이용한다. 엄지손가락부터 시작해서 새끼손가락까지 차례대로 하나씩 센다. 그다음에 새끼손가락까지 센 다음에는 반대로 엄지손가락으로 다시 역방향으로 센다. 영식이는 자기가 원하는 숫자가 나올 때 까지 계속해서 이 방법으로 센다. 영식이는 절대 손가락을 건너뛰지 않는다. 예를 들어 숫자 10을 셀 때는, 엄지 → 검지 → 중지 → 약지 → 새끼 → 약지 → 중지 → 검지 → 엄지 → 검지 이렇게 센다.
영식이가 손가락을 하나 다쳤다. 영식이는 오른손으로는 셀 수 없기 때문에, 왼손으로 세야 한다. 다친 손가락을 이용해서 셀 수 있는 횟수가 제한되어 있다.
영식이가 셀 수 있는 최대 숫자를 출력하는 프로그램을 작성하시오.
나의 코드
import sys
finger = int(sys.stdin.readline())
n = int(sys.stdin.readline())
if(finger == 1 or finger == 5):
print(8 * n + (finger - 1))
elif(finger == 3):
print(4 * n + 2)
elif(finger == 2):
if(n % 2 == 1):
print(4*n+3)
else:
print(4*n+1)
elif(finger == 4):
if (n % 2 == 1):
print(4 * n + 1)
else:
print(4 * n + 3)
문제
fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.
fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다.
fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.
두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.
fibonacci(0)은 0을 출력하고, 0을 리턴한다.
fibonacci(2)는 fibonacci(1)과 fibonacci(0)의 결과를 얻고, 1을 리턴한다.
첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.
fibonacci(3)은 fibonacci(2)와 fibonacci(1)의 결과를 얻고, 2를 리턴한다.
1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.
나의 코드
import sys
n = int(sys.stdin.readline())
num = []
f_dict = {
0: [1, 0],
1: [0, 1]
}
new_key = 2
new_value = [0, 0]
for _ in range(39):
li1 = f_dict[new_key-2]
li2 = f_dict[new_key-1]
new_value[0] = li1[0] + li2[0]
new_value[1] = li1[1] + li2[1]
f_dict[new_key] = list(new_value) #왜인지 여기 list를 붙여 줘야 잘 돌아감
new_key += 1
for _ in range(n):
k = int(sys.stdin.readline())
print(*f_dict[k])
문제
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
나의 코드
def solution(skill, skill_trees):
tree_len = len(skill_trees)
answer = 0
for i in range(tree_len):
skill_list = list(skill)
for k in skill_trees[i]:
if k in skill:
if (k == skill_list[0]):
skill_list.pop(0)
else:
answer -= 1
break
else:
continue
answer += 1
return answer
문제
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.
나의 코드
def solution(priorities, location):
answer = 0
place = priorities.index(max(priorities))
while (True):
value = max(priorities)
if (priorities[place] == value):
priorities[place] = 0
answer += 1
if (place == location):
break
place += 1
if (place >= len(priorities)):
place = 0
return answer