//
728x90

BOJ 1094 막대기

문제

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 

지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.

막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 

지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.

1. 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 
이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
	1.가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
	2.만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 
    위에서 자른 막대의 절반 중 하나를 버린다.
2. 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.

X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오. 

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

입력

첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.

출력

문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.

예제 입력 1

23

예제 출력 1

4

예제 입력 2

32

예제 출력 2

1

예제 입력 3

64

예제 출력 3

1

예제 입력 4

48

예제 출력 4

2

풀이

# boj 1094 막대기

a = int(input())
cnt = 0
while a != 0:
    if a % 2 == 1:
        cnt += 1
    a = a // 2
print(cnt)
728x90
728x90

BOJ 11382 꼬마 정민

문제

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!

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

입력

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어진다.

출력

A+B+C의 값을 출력한다.

예제 입력 1

77 77 7777

예제 출력 1

7931

풀이

# boj 11382 꼬마 정민

a, b, c = map(int, input().split())
res = a + b + c
print(res)
728x90
728x90

BOJ 11051 이항 계수 2

문제

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

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ K ≤ N)

출력

예제 입력 1

5 2

예제 출력 1

10

풀이

# boj 11051 이항 계수 2
import sys

input = sys.stdin.readline
n, k = map(int, input().split())
res = 1
for i in range(k):
    res *= n
    n -= 1

div = 1
for i in range(2, k+1):
    div *= i

print((res // div) % 10007)
728x90
728x90

BOJ 2420 사파리월드

문제

사파리월드는 인터넷으로만 존재하는 미스테리한 나라이다. 

사파리월드에는 2개의 서브도메인이 seunghwan.royal.gov.sw와 kyuhyun.royal.gov.sw 이 있는데, 이것이 couple.royal.gov.sw으로 합쳐질 것이다. 

그러나 도메인 관리 센터 SWNIC(센터장: 김동규)에는 엄격한 룰이 있다. 

두 서브도메인을 합칠 때, 유명도의 차이가 너무 차이나지 않을 경우에만 두 서브도메인을 결혼시키는 것이다. 

서브도메인의 유명도는 정수이다. 

두 서브도메인의 유명도가 주어졌을 때, 그 차이를 구하는 프로그램을 작성하시오.

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

입력

첫째 줄에 두 도메인의 유명도 N과 M이 주어진다. (-2,000,000,000 ≤ N, M ≤ 2,000,000,000)

출력

첫째 줄에 두 유명도의 차이 (|N-M|)을 출력한다.

예제 입력 1

-2 5

예제 출력 1

7

풀이

# boj 2420 사파리월드
import sys

input = sys.stdin.readline
n, m = map(int, input().split())
print(abs(n - m))
728x90
728x90

BOJ 2455 지능형 기차

문제

최근에 개발된 지능형 기차가 1번역(출발역)부터 4번역(종착역)까지 4개의 정차역이 있는 노선에서 운행되고 있다. 

이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다. 

이 장치를 이용하여 출발역에서 종착역까지 가는 도중 기차 안에 사람이 가장 많을 때의 사람 수를 계산하려고 한다.

단, 이 기차를 이용하는 사람들은 질서 의식이 투철하여, 역에서 기차에 탈 때, 내릴 사람이 모두 내린 후에 기차에 탄다고 가정한다.

  내린 사람 수 탄 사람 수
1번역(출발역) 0 32
2번역 3 13
3번역 28 25
4번역(종착역) 39 0
예를 들어, 위와 같은 경우를 살펴보자.

이 경우, 기차 안에 사람이 가장 많은 때는 2번역에서 3명의 사람이 기차에서 내리고, 

13명의 사람이 기차에 탔을 때로, 총 42명의 사람이 기차 안에 있다.

이 기차는 다음 조건을 만족하면서 운행된다고 가정한다.

기차는 역 번호 순서대로 운행한다.
출발역에서 내린 사람 수와 종착역에서 탄 사람 수는 0이다.
각 역에서 현재 기차에 있는 사람보다 더 많은 사람이 내리는 경우는 없다.
기차의 정원은 최대 10,000명이고, 정원을 초과하여 타는 경우는 없다.

4개의 역에 대해 기차에서 내린 사람 수와 탄 사람 수가 주어졌을 때, 

기차에 사람이 가장 많을 때의 사람 수를 계산하는 프로그램을 작성하시오.

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

입력

각 역에서 내린 사람 수와 탄 사람 수가 빈칸을 사이에 두고 첫째 줄부터 넷째 줄까지 역 순서대로 한 줄에 하나씩 주어진다.

출력

첫째 줄에 최대 사람 수를 출력한다.

예제 입력 1

0 32
3 13
28 25
39 0

예제 출력 1

42

풀이

# boj 2455 지능형 기차
import sys

input = sys.stdin.readline
res = 0
max_res = 0
for i in range(4):
    a, b = map(int, input().split())
    res -= a
    res += b
    max_res = max(max_res, res)
print(max_res)
728x90
728x90

BOJ 5086 배수와 약수

문제

4 × 3 = 12이다.

이 식을 통해 다음과 같은 사실을 알 수 있다.

312의 약수이고, 123의 배수이다.

412의 약수이고, 124의 배수이다.

두 수가 주어졌을 때, 다음 3가지 중 어떤 관계인지 구하는 프로그램을 작성하시오.

첫 번째 숫자가 두 번째 숫자의 약수이다.
첫 번째 숫자가 두 번째 숫자의 배수이다.
첫 번째 숫자가 두 번째 숫자의 약수와 배수 모두 아니다.

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

입력

입력은 여러 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 10,000이 넘지않는 두 자연수로 이루어져 있다.

마지막 줄에는 02개 주어진다. 두 수가 같은 경우는 없다.

출력

각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 

배수라면 multiple을, 둘 다 아니라면 neither를 출력한다.

예제 입력 1

8 16
32 4
17 5
0 0

예제 출력 1

factor
multiple
neither

풀이

# boj 5086 배수와 약수
while True:
    a, b = map(int, input().split())
    if a == 0 and b == 0:
        break
    if b % a == 0:
        print('factor')
    elif a % b == 0:
        print('multiple')
    else:
        print('neither')
728x90
728x90

BOJ 6603 로또

문제

독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다.

로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 

집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다.

예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. 

([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])

집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.

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

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 

각 테스트 케이스는 한 줄로 이루어져 있다. 

첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. 

S의 원소는 오름차순으로 주어진다.

입력의 마지막 줄에는 0이 하나 주어진다.

출력

각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.

각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.

예제 입력 1

7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0

예제 출력 1

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7

1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34

풀이

# boj 6603 로또
import itertools

while True:
    s = list(map(int, input().split()))
    if s[0] == 0:
        break
    del s[0]
    s = list(itertools.combinations(s, 6))
    for i in s:
        for j in i:
            print(j, end=' ')
        print()
    print()
728x90
728x90

BOJ 2163 초콜릿 자르기

문제

정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 

초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다.

초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 

이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 

초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 

초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 

이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다. 

이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.

초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 정화는 가급적이면 초콜릿을 쪼개는 횟수를 최소로 하려 한다. 

초콜릿의 크기가 주어졌을 때, 이를 1×1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.

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

입력

첫째 줄에 두 정수 N, M(1 ≤ N, M ≤ 300)이 주어진다.

출력

첫째 줄에 답을 출력한다.

예제 입력 1

2 2

예제 출력 1

3

예제 입력 2

1 1

예제 출력 2

0

풀이

# boj 2163 초콜릿 자르기
n, m = map(int, input().split())
row = n-1
col = m-1

res = n * col
print(row + res)
728x90

+ Recent posts