728x90

BOJ 2581 소수

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로,

이들 소수의 합은 620이고, 최솟값은 61이 된다.

시간 제한 : 1 초
메모리 제한 : 128 MB

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

예제 입력 1

60
100

예제 출력 1

620
61

예제 입력 2

64
65

예제 출력 2

-1

풀이

# boj 2581 소수

m = int(input())
n = int(input())
arr =[]

for i in range(m, n+1):
    if i == 1:
        continue
    for j in range(2, int(i**0.5)+1):
        if i % j == 0:
            break
    else:
        arr.append(i)
        
if len(arr) == 0: print(-1)
else:
    print(sum(arr))
    print(arr[0])
728x90
728x90

BOJ 2609 최대공약수와 최소공배수

문제

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

시간 제한 : 1 초
메모리 제한 : 128 MB

입력

첫째 줄에는 두 개의 자연수가 주어진다. 

이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

예제 입력 1

24 18

예제 출력 1

6
72

풀이

# boj 2609 최대공약수와 최소공배수

import math
 
n, m = map(int, input().split())
print(math.gcd(n,m))
print(math.lcm(n,m))

 

728x90
728x90

BOJ 2775 부녀회장이 될테야

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, 

“a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 

주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 

단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

시간 제한 : 1 초
메모리 제한 : 128 MB

입력

첫 번째 줄에 Test case의 수 T가 주어진다. 

그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

제한

1 ≤ k, n ≤ 14

예제 입력 1

2
1
3
2
3

예제 출력 1

6
10

풀이

# boj 2775 부녀회장이 될테야

import sys

input = sys.stdin.readline
t = int(input())

for _ in range(t):
    k = int(input())
    n = int(input())
    floor = [i for i in range(1,n+1)]
    
    for _ in range(k):
        for j in range(1,n):
            floor[j] += floor[j-1]
            
    print(floor[-1])
728x90
728x90

BOJ 1085 직사각형에서 탈출

문제

한수는 지금 (x, y)에 있다. 

직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 

직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

시간 제한 : 2 초
메모리 제한 : 128 MB

입력

첫째 줄에 x, y, w, h가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

제한

1 ≤ w, h ≤ 1,000
1 ≤ x ≤ w-1
1 ≤ y ≤ h-1
x, y, w, h는 정수

예제 입력 1

6 2 10 3

예제 출력 1

1

예제 입력 2

1 1 5 5

예제 출력 2

1

예제 입력 3

653 375 1000 1000

예제 출력 3

347

예제 입력 4

161 181 762 375

예제 출력 4

161

풀이

# boj 1085 직사각형에서 탈출

x, y, w, h = map(int, input().split())
print(min(w-x, h-y, x, y))
728x90
728x90

BOJ 1193 분수찾기

문제

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
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번째 분수를 구하는 프로그램을 작성하시오.

시간 제한 : 0.5 초
메모리 제한 : 256 MB

입력

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

출력

첫째 줄에 분수를 출력한다.

예제 입력 1

1

예제 출력 1

1/1

예제 입력 2

2

예제 출력 2

1/2

예제 입력 3

3

예제 출력 3

2/1

...

예제 입력 8

8

예제 출력 8

2/3

예제 입력 9

9

예제 출력 9

3/2

예제 입력 10

14

예제 출력 10

2/4

풀이

# boj 1193 분수찾기

x = int(input())
i = 1
while(True):
  if (x-i > 0):
    x -= i
    i += 1
  else:
    break
if (i+1)%2 == 1:
  print(f'{x}/{i-(x-1)}')
else:
  print(f'{i-(x-1)}/{x}')
728x90
728x90

BOJ 1929 소수 구하기

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

시간 제한 : 2 초
메모리 제한 : 256 MB

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) 

M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

예제 입력 1

3 16

예제 출력 1

3
5
7
11
13

풀이

# boj 1929 소수 구하기

m, n = map(int, input().split())
chk = [False] * (n+1)
chk[1] = True

for i in range(2, n+1):
    if chk[i]: continue
    for j in range(i*2, n+1, i):
        chk[j] = True

for k in range(m, n+1):
    if not chk[k]:
        print(k)
728x90
728x90

BOJ 10250 ACM 호텔

문제

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 호에 배정해야 한다.

시간 제한 : 1 초
메모리 제한 : 256 MB

입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 

프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 

각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 

각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W).

출력

프로그램은 표준 출력에 출력한다. 

각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.

예제 입력 1 

2
6 12 10
30 50 72

예제 출력 1

402
1203

풀이

# boj 10250 ACM 호텔

t = int(input())

for _ in range(t):
    h, w, n = map(int, input().split())
    a = 0 
    b = 0

    if n%h == 0:
        a = h*100
        b = n//h
    else:
        a = (n%h)*100
        b = n//h + 1

    print(a + b)
728x90
728x90

BOJ 2869 달팽이는 올라가고 싶다

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 

또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

시간 제한 : 0.25 초
메모리 제한 : 128 MB

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

예제 입력 1

2 1 5

예제 출력 1

4

예제 입력 2

5 1 6

예제 출력 2

2

예제 입력 3

100 99 1000000000

예제 출력 3

999999901

풀이

# boj 2869 달팽이는 올라가고 싶다
import sys

input = sys.stdin.readline
a, b, v = map(int, input().split())
res = (v - a) // (a - b)

if (v - a) % (a - b) == 0:
    print(res + 1)
else:
    print(res + 2)
728x90

+ Recent posts