본문 바로가기

FOSCAR-(Autonomous Driving)/알고리즘 스터디

[2023 알고리즘 스터디] 1조 오현민 #1주차 - 백준 10870, 2525, 1712, 4673

반응형

안녕하세요 1주차 블로그 리뷰를 맡은 오현민 입니다.

코드는 repl.it 사이트에서 쳐서 캡처했습니다.

 

https://www.acmicpc.net/problem/10870

 

10870번: 피보나치 수 5

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

피보나치 수를 구하는 문제입니다.

함수 순환을 이용하여 풀어보았습니다.

n>=2 일때부터 함수 호출이 가능해지므로 n이 0,1 일때는 그대로 리턴하도록 코드를 짰습니다.

 

 

 

 

 

 

 

https://www.acmicpc.net/problem/2525

 

2525번: 오븐 시계

첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

www.acmicpc.net

시간에 분을 더해서 결과시간을 출력하는 문제입니다.

rB (result B) 값에다 현재 분(B)+추가 분(C)를 더해줍니다. 예를 들어 현재 14시 40분이고 추가할 시간이 80분이면 rB는 120 이라는 값을 가집니다.

 

rA (result A) 값에 %24를 제외하고 생각하면 A+(rB//60)이 되는데 이것은 원래 시에다가  더해진 분에 의해 바뀐 시를 의미합니다. 아까의 예로 돌아가서 시만 생각하면 14시 였는데 rB값이 120분 이었으니까 2시간이 더해진 16시가 됩니다.

그리고 24시가 넘으면 다시 0시로 돌아가므로 %24를 해줍니다.

 

그리고 최종적으로 rA와 rB%60 를 출력해주면 해결되는 문제입니다.

 

알고리즘 자체는 어렵진 않지만 map 함수를 이용하여 인풋을 받는다는 문법을 모르면 풀기 어려운 문제 같습니다.

 

 

 

 

 

 

 

https://www.acmicpc.net/problem/1712

 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와

www.acmicpc.net

초기투자비용과 노트북 생산비용*판매대수 < 노트북 판매비용*판매대수 

투자비용, 생산비용, 판매비용이 주어졌고 판매대수가 몇이 되어야 위 식이 성립되냐를 물어보는 문제입니다.

먼저 생산비용B가 판매비용C보다 높거나 같으면 이익이 발생되는 구조가 아니므로 B>=C일 때는 가차없이 -1을 출력합니다.

 

처음에는 while 문을 사용하여 접근해봤는데 예시에 있는 21억인 경우엔  초당 2000만번 연산하는 파이썬으로는 시간이 너무 오래 걸려서 문제 의도와 다르다고 판단했습니다. 

 

X를 판매대수라고 하면 A+B*X < C*X 로 표현할 수 있는데 식을 정리하면 A/(B-C)<X 이렇게 됩니다.

우리가 구하는 것은 손익분기점을 달성하는 그때의 X를 구하면 되므로 그냥 간단히 A/(B-C) 값에 1을 더하면 됩니다.

여기서 주의할 것은 문제에서 X가 자연수라 했으므로 A/(B-C)가 아닌 A//(B-C)로 식을 만들어주면 간단히 해결되는 문제였습니다.

 

 

 

 

 

 

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

문법적으로 아는게 많아야 접근이라도 해볼 수 있는 문제라 사료됩니다.

19 에서 19+1+9 를 더하여 만들어지는 숫자는 29인데 19는 29의 생성자입니다.

29 에서 29+2+9 를 더하여 만들어지는 숫자는 40인데 29는 40의 생성자입니다.

그리고 생성자가 없는 숫자가 있는데 이 숫자를 셀프넘버라고 칭합니다.

1~10000까지 생성자가 없는 숫자를 구하고 출력하는 문제입니다.

 

array에 1~10000까지 리스트를 만들고 생성자가 있는 수가 들어갈 remove_array 를 만듭니다.

for 문을 2개 써서 첫 번째 for문은 생성자를 제공합니다. 두 번째 for문은 그 생성자로 숫자를 만듭니다.

예를 들어서 array에서 999라는 숫자를 뽑아내는것이 첫 번째 for 문의 역할이고

999+9+9+9 를 연산하여 1026이라는 숫자를 만들고 이 숫자를 remove_array에 저장하는 것이 두 번째 for 문의 역할입니다.

 

그리고 생성자가 존재하는 숫자를 array에서 제거하고 출력하면 생성자가 없는 숫자들이 출력되게 됩니다.

 

 

 

 

 

전체적으로 알고리즘도 절대 쉽지는 않았지만

쓰이는 문법들이 낯선 것들이 많았습니다.

map, split, set 이런 것들이 많이 쓰일텐데 하루빨리 익숙해지는 것을 목표로 공부를 해야겠습니다.

 

 

반응형