10250
문제 | ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다. 문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다. ![]() 그림 1. H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림 방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다. 손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다. 여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다. |
입력 | 프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). |
출력 | 프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다. |
답 | t = int(input()) for _ in range(t): h, w, n = map(int, input().split()) yy = 1 xx = 1 while n > h: n -= h xx += 1 yy = n print(yy*100+xx) |
층수랑 호수를 yy, xx로 두고
for문을 t 만큼 돌린다!
문제에서 말한대로 배정하려면 1호부터 아래층에서 윗층으로 순서대로 배정될 것이다.
만약 6층짜리 건물에 12호까지 있는 호텔에 10번째 손님일경우는
1호부터 1층~6층까지는 이미 차있고,
2호의 4층으로 배정될 것이라 402호가 될 것이다!
이걸 가지고 while 문을 돌리자!
n이 h보다 크면 h를 빼주면서 xx를 1씩 더해주는 것이다.
한 호수가 다 차있으니 옆 호수로 넘어가는것!
사실 조건에 (1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). 이렇게 되어있어서 w는 신경을 안써도 된다!
t = int(input())
yy = 1 # 층수
xx = 1 # 호수
for _ in range(t):
h, w, n = map(int, input().split())
while n > h:
n -= h
xx += 1
yy = n
print(yy*100+xx)
그래서 저렇게 세웠는데
예제를 입력했더니
2
6 12 10 #402
30 50 72 #1204 가 나오더라 1203이 나와야하는데...
그래서 따로
1
30 50 72 를 해봤더니 1203이 잘 나왔다.
그래서 다시 들여다보니
변수선언을 저기에 해서 그런것같다!
t = int(input())
for _ in range(t):
h, w, n = map(int, input().split())
yy = 1
xx = 1
while n > h:
n -= h
xx += 1
yy = n
print(yy*100+xx)
이렇게 바꿔주고 정답~!
다른사람들 코드를 보니
def room(h, w, n):
if (n%h == 0):
roomNumber = h*100 + n//h
else:
roomNumber = (n%h)*100 + (n//h + 1)
return roomNumber
count = int(input())
for i in range(count):
a, b, c = map(int, input().split())
print(room(a, b, c))
이렇게 하신분도 있더랑.. 싱기...
자리수 맞추기!
아래를 이용해서 호수 이용할때 저렇게 하려다가
앞에 공백이 안없어져서 방법을 바꿨당..!!
a = 5
format(a, '03')
> 005
https://alphahackerhan.tistory.com/55
[파이썬/Python] 숫자/문자열 앞에 "0" 채우기
1. 문자열 앞에 "0" 채우기 -> zfill string_number = "1" a = string_number.zfill(2) b = string_number.zfill(4) print(a) print(b) >>> 01 >>> 0001 2. 문자열 앞에 "0" 말고도 다른 것으로 채우기 -> rjust s..
alphahackerhan.tistory.com
2775
문제 | 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다. 이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다. 아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. |
입력 | 첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다 |
출력 | 각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라. |
답 | t = int(input()) for _ in range(t): k = int(input()) # 층 n = int(input()) # 호 floor0 = [x for x in range(1, n+1)] # [0,1,2,3,4,5,6,7,8,9] for k in range(k): # 층 수 만큼 반복 for i in range(1, n): # 1 ~ n-1까지 (인덱스로 사용) floor0[i] += floor0[i-1] # 층별 각 호실의 사람 수를 변경 print(floor0[-1]) # 가장 마지막 수 출력 |
아하! 이해하는데 또 꽤나 시간이 걸렸다 히히
일단 k는 조건에서 0은 아니라고 했으니! 함 해볼까
어떻게 구해야되는지는 알겠는데 코드 나타내는게 너무 어렵다..ㅜㅜ
열심히 해보다가 뭔가 점점 산으로가고 꼬이고
시간이너무 오래걸려서 결국 다른 사람의 코드를 봤는데
이런.. 코드를 봐도 이해가 잘 되질 않는다..ㅜㅜ
오늘은 머리가 잘 안돌아가는것 같다...!!
저녁에 다시 봐야지..
t = int(input())
for _ in range(t):
k = int(input()) # 층
n = int(input()) # 호
floor0 = [x for x in range(1, n+1)] # [0,1,2,3,4,5,6,7,8,9]
for k in range(k): # 층 수 만큼 반복
for i in range(1, n): # 1 ~ n-1까지 (인덱스로 사용)
floor0[i] += floor0[i-1] # 층별 각 호실의 사람 수를 변경
print(floor0[-1]) # 가장 마지막 수 출력
튜터님께 여쭤보고 이해완!!!
문제는 모든 호수의 값을 정해두려고 했다는거??
k=1일때
floor[1]값이 3 이었으면
k=2일때
floor[1]을 구할 때 3이 저장되어있다는걸 생각 못했다!
누적이 되어있다는게 직관적으로 와닿지가 않았다!
이해완^_^
2839
문제 | 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다. 상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오. |
입력 | 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000) |
출력 | 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다. |
답 | n = int(input()) if n % 5 == 0: print(n//5) else: num = 0 while n > 0: n -= 3 num += 1 if n % 5 == 0: num += n//5 print(num) break elif n == 0: print(num) break elif n==1 or n==2: print('-1') break |
더 적은 개수를 가져가려면
일단 우선적으로 5킬로그램을 먼저 채워야한다!
n이 5의 배수이면 그냥 n/5를 출력해주면 되는데
만약 5의 배수가 아니면
n이 음수가 되기 전까지 3을 순서대로 빼주면서 그때마다
5의 배수인지(3과 5를 둘다 사용)
0인지(3만 사용)
1,2 인지(-1 출력) 해주는 것이다!
중간에 결과가 나오면 break로 다음이 더 실행 안되도록 해주자!
n = int(input())
if n % 5 == 0:
print(n//5)
else:
num = 0
while n > 0:
n -= 3
num += 1
if n % 5 == 0:
num += n//5
print(num)
break
elif n == 0:
print(num)
break
elif n==1 or n==2:
print('-1')
break
10757
문제 | 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. |
입력 | 첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000) |
출력 | 첫째 줄에 A+B를 출력한다. |
답 | import sys a, b = map(int, sys.stdin.readline().split()) print(a+b) |
잉...? 이건 쉬운거 아닌가...?
혹시 런타임아웃될까봐 sys로 받아서 했는데 뭐지...??
import sys
a, b = map(int, sys.stdin.readline().split())
print(a+b)
'알고리즘 > 백준' 카테고리의 다른 글
기본수학2 (11653, 1929) (1) | 2022.09.16 |
---|---|
기본수학2 (1978, 2581) (1) | 2022.09.15 |
기본수학1 (1712, 2292, 1193, 2869) (0) | 2022.09.13 |
문자열(1152, 2908, 5622, 2941, 1316) (1) | 2022.09.11 |
문자열(11654, 11720, 10809, 2675, 1157) (0) | 2022.09.10 |
댓글