ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [5월 첫째 주 #1]
    Algorithm/코알못 알고리즘 스터디 2022. 5. 2. 01:14

    😨 코알못 알고리즘 스터디

    ✂︎ 목적 

    기초적인 자료구조와 알고리즘의 이해

    ✂︎ 규정

    • 매주 수요일 오후 7시
    • 약속한 게더타운에서 모임
    • 2팀으로 나눠 매주 한 팀당 알고리즘 1문제씩 풀이 및 발표, 한 팀에 3명이므로 돌아가면서 발표
      • 브론즈팀 : 백준 브론즈~실버티어 or 프로그래머스 1~2 level 수준 1문제
      • 실버팀 : 백준 실버~골드티어 or 프로그래머스 2~3 level 수준 1문제

     

    순번 1 2 3
    브론즈팀 김형섭 밀크티LV1 hans
    실버팀 switch 박윤택 gloom
    • 각자 블로그에 풀이 내용을 게시하고 이를 활용하여 게더타운에서 발표
    • 매주 수요일 자정까지 다음 주 발표자가 문제를 선정하여 공지하여야 함
    • 자유로운 언어 사용 - java, python, c++ 등

    5월 첫째 주 문제

    🙄🙄🙄현황판 05/04🙄🙄🙄 발표자 문제
    브론즈팀 !!!김형섭!!! 백준1712번 손익분기점
    실버팀 switch 백준1003번 피보나치함수

     


    백준1712번 손익분기점 [링크]

    백준1712번 손익분기점 문제

     


     

    풀이 과정

    주어진 조건을 만족하기 위한 방정식은 바로 생각이 났다.

    고정비용 a
    생산비용 b
    노트북가격 c
    판매대수 n

    여기서, 최초로 손익분기점을 넘는(이익 발생) 판매대수 n 을 구하면 된다.

    따라서 a+b*n < c*n 을 만족하는 최소 n 값을 찾으면 된다.

    또한 노트북가격이 생산비용보다 높아야 이익이 발생하므로 c>b 를 만족해야 한다.

    # 1차 작성 코드
    a, b, c = int(input().split())
    n = 1
    if b>=c :
        print(-1)
    else :
        while (a+b*n)>=(c*n) :
            n+=1
        print(n)

    📌 1차 코드 제출 결과

    런타임에러 TypeError 발생

    런타임 TypeError가 발생했고 에러메시지를 잘 읽어보니

    a, b, c = int(input().split())

    위 코드라인에서 int() 의 인자로 'list 타입'은 불가하다고 한다. 즉 input().split()의 결과가 'list 타입'이며 int() 의 인자로 사용할 수 없었다. 

     

    해결방법을 위해 구글링 결과 map() 함수가 적절해보였다. 사용법은 map(function, iterable) 이다. 첫 매개변수는 function(적용할 함수), 두 번째 매개변수로는 iterable(반복가능한 자료형; List, Tuple 등)이 온다. .

     

    따라서 다음과 같이 코드를 변경하였다.

    # 2차 작성 코드
    a,b,c=map(int, input().split()) # map 함수로 변경됨.
    
    n = 1
    if b>=c :
        print(-1)
    else :
        while (a+b*n)>=(c*n) :
            n+=1
        print(n)

    📌 2차 코드 제출 결과

     

    시간 초과

    시간을 줄여야한다... 백준에서 몇 초가 걸렸는지는 알려주지 않는 듯 하다.

    약간의 구글링(정답은 보지 않았다.)과 어떻게 하면 시간을 줄일 수 있을 까 고민한 결과, 방정식을 변형해서 n을 곱하는 연산을 줄이는 방법이 떠올랐다. 

     

    a+(b*n)-(c*n) >= 0
    a+(b-c)*n >= 0

     

    이렇게 수정하여 실행하여도 시간초과였다..

    이 후 "n을 1씩 증가시키는게 아닌 방법이 있을까?" 등의 고민을 하다가, 충분한 고민의 시간을 보냈다고 판단했을 때 구글링을 했다.

    결과는 다음과 같았다.

     

    a+b*n = c*n 일 때 비용과 수익이 같아지므로 a/(c-b)+1 이 n값이 된다.

     

    📌 3차 코드 제출 결과

    # 3차 작성 코드
    a,b,c=map(int, input().split())
    
    if b>=c :
        print(-1)
    else :
        print(int(a/(c-b)+1))

    맞았다!

     

    고찰

    나는 주어진 조건 그대로 방정식을 세우고, 이 식을 이리저리 변환해보는 방식으로 답을 찾으려 했으나 찾지 못했다.

    문제를 수학적으로만 조작해보는 것이 아닌 논리적으로 해결 방안을 구상해보는 방법으로 해결이 가능했다.

    이번 문제를 풀면서, 알고리즘 문제를 풀기 위해서는 뭐랄까.. 약간의 발상의 전환(?)을 통해 논리적으로 해결이 가능하다는 것을 느꼈고 수학적인 능력도 키울 필요성을 느꼈다.

    이외에도 여러가지로 느낀 점이 많았다.

     

    끝.

Designed by Tistory.