[Zero-Base DS] Python programming Test

HAHAHAEUN·2024년 4월 3일
post-thumbnail

📝 대망의 첫 Programming Test

첫 수강을 들을 때 부터, 프로그래밍 테스트에 과연 어떤 문제가 출제될까, 과연 나는 잘 할 수 있을까 하는 생각을 줄곧 하곤 했다.

첫 테스트이다보니 잘 하고싶은 마음이 컸기에 거의 하루종일 문제를 풀었던 것 같다. 다시 프로그램을 돌려보며 혹시나 오류가 뜨지는 않는지, 다른 값들을 넣어도 잘 작동이 되는지 등을 확인하며 거의 하루를 다 사용했던 것 같다.

오늘은 당시 프로그래밍 테스트를 회고하며, 문제를 푼 과정들을 공유하고자 한다.

Q1

tmp = []  
print(tmp)

이 문제는 아마 점수를 얻어가라고 주신 문제인 것 같다. 해당 문제를 보고 '뭐야 엄청 쉽네'라는 잘못된 생각을 잠시 했었다..
쉬운 문제이므로 풀이 과정은 생략하도록 하겠다.

Q2

def data_type(s):
    

    if type(s) == int:
        return 'int'
    elif type(s) == str:
        return 'string'
    elif type(s) == float:
        return 'float'
    elif type(s) == list:
        result = 'list,<'
        for idx, value in enumerate(s):
            if value is not None:
                if type(value) == list:
                    result += data_type(value)
                else:
                    result += f'{data_type(value)}'
                if idx < len(s) -1:
                    result += ', '

        result += '>'

        return result
    elif type(s) == tuple:
        result = 'tuple,<'
        for idx, value in enumerate(s):
            if value is not None:
                if type(value) == tuple:
                    result += data_type(value)
                else:
                    result += f'{data_type(value)}'
                if idx < len(s) -1:
                    result += ', '

        result += '>'

        return result

    elif type(s) == dict:
        result = 'dictionary,<'
        for key, value in enumerate(s):
            if value is not None:
                if type(value) == dict:
                    result += data_type(value)
                else:
                    result += f'{data_type(value)}'
                if key < len(s) -1:
                    result += ', '

        result += '>'

        return result
        
print("2번 답안")

print(data_type(1))
print(data_type(5.))
print(data_type([2, 3, [2, 3], 'hello']))

출력 결과 :

  • 일단 코드가 너무 길다...
  • 코드는 간결해야한다는 말을 어디서 주워들은 것 같은데 너무 길다고 느껴져서 다들 나처럼 노가다 느낌으로 코드를 짜셨을까..?라는 생각이 계속 들었다.
  • 결론적으로는 출력값은 맞게 나왔기 때문에 코드 자체에는 문제는 없는 것 같지만 더 좋은 코드가 있을 것 같다
  • 처음에는 list, <int, int, list, <int, int,>, string,> 이렇게 출력이 되어서 어떻게하면 저 불필요한 ' , ' 2개를 뺄 수 있을까 정말 많이 고민했던것 같다.
  • replace도 사용해보고, 슬라이싱으로 [:-1]도 해보고 여러가지를 해봤지만, 내가 원하는 답이 안나왔다. 다른 문제들보다 이 문제 때문에 정말 시간을 많이 쏟았던 것 같다.
  • 그리고 결론적으로 len을 사용하여 풀 수 있는 방법을 찾아내게 되었다..드디어..2번째 문제 완료..

    if idx < len(s) -1:
    result += ', '

Q3

  • 함수의 결과는 return이 아니라 print가 되어야한다.그치만 답은 print()값의 결과만 나오게끔 작성을 해야한다라고 안내를 해주셔서 처음에는 너무 당황스러웠다.
  • 함수의 결과가 print로 되었는데 다시 print()를 사용하면 반환값이 None이 될텐데 이게 맞나 싶었다.
  • 아래 문제들도 비슷하게 헷갈리는 안내사항들의 연속이여서 결국 학습 담당 교수님에게 None값으로 출력이 되는 것이 맞냐고 물어보았다..(거의 모든 학생들이 비슷하게 혼돈을 겪고, 같은 질문을 계속 했던 것 같다..)
def calc_tips(bill, tp=0.1):

    totalTip = bill * tp
    if totalTip - int(totalTip) > 0:
        totalTip = int(totalTip) + 1
    else:
        totalTip = bill * tp
    result = totalTip
    print(f'{result}')



print("3번 답안")
print(calc_tips(50, 0.15))

출력 결과 :

  • 질문이 헷갈리는 것을 제외하면 문제 자체는 2번대비 더 쉬웠던 것 같다.
  • 디폴트값만 어떻게 넣는지 알면 간단하게 수식으로 풀 수 있는 문제였다.

