3시에 알고리즘 타임어택 시간이 잡혀 있었다.
그동안 밀린 부랴부랴 스파르타 알고리즘 강의를 들었는데...
재귀함수와 정렬(버블정렬, 선택정렬, 삽입정렬, 병합정렬) 파트 해설을 봐도 이해가 안 가고... 나동빈님 유튜브 채널 보고 조금 힌트를 얻었지만 역시나 완전히 와닿지는 않는다. ㅠㅠ
어찌저찌 3시까지 스택과 큐, 트리 부분을 교양 느낌으로 개념만 보고 있다가 알고리즘 타임어택 시간이 시작됐다. 그런데 이게 웬 걸, 스파르타 알고리즘 강의를 복습하는 문제들이 아니라 프로그래머스 입문 문제들이 주어졌다. 아예 못 푼 문제도 있는데 오늘부터라도 프로그래머스 문제 5문제씩은 건드려보려고 노력해야겠다.
Q. 주어진 리스트에 특정한 값이 있는지 찾아 그 위치를 돌려주는 알고리즘을 만들어 보세요. 리스트에 찾는 값이 없다면 -1을 돌려줍니다.
array = [17, 92, 18, 33, 58, 6, 33, 42]
[나의 코드]
def is_num(a):
result = []
for i in range(len(a)):
if a[i] == 18:
result += a.index(18)
if a[i] == 33:
result += a.index(33)
if a[i] == 900:
result += a.index(900)
return result
print(is_num(a))
역시나 엉망진창인 나의 코드. 오류가 있어서 구동이 안 된다. (나중에 발전했을 때 내가 이렇게 애송이였다는 걸 기억하기 위해 써본다 ^_ㅠ)
우선 특정 값의 인덱스를 반환할 때 배열일 필요는 없다.
그래도 반복문 범위를 배열의 길이로 잡는 것과 인덱스 찾는 방법 접근하려고 했던 건 좋았다. (?)
[답안 코드]
def is_num(a, x):
n = len(a)
for i in range(n):
if x == a[i]:
return i
return -1
print(is_num(a, 33))
우선 매개변수는 2개가 필요하다.
a: 기준이 되는 배열
x: 뽑고 싶은 값
배열의 길이만큼 반복문을 돌릴 후, 뽑고 싶은 값이 기준이 되는 배열에 있으면(x == a[i])
i (인덱스 값)를 반환한다.
만약 배열에 없다면 -1을 반환한다.
Q. 학생 번호와 이름이 리스트로 주어졌을 때 학생 번호를 입력하면 학생 번호에 해당하는 이름을 순차 탐색으로 돌려주는 함수를 작성해보자. 해당하는 학생 번호가 없으면 물음표(?)를 돌려준다.
stu_no = [39, 14, 67, 105]
stu_name = ["Justin", "John", "Mike", "Summer"]
이와 같은 경우 Justin의 학생 번호는 39번이다.
def is_stu_name(x):
n = len(stu_no)
stu_no[i] = stu_name[i]
for i in range(n):
if stu_name[i] == x:
return stu_no[i]
return '?'
print(is_stu_name('Justin'))
UnboundLocalError: local variable 'i' referenced before assignment
지역 변수가 이전에 이미 할당되었다며 발생하는 에러다.
stu_no[i]에서 i가 먼저 등장했기 때문인 것 같아 for문 다음으로 변경했다.
[나의 코드]
def is_stu_name(x):
n = len(stu_no)
for i in range(n):
stu_no[i] = stu_name[i]
if stu_name[i] == x:
return stu_no[i]
return '?'
print(is_stu_name('Justin'))
이렇게 했더니 오류는 안 나는데 print 값으로 Justin이 출력된다. ^_ㅠ
인덱스 값이 반환되어야 하는데...
[답안 코드]
def get_name(s_no, s_name, find_no):
n = len(s_no)
for i in range(n):
if find_no == s_no[i]:
return s_name[i]
return "?"
매개변수는 3개가 필요하다.
s_no: 학생번호 리스트
s_name: 학생이름 리스트
find_no: 찾을 학생 번호
간단하게 생각하면, 반복문을 돌다가 찾고 싶은 번호(find_no)가 학생 번호(s_no[i])랑 같으면 해당 인덱스의 학생 이름(s_name[i])을 반환하면 된다.
매개변수부터 제대로 설정하자.
출력값을 얻기 위해 어떤 변수를 넣어야할지 고민하기!
import math
def solution(price):
if 10 <= price < 100000:
answer = price
if 100000 <= price < 300000:
answer = price * 0.95
elif 300000 <= price < 500000:
answer = price * 0.9
elif 1000000 >= price >= 500000:
answer = price * 0.8
return math.floor(answer)
처음에 풀었을 때 자꾸 두 번째 정확성 검사에서 70%만 나와서 실패했던 문제.
범위를 10 이상 100000 미만, 500000 이상 1000000 미만도 추가로 적용해줬더니 100%가 나왔다. 다른 분들 것도 공유해서 봤는데 놀랍게도 똑같이 쓴 사람이 아무도 없었다!
어떤 분은 범위를 추가하지 않고 math 모듈을 쓰지 않았는데도 100%가 나온 분도 있고... 사실 뭐가 정확히 문제인지는 모르겠다. ㅠㅠ 그냥 예외 상황을 최대한 고려해서 새어나가지 않고 코드를 짜줘야 되나보다.