오늘의 학습 키워드는 복습이다.
알고리즘을 거의 잊고 살았더니 기억이 거의 나지 않는다.
처음부터 다시 시작하기 위해 비기너를 신청했다.
하지만 비기너뿐만이 아니라 미들러, 챌린저까지 고민하고 풀어 볼 생각이다.
오늘은 첫날이라서 그런지 매우 가벼운 문제를 풀었다.
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
제한 조건- n은 길이 10,000이하인 자연수입니다.
3 | "수박수" |
4 | "수박수박" |
방법은 간단했다. 짝수와 홀수를 구별해서 반복해주기만 하면 된다.
내 답은 이러했다.
def solution(n):
a="수박"
return a*(n//2)+a[:n%2] # 입력받은 n을 2로 나누고 몫을 가져와서 다시 그것을 a문장과 곱한 뒤에 다시 a 문장의 n을 2로 나눈뒤의 나머지까지의 길이만큼 돌려주면 된다.
다음 문제의 난이도는 비슷했다.
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
제한 사항- seoul은 길이 1 이상, 1000 이하인 배열입니다.
- seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
- "Kim"은 반드시 seoul 안에 포함되어 있습니다.
["Jane", "Kim"] | "김서방은 1에 있다" |
def solution(seoul):
answer = ''
for i in range(len(seoul)):
if seoul[i]=='kim':
answer += "김서방은 " +str(i)+ "에 있다."
break
return answer
방법은 간단했다. 입력받은 배열 안에서 kim 이라는 문장을 발견하면 그 문장의 인덱스를 돌려주면 된다.
다음은 챌린저의 문제였다.
마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특별합니다. 마법의 엘리베이터에는 -1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10c (c ≥ 0 인 정수) 형태인 정수들이 적힌 버튼이 있습니다. 마법의 엘리베이터의 버튼을 누르면 현재 층 수에 버튼에 적혀 있는 값을 더한 층으로 이동하게 됩니다. 단, 엘리베이터가 위치해 있는 층과 버튼의 값을 더한 결과가 0보다 작으면 엘리베이터는 움직이지 않습니다. 민수의 세계에서는 0층이 가장 아래층이며 엘리베이터는 현재 민수가 있는 층에 있습니다.
마법의 엘리베이터를 움직이기 위해서 버튼 한 번당 마법의 돌 한 개를 사용하게 됩니다.예를 들어, 16층에 있는 민수가 0층으로 가려면 -1이 적힌 버튼을 6번, -10이 적힌 버튼을 1번 눌러 마법의 돌 7개를 소모하여 0층으로 갈 수 있습니다. 하지만, +1이 적힌 버튼을 4번, -10이 적힌 버튼 2번을 누르면 마법의 돌 6개를 소모하여 0층으로 갈 수 있습니다.
마법의 돌을 아끼기 위해 민수는 항상 최소한의 버튼을 눌러서 이동하려고 합니다. 민수가 어떤 층에서 엘리베이터를 타고 0층으로 내려가는데 필요한 마법의 돌의 최소 개수를 알고 싶습니다. 민수와 마법의 엘리베이터가 있는 층을 나타내는 정수 storey 가 주어졌을 때, 0층으로 가기 위해 필요한 마법의 돌의 최소값을 return 하도록 solution 함수를 완성하세요.
이 문제는 직접 풀지는 못했고, 다른 사람이 풀어 놓은것을 보고 이해를 하였다.
def solution(storey):
answer = 0
while storey > 0:
storey, moves = divmod(storey, 10)
if moves > 5 or (moves == 5 and storey % 10 >= 5):
moves = 10 - moves
storey += 1
answer += moves
return answer
패턴은 간단했다. 나머지가 5인것을 기준으로 정답을 구하면 되었다. 5보다 작으면 1칸씩, 6이상이면 10칸 이동했다가 그만큼 1칸씩 이동하면 최소한의 움직임이 되기 때문이다. 그리고 10으로 나누기 때문에 10에서 moves를 빼줬다면 다시 storey에 1을 더해준다. 그렇게 반복하면 최소한의 움직임으로 이동이 가능하다.
'TIL' 카테고리의 다른 글
99클럽 7번째 (0) | 2024.03.31 |
---|---|
99클럽 TIL 6번째 (1) | 2024.03.30 |
99클럽 다섯번째 TIL (0) | 2024.03.29 |
99 클럽 4일째 TIL (0) | 2024.03.28 |
99 클럽 TIL 세번째 (0) | 2024.03.27 |