[단계별로 풀어보기-8 기본 수학 1단계] 1712,2292,1193,2869,10250,2775,2839,10757,1011
집가고시퍼
2022. 1. 18. 17:59
[1712] Q : 고정비용 A, 한 대의 노트북을 생산하는데 드는 비용을 B라 하자. A=1000, B=70이면 노트북 한 대를 생산하는데 1070만원, 열 대를 생산하는데 1700만원이 든다. 노트북 가격이 C로 책정되었다고 할 때, C*판매대수(=총 수입)가 A+B*판매대수(=총 비용)보다 커지는 노트북 판매대수를 구해라 입력으로 A, B, C가 빈 칸을 두고 입력된다. 손익분기점이 존재하지 않으면 -1을 출력해라
A :노트북을 판매하는 가격보다 만드는 가격이 같거나 크다면 손익분기점을 넘기는 것이 불가하다. 6번 line에서 int(~~)를 하면 내림이 일어나므로 +1을 해서 출력한다.
처음에는 이렇게 풀어보았는데, 시간 초과가 떴다. 코딩테스트에서는 시간을 줄이는 것도 중요하다.
[2292] Q :그림같이 육각형으로 이루어진 벌집이 있다. 가운데 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호로 주소를 매긴다. 벌집의 중앙 1에서 N번 방까지 갈 때, 최소 몇 개의 방을 지나서 가야 하는지 출력해라(시작과 끝을 포함해서) 예를 들어, 13까지는 3개의 방을 거쳐야 한다.
A : 거리를 구하려면 몇 번째 layer에 있는지를 구하면 된다. 그리고 layer는 규칙성을 가지고 있다. 둘째 layer는 각 변당 2 개의 cell, 셋째 layer는 각 변당 3개의 cell을 가지고 있다. 따라서 각 layer의 첫 수는 1,2,8,20,... 순이다. 차가 1,6,12,..(-,1*6,2*6...) 순으로 증가하기 때문이다. line 12에서 cnt+1을 출력해주는 이유는 첫 째방(1번 방)을 더해주기 때문이다.
[1193] Q :
1/1
1/2
1/3
1/4
1/5
…
2/1
2/2
2/3
2/4
…
…
3/1
3/2
3/3
…
…
…
4/1
4/2
…
…
…
…
5/1
…
…
…
…
…
…
…
…
…
…
…
위 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자. X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성해라
A :
[2869] Q : 달팽이가 높이가 V미터인 막대를 올라간다. 달팽이는 낮에는 A미터 올라갈 수 있지만, 밤에는 자는동안 B미터를 미끄러진다. 달팽이가 나무 막대를 끝까지 올라가려면 며칠이 걸리는지 구해라. 입력으로 A,B,V가 공백으로 구분되어 주어진다.
A :처음에는 아래와 같이 풀었지만 시간 초과가 떴다.
[10250] Q :각 층에 W개의 방이 있는 H층 건물이라 생각하자. 방 번호는 YXX나 YYXX 형태인데, Y나 YY는 층수를, XX는 엘레베이터에서부터의 거리를 나타낸다. 손님에게 방을 배정할 때, 손님은 엘리베이터를 타고 이동하는 거리는 신경쓰지 않는다. 다만 걷는 거리가 같을 때는 아래 층의 방을 선호한다. 예를 들어, 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 초기에는 모든 방이 비어있다고 가정하고, N번째 손님에게 배정될 방 번호를 계산하는 프로그램을 작성하라. 첫 줄에 테스트 데이터의 개수 T가 주어지고, 각 줄에 H, W, N이 주어진다. 각 테스트 데이터에 대해 N번째 손님에게 배정되어야 하는 방 번호를 줄을 바꾸어 출력해라
A :기본적으로 호수는 N//H + 1로, 층은 N%H로 설정해 주었으나, N%H == 0인 경우. 즉, 가장 윗 층에 배정된 경우에 대해서는 별도의 설정이 필요했다. 그리고 13~16 line에서 줄을 바꾸려 별도로 line 17에 print()를 써줄 필요가 없다. print 안에 end를 사용한 것이 아니라면 알아서 줄이 바뀐다. 13~16 line대신 print('X*100+Y')를 하면 한 줄로 쉽게 출력할 수 있다.
[2775] Q : 어느 아파트의 입주 조건은 “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다”는 것이다. 아파트에 비어있는 집은 없고, 모든 거주민들이 이 계약 조건을 지키고 있다고 할 때, k층 n호에는 몇 명이 살고있는지 출력해라. 아파트는 0층부터 있고, 각 층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. 첫째 줄에 테스트 케이스의 수 T가 주어진다. 그리고 각 케이스마다 줄을 바꿔 k, n이 주어진다. 각 테스트 케이스에 대해서 해당 집에 거주하고 있는 사람의 수를 출력해라
A :함수를 정의해 재귀를 이용해 푸는 방법도 생각해 보았으나, 백준 문제에서는 시간초과가 일어나는 경우가 많다. 그리고 line 17에서 print(tmp[-1])을 하면 마지막 원소를 쉽게 출력할 수 있다.
[2839] Q : 설탕 봉지는 3kg, 5kg가 있다. 설탕을 Nkg 배달해야 할 때, 배달하는 봉지의 최소 개수를 출력해라. 만약 정확하게 Nkg을 만들 수 없다면 -1을 출력해라 예를 들어, N=4면 -1이고, N=11이면 5kg 1개, 3kg 2개로 3이다.
A :line 12에서 처음에는 print(cnt5 + (N-5*cnt5)/3)으로 했는데, 그럼 뒷부분이 float이 되어 int + float꼴이 되어 float이 출력된다. 나눗셈을 하면 나누어 떨어지더라도 float꼴으로 출력된다. print(5//1) == 5이지만 print(5/1) = 5.0이다. 그리고 5~7 line은 필요 없는 코드다. 어차피 중요한건 N이 5의 배수인진데, 5의 배수이면 어차피 11 line으로 들어가게 되어 12 line에서 print(cnt5 + 0)꼴이 된다.
[10757] Q : 두 정수 A와 B가 공백을 두고 입력된다. A+B를 출력하는 프로그램을 작성해라.
A :
[1011] Q : 우주선이 이동하는데, 이전 작동시기에 k광년을 이동하였을 때는 k-1 , k 혹은 k+1 광년만을 다시 이동할 수 있다. 예를 들어, 이 장치를 처음 작동시킬 경우 -1 , 0 , 1 광년을 이론상 이동할 수 있으나 사실상 음수 혹은 0 거리만큼의 이동은 의미가 없으므로 1 광년을 이동할 수 있으며, 그 다음에는 0 , 1 , 2 광년을 이동할 수 있는 것이다. ( 여기서 다시 2광년을 이동한다면 다음 시기엔 1, 2, 3 광년을 이동할 수 있다. ) x 지점에서 y 지점으로 최소한의 작동 횟수로 이동하려 한다. 그리고 y지점에 도착하기 직전의 이동거리는 반드시 1광년으로 하려 한다. x에서 y로 이동하는데 필요한 공간이동장치의 작동 횟수의 최솟값을 구하는 프로그램을 작성해라. 입력의 첫 줄에는 테스트케이스의 개수 T가 주어진다. 다음 줄부터는 줄을 바꿔 각 테스트케이스에 x와 y가 정수로 공백을 두고 입력된다(x<y).
A :이 문제를 수학적으로 엄밀히 증명하기는 어려웠다. 하지만 코딩테스트는 수학 증명문제가 아니다. 경우의 수를 써본 후, 규칙성을 찾아 답만 찾으면 된다. 이 문제에서도 규칙성이 존재했다. (https://eunhee-programming.tistory.com/99) 위처럼 공간이동의 수가 규칙적으로 증가하게 되며, 나는 line 16에서 판별 기준을 저렇게 썼지만, if (dist <= (tmp/2)**2)로도 쓸 수 있을 것이다. 또 다른 규칙성을 이용하는 방법이다.