내일배움캠프 TIL (221129): 프로그래머스 입문기

Jiumn·2022년 11월 29일
0
post-thumbnail

오늘 한 일

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%가 나온 분도 있고... 사실 뭐가 정확히 문제인지는 모르겠다. ㅠㅠ 그냥 예외 상황을 최대한 고려해서 새어나가지 않고 코드를 짜줘야 되나보다.

To-do list

  • (빠듯한 내일 일정) DB 구축, Mysql 특강 듣기
  • 알고리즘 타임어택 정답 해설 듣기
  • 유데미 웹 디벨로퍼 부트캠프 DOM, DOM 이벤트 파트 듣기
  • 프로그래머스 하루에 5문제씩 풀기
profile
Back-End Wep Developer. 꾸준함이 능력이다.

0개의 댓글