728x90

BOJ 3040 백설 공주와 일곱 난쟁이

문제

매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 

난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 

백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.

어느 날 광산에서 아홉 난쟁이가 돌아왔다. 

(왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 

아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.

백설공주는 이런 일이 생길 것을 대비해서, 

난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 

사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 

따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.

아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. 

(아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)

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

입력

총 아홉개 줄에 1보다 크거나 같고 99보다 작거나 같은 자연수가 주어진다. 

모든 숫자는 서로 다르다.

또, 항상 답이 유일한 경우만 입력으로 주어진다.

출력

일곱 난쟁이가 쓴 모자에 쓰여 있는 수를 한 줄에 하나씩 출력한다.

예제 입력 1

7
8
10
13
15
19
20
23
25

예제 출력 1

7
8
10
13
19
20
23

예제 입력 2

8
6
5
1
37
30
28
22
36

예제 출력 2

8
6
5
1
30
28
22

풀이

import sys

input = sys.stdin.readline
arr = [int(input()) for _ in range(9)]

for i in range(8):
    for j in range(i + 1, 9):
        res = 0

        for k in range(9):
            if k == i or k == j:
                continue
            res += arr[k]
            
        if res == 100:
            for k in range(9):
                if k == i or k == j:
                    continue
                print(arr[k])
            exit()
728x90
728x90

BOJ 10819 차이를 최대로

문제

N개의 정수로 이루어진 배열 A가 주어진다. 

이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오.

|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|

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

입력

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 

둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 

배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

출력

첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.

예제 입력 1

6
20 1 15 8 4 10

예제 출력 1

62

풀이

from itertools import permutations

n = int(input())
numbers = list(map(int, input().split()))
res = []

for per in permutations(numbers, n):
    tmp = 0
    for i in range(n - 1):
        tmp += abs(per[i] - per[i + 1])
    res.append(tmp)

print(max(res))
728x90
728x90

BOJ 1057 토너먼트

문제

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 

토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 

그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 

이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 

만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 

다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 

이때, 번호를 매기는 순서는 처음 번호의 순서를 유지하면서 1번부터 매긴다. 

이 말은 1번과 2번이 스타를 해서 1번이 진출하고, 3번과 4번이 스타를 해서 4번이 진출했다면, 

4번은 다음 라운드에서 번호 2번을 배정받는다. 

번호를 다시 배정받은 후에 한 명만 남을 때까지 라운드를 계속 한다.

마침 이 스타 대회에 임한수도 참가했다. 

김지민은 갑자기 스타 대회에서 우승하는 욕심은 없어지고, 몇 라운드에서 임한수와 대결하는지 궁금해졌다. 

일단 김지민과 임한수는 서로 대결하기 전까지 항상 이긴다고 가정한다. 

1 라운드에서 김지민의 번호와 임한수의 번호가 주어질 때, 

과연 김지민과 임한수가 몇 라운드에서 대결하는지 출력하는 프로그램을 작성하시오.

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

입력

첫째 줄에 참가자의 수 N과 1 라운드에서 김지민의 번호와 임한수의 번호가 순서대로 주어진다. 

N은 2보다 크거나 같고, 100,000보다 작거나 같은 자연수이고, 

김지민의 번호와 임한수의 번호는 N보다 작거나 같은 자연수이고, 서로 다르다.

출력

첫째 줄에 김지민과 임한수가 대결하는 라운드 번호를 출력한다. 

만약 서로 대결하지 않을 때는 -1을 출력한다.

예제 입력 1

16 1 2

예제 출력 1

1

예제 입력 2

16 8 9

예제 출력 2

4

예제 입력 3

1000 20 31

예제 출력 3

4

예제 입력 4

65536 1000 35000

예제 출력 4

16

풀이

n, jm, hs = map(int, input().split())

round = 0

while (n > 1) and (jm != hs) :
    n -= n//2
    jm -= jm//2
    hs -= hs//2
    round += 1

if n == 1 and jm != hs :
    round -= 1

print(round)

처음에 n을 사용 안하고 풀었으나 주어진 입력값을 전부 사용하기 위해 수정

다른 방법을 좀더 찾아봐야겠다

728x90
728x90

BOJ 2702 초6 수학

문제

두 정수 a와 b 최소공배수는 두 수의 공통된 배수 중 가장 작은 수이고, 

최대공약수는 두 수의 공통된 약수중 가장 큰 수이다.

a와 b가 주어졌을 때, 최소공배수와 최대공약수를 구하는 프로그램을 작성하시오.

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

입력

첫째 줄에 테스트 케이스의 개수 T(1<=T<=1,000)가 주어진다. 

각 테스트 케이스는 두 정수 a와 b로 이루어져 있고, 공백으로 구분되어 있다. (1 <= a,b <= 1,000)

출력

각 테스트 케이스에 대해 최소공배수와 최대공약수를 차례대로 출력한다.

예제 입력 1

3
5 10
7 23
42 56

예제 출력 1

10 5
161 1
168 14

풀이

import sys

def lcm(a, b) :
  return int((a*b) / gcd(a, b))

def gcd(a, b) :
  if a == 0 :
    return b
  else :
    return gcd(b % a, a)

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

for i in range(t) :
    a, b = map(int, input().split())
    print(lcm(a, b), gcd(a, b))
728x90
728x90

BOJ 1120 문자열

문제

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 

예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다.

두 문자열 A와 B가 주어진다. 

이때, A의 길이는 B의 길이보다 작거나 같다. 

이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다.

    A의 앞에 아무 알파벳이나 추가한다.
    A의 뒤에 아무 알파벳이나 추가한다.

이때, A와 B의 길이가 같으면서, A와 B의 차이를 최소로 하는 프로그램을 작성하시오.

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

입력

첫째 줄에 A와 B가 주어진다. 

A와 B의 길이는 최대 50이고, A의 길이는 B의 길이보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.

출력

A와 B의 길이가 같으면서, A와 B의 차이를 최소가 되도록 했을 때, 그 차이를 출력하시오.

예제 입력 1

adaabc aababbc

예제 출력 1

2

예제 입력 2

hello xello

예제 출력 2

1

예제 입력 3

koder topcoder

예제 출력 3

1

예제 입력 4

abc topabcoder

예제 출력 4

0

예제 입력 5

giorgi igroig

예제 출력 5

6

풀이

import sys

input = sys.stdin.readline
a, b = input().split()
res = list()

for i in range(len(b) - len(a)+1):
    cnt = 0
    for j in range(len(a)):
        if(a[j] != b[j+i]):
            cnt += 1
    res.append(cnt)
    
print(min(res))
728x90
728x90

BOJ 1075 나누기

문제

두 정수 N과 F가 주어진다. 

지민이는 정수 N의 가장 뒤 두 자리를 적절히 바꿔서 N을 F로 나누어 떨어지게 만들려고 한다. 

만약 가능한 것이 여러 가지이면, 뒤 두 자리를 가능하면 작게 만들려고 한다.

예를 들어, N=275이고, F=5이면, 답은 00이다. 200이 5로 나누어 떨어지기 때문이다. 

N=1021이고, F=11이면, 정답은 01인데, 1001이 11로 나누어 떨어지기 때문이다.

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

입력

첫째 줄에 N, 둘째 줄에 F가 주어진다.

N은 100보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다. 

F는 100보다 작거나 같은 자연수이다.

출력

첫째 줄에 마지막 두 자리를 모두 출력한다. 

한자리이면 앞에 0을 추가해서 두 자리로 만들어야 한다.

예제 입력 1

1000
3

예제 출력 1

02

예제 입력 2

2000000000
100

예제 출력 2

00

예제 입력 3

23442
75

예제 출력 3

00

예제 입력 4

428392
17

예제 출력 4

15

예제 입력 5

32442
99

예제 출력 5

72

풀이

n = input()
f = int(input())
fix_n = int(n[:-2]+'00')

while True :
    if fix_n % f == 0 :
        break
    fix_n += 1

print(str(fix_n)[-2:])

 

728x90
728x90

BOJ 2501 약수구하기

문제

어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 

6을 예로 들면

    6 ÷ 1 = 6 … 0
    6 ÷ 2 = 3 … 0
    6 ÷ 3 = 2 … 0
    6 ÷ 4 = 1 … 2
    6 ÷ 5 = 1 … 1
    6 ÷ 6 = 1 … 0
    
그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.

두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

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

입력

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. 

N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

출력

첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 

만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

예제 입력 1 

6 3

예제 출력 1

3

예제 입력 2

25 4

예제 출력 2 

0

예제 입력 3

2735 1

예제 출력 3

1

풀이

n, k = map(int, input().split())
res = []

for i in range(1, n+1) :
    if n % i == 0 :
        res.append(i)

if len(res) >= k :
    print(res[k-1])
else :
    print(0)

 

728x90
728x90

BOJ 1977 완전제곱수

문제

M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 

그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 

완전제곱수는 64, 81, 100 이렇게 총 3개가 있으므로 그 합은 245가 되고 이 중 최솟값은 64가 된다.

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

입력

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

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

출력

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

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

예제 입력 1

60
100

예제 출력 1 

245
64

예제 입력 2 

75
80

예제 출력 2

-1

풀이

m = int(input())
n = int(input())
res = []
i = 1

while i**2 <= n :
    if m <= i**2 <= n :
        res.append(i**2)
    i += 1

if res == []:
    print(-1)
else :
    print(sum(res))
    print(min(res))
728x90

+ Recent posts