Q4

def search_target(sentence, target):

    indexes = []
    for i in range(len(sentence)):
        if sentence[i:i+(len(target))] == target:
            indexes.append(i)
    return f'{len(indexes)}, {indexes}'

print("4번 답안")

sentence = "Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex."
target = "than"

print(search_target(sentence, target))

출력 결과 :

  • 이 문제도 꽤나 시간을 들였던 것 같다. 처음에는 빈칸으로 나눠 따로 리스트에 저장 후 해당 문자열을 찾는 방식으로 진행했는데, 그렇게 하다보니 문자열의 위치를 제대로 찾을 수가 없었다. 그렇다고 문자열을 아예 하나씩 끊자니 문자열을 찾을수가 없었다..
  • 처음부터 '문자들을 나눠야겠다'는 생각에 사로잡혀 다른 방법을 생각하지 않았기에 오히려 문제를 푸는 방법을 더 생각하지 못했던 것 같다. 이래서 생각은 유연해야하나보다..
  • 결론적으로는 문자를 처음부터 나누지 않고 target의 길이만큼 비교하며 찾아주면 좀 더 쉽게 풀릴 수 있는 문제였다

Q5

import copy

def div_ab(a, b):
    cnt_b = 0
    new_a = copy.copy(a)
    if type(a) == int and type(b) == int:
        if a >= b:
            while new_a > b:
                new_a -= b
                cnt_b += 1
            print(f'{a}나누기 {b}의 결과 : 몫{cnt_b}, 나머지{new_a}')
        else:
            print(f'{a}나누기 {b}의 결과 : 몫{0}, 나머지{new_a}')
    else:
        print('정수를 입력해주세요')


print("5번 답안")
a = 3
b = 2
print(div_ab(a, b))
print('='*50)

출력 결과 :

  • 처음에는 copy를 해주지 않고 a값에서 바로 b를 빼주는 식을 작성했다. 그러다보니 최종적으로 print될때 a값이 변동된 값으로 들어가게 되었고, 해당 문제를 방지하기 위해 copy값을 하나 생성해주었다.
  • 처음에는 나누기를 하지말고 나눗셈을 하라니..하는 생각에 조금 당황스러웠지만, 역시 이것 또한 나누기는 나눗셈으로 한다는 고정관념에서 벗어나면 쉽게 풀 수 있는 문제였다.

Q6

def hanoi_sol(n, startPoint, endPoint):

    points = ['A', 'B', 'C']
    for p in points:
        if p not in [startPoint, endPoint]:
            viaPoint = p

    if n == 1:  # 원판 1개, 바로 원하는 위치로 이동하면 됨
         print(f'{startPoint} -> {endPoint}')

    else:
        # (n-1)개들을 경유 기둥으로 이동
        hanoi_sol(n - 1, startPoint, viaPoint)

        # n를 목표 기둥으로 이동
        print(f'{startPoint} -> {endPoint}')

        # (discCnt-1)개들을 도착 기둥으로 이동
        hanoi_sol(n-1, viaPoint, endPoint)
        # 이전 step에서 viaBar로 옮겨 놨기 때문에 from viaBar


print("6번 답안")
print(hanoi_sol(3, 'A', 'B'))
  • 마지막 문항은 강의시간에 열심히 듣지 않았다면 절대 풀지 못했을 문제였을 것 같다
  • 다시말해, 강의 시간에 다뤘던 문제였기에 어렵지 않게 풀 수 있었다.
  • 강의와 달라진 점은 입력값을 시작기둥, 도착기둥, 경유기둥 이렇게 세개가 아닌, 시작기둥과 도착기둥만 받는 다는 점 하나와, 장소를 알파벳으로 출력해야한다는 것 두가지였다.
  • 경유지점을 어떻게 표현해야하나 고민이 있었는데, points들을 지정해준 뒤, 시작지점과 목표지점이 아닌 곳을 경유지점으로 설정해주는 방식으로 진행하였다.

📘 프로그래밍 테스트 소감

  • 사실 프로그래밍 테스트에 시간제한이 있었다면 아마 시간내에 다 못풀었을 것 같다. 그만큼 생각을 해야하는 문제들이 많았고, 스스로 아직 많이 부족하다는 것을 깨달았다.
  • 제로베이스 데이터 취업 후기를 들어보면 기본기가 가장 중요하다는 말씀을 공통적으로 많이 말씀해주신 것 같다. 프로그래밍 테스트는 끝났지만, 틈틈히 기존 강의들을 복습하며 기본기를 더 탄탄히 다져야겠다고 생각했다.
profile
할 거면 제대로 하자

0개의 댓글