728x90

BOJ 1337 올바른 배열

문제

올바른 배열이란 어떤 배열 속에 있는 원소 중 5개가 연속적인 것을 말한다. 

(연속적인 것이란 5개의 수를 정렬했을 때, 인접한 수의 차이가 1인 것을 말한다.)

예를 들어 배열 {6, 1, 9, 5, 7, 15, 8}은 올바른 배열이다. 

왜냐하면 이 배열 속의 원소인 5, 6, 7, 8, 9가 연속이기 때문이다.

배열이 주어지면, 이 배열이 올바른 배열이 되게 하기 위해서 추가되어야 할 원소의 개수를 출력하는 프로그램을 작성하시오.

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

입력

첫째 줄에 배열의 크기 N이 주어진다. N은 50보다 작거나 같은 자연수이다.

둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다.

원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 배열에 중복되는 수는 없다.

출력

첫째 줄에 입력으로 주어진 배열이 올바른 배열이 되게 하기 위해서 추가되어야할 원소의 최소 개수를 출력한다.

예제 입력 1

3
5
6
7

예제 출력 1

2

예제 입력 2

6
5
7
9
8492
8493
192398

예제 출력 2

2

예제 입력 3

4
1000
2000
3000
4000

예제 출력 3

4

예제 입력 4

7
6
1
9
5
7
15
8

예제 출력 4

0

풀이

# boj 1337 올바른 배열
n = int(input())
arr = [int(input()) for _ in range(n)]
arr = sorted(arr)
temp = []

for i in range(0, n):
  cnt = 0
  for j in range(arr[i], arr[i]+5):
    if j not in arr:
      cnt += 1
  temp.append(cnt)
print(min(temp))
728x90
728x90

BOJ 9946 단어 퍼즐

문제

준하는 유치원에서 단어 퍼즐게임을 즐겨한다.

단어 퍼즐게임이란, 주어진 알파벳들을 섞어서 단어를 만드는 게임이다.

천재 준하는 알파벳을 임의로 조합하여, 사전과 매칭된 단어를 만드는 프로그램을 만들어 단어를 완성시켰다.

그러나 완성된 단어를 원장님에게 가져가려는 순간, 지나가던 강민이와 부딫혀서 단어조각을 땅에 떨어뜨리고 말았다.

준하는 어찌어찌 조각을 회수했지만, 순서는 뒤죽박죽이 되었고, 알파벳이 부족하거나 다른 알파벳이 섞였을 수도 있다.

준하가 처음에 완성한 단어와 나중에 회수한 알파벳들이 주어질 때,

준하가 알파벳을 제대로 회수했는지 안했는지 판단하는 프로그램을 만들어주자.

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

입력 

입력은 케이스마다 두줄로 이루어져있다.

첫째 줄은 준하가 처음 완성한 단어이고, 둘째 줄은 떨어뜨린 다음 회수한 알파벳들이다. 

각 줄은 알파벳 소문자로 이루어져 있고, 길이는 1000을 넘지 않는다.

마지막에 END라는 단어가 두줄 주어지는데, 이는 케이스의 끝을 의미한다.

출력

케이스마다 번호를 붙여서 예제출력과 같은 형식으로 출력한다.

준하가 알파벳을 제대로 회수했다면 same 을, 잘못 회수했다면 different 를 출력한다.

예제 입력 1

testing
intestg
abc
aabbbcccc
abcabcbcc
aabbbcccc
abc
xyz
END
END

예제 출력 1

Case 1: same
Case 2: different
Case 3: same
Case 4: different

풀이

# boj 9946 단어 퍼즐
import sys

input = sys.stdin.readline
i = 0
while True:
    i += 1
    a = input().strip()
    b = input().strip()
    if a == b == 'END':
        break 
    if sorted(a) == sorted(b):
        print(f"Case {i}: same")
    else:
        print(f"Case {i}: different")
728x90
728x90

BOJ 14729 칠무해

문제

조(Joe)는 중앙대학교 교수이고, 논리회로 설계 과목을 담당하고 있다. 

그는 수업을 하면서 7명의 학생을 제외한 나머지 학생들에게 좋은 학점을 주겠다고 약속을 하였다.

Joe 교수님을 돕기 위해서 학생들의 최종 성적이 주어질 때, 

그의 연구실인 You See Lab으로 데려갈 성적이 좋지 못한 7명의 학생, 칠무해의 성적을 뽑아보자.

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

입력

첫째 줄에 학생의 수 N(8 ≤ N ≤ 10,000,000)이 주어진다.

둘째 줄부터 N개의 줄에는 학생들의 성적이 무작위로 주어진다. 

성적은 최소 0점부터 최대 100점까지 0.001 점 단위로 부여된다.

출력

하위 7명의 성적을 점수가 낮은 순으로 각 줄마다 출력한다. 

하위 7명의 성적의 커트 라인에 동점자가 있을 경우에도 7명만 출력을 하면 된다.

예제 입력 1

8
20.000
70.000
50.000
30.000
70.000
30.000
60.000
70.000

예제 출력 1

20.000
30.000
30.000
50.000
60.000
70.000
70.000

풀이

# boj 14729 칠무해
import sys

input = sys.stdin.readline
n = int(input())
l = [float(input()) for _ in range(n)]

l.sort() 
for i in range(7):
  print('%.3f' %l[i])
728x90
728x90

BOJ 2204 도비의 난독증 테스트

문제

꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 

사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다.

하지만 인성이 좋지 않은 꿍은 사실 그러고 싶지 않았기 때문에 대소문자를 마구 섞어가며 단어들을 제시했다. 

예를 들어, apPle은 Bat보다 앞서지만 AnT보다는 뒤에 있는 단어다.

도비에게 희망은 여러분뿐이다! 여러분이 도비에게 자유를 선물해주도록 하자!

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

입력

각 테스트케이스는 정수 n (2 ≤ n ≤ 1000) 으로 시작하며 주어지는 단어의 개수를 뜻한다.

다음 각 n줄은 길이가 최대 20인 단어가 주어지며 대소문자의 구분을 없앴을 때 똑같은 단어는 주어지지 않는다.

마지막 입력은 0이 주어진다.

출력

각 줄에 각 테스트케이스에서 사전상 가장 앞서는 단어를 출력한다.

예제 입력 1

3
Cat
fat
bAt
4
call
ball
All
Hall
0

예제 출력 1

bAt
All

풀이

# boj 2204 도비의 난독증 테스트

while True:
    n = int(input())
    if n == 0:
        break
    arr = []
    for _ in range(n):
        s = input().rstrip()
        arr.append([s.lower(), s])
    arr.sort()
    print(arr[0][1])
728x90
728x90

BOJ 1911 흙길 보수하기

문제

어젯밤 겨울 캠프 장소에서 월드 본원까지 이어지는, 

흙으로 된 비밀길 위에 폭우가 내려서 N (1 <= N <= 10,000) 개의 물웅덩이가 생겼다. 

월드학원은 물웅덩이를 덮을 수 있는 길이 L (L은 양의 정수) 짜리 널빤지들을 충분히 가지고 있어서, 

이들로 다리를 만들어 물웅덩이들을 모두 덮으려고 한다. 

물웅덩이들의 위치와 크기에 대한 정보가 주어질 때, 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 구하여라.

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

입력

첫째 줄에 N과 L이 들어온다.

둘째 줄부터 N+1번째 줄까지 총 N개의 줄에 각각의 웅덩이들의 정보가 주어진다. 

웅덩이의 정보는 웅덩이의 시작 위치와 끝 위치로 이루어진다. 

각 위치는 0이상 1,000,000,000이하의 정수이다.

출력

첫째 줄에 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 출력한다.

예제 입력 1

3 3
1 6
13 17
8 12

예제 출력 1

5

힌트

아래와 같이 5개의 널빤지가 필요하다.

111222..333444555.... // 길이 3인 널빤지
.MMMMM..MMMM.MMMM.... // 웅덩이
012345678901234567890 // 좌표

풀이

#boj 1911 흙길 보수하기
import sys
import math
input = sys.stdin.readline
n, l = map(int, input().split())
pool = []

for _ in range(n):
    pool.append(list(map(int, input().split())))
    
pool.sort(key=lambda x: (x[0], x[1]))

res = 0
plank = 0

for start, end in pool:
    start = max(start, plank)
    cnt = math.ceil((end-start) / l)
    plank = start + cnt * l
    res += cnt

print(res)
728x90
728x90

BOJ 1296 팀 이름 정하기

문제

연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 

미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다.

이환이가 만든 공식은 사용하려면 먼저 다음 4가지 변수의 값을 계산해야 한다.

L = 연두의 이름과 팀 이름에서 등장하는 L의 개수
O = 연두의 이름과 팀 이름에서 등장하는 O의 개수
V = 연두의 이름과 팀 이름에서 등장하는 V의 개수
E = 연두의 이름과 팀 이름에서 등장하는 E의 개수

그 다음, 위에서 구한 변수를 다음 식에 입력하면 팀 이름의 우승할 확률을 구할 수 있다.

((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100

연두의 영어 이름과 팀 이름 후보 N개가 주어졌을 때, 우승할 확률이 가장 높은 팀 이름을 구해보자.

확률이 가장 높은 팀이 여러가지인 경우 사전 순으로 가장 앞서는 팀 이름이 우승할 확률이 가장 높은 것이다.

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

입력

첫째 줄에 연두의 영어 이름이 주어진다. 

둘째 줄에는 팀 이름 후보의 개수 N이 주어진다. 

셋째 줄부터 N개의 줄에 팀 이름이 한 줄에 하나씩 주어진다.

연두의 영어 이름과 팀 이름은 길이는 1보다 크거나 같고, 20보다 작거나 같으며, 알파벳 대문자로만 이루어져 있다.

N은 50보다 작거나 같은 자연수이다.

출력

첫째 줄에 우승할 확률이 가장 높은 팀 이름을 출력한다.

예제 입력 1

LOVE
3
JACOB
FRANK
DANO

예제 출력 1

FRANK

예제 입력 2

JANE
4
THOMAS
MICHAEL
INDY
LIU

예제 출력 2

INDY

예제 입력 3

LILLY
1
PIERRE

예제 출력 3

PIERRE

예제 입력 4

MERYLOV
5
JOHN
DAVE
STEVE
JOHN
DAVE

예제 출력 4

DAVE

예제 입력 5

LLOL
4
BVERON
CVERON
AVERON
DVERON

예제 출력 5

AVERON

예제 입력 6

VELYLEOCEVE
5
YVXHOVE
LCOKO
OGWSJVEVEDLE
WGFVSJEL
VLOLUVCBLLQVESWHEEKC

예제 출력 6

VLOLUVCBLLQVESWHEEKC

풀이

# boj 1296 팀 이름 정하기
import sys

input = sys.stdin.readline
name = input().rstrip()
n = int(input().rstrip())
arr = []
for i in range(n):
    teamName = input().rstrip()
    s = name+teamName
    L = s.count("L")
    O = s.count("O")
    V = s.count("V")
    E = s.count("E")
    num = ((L+O) * (L+V) * (L+E) * (O+V) * (O+E) * (V+E)) % 100
    arr.append((num, teamName))
    
arr.sort(key=lambda x : (-x[0], x[1]))

print(arr[0][1])
728x90
728x90

BOJ 2870 수학숙제

문제

상근이는 수학시간에 딴 짓을 하다가 선생님께 걸렸다. 

선생님은 상근이에게 이번 주말동안 반성하라며 엄청난 숙제를 내주었다.

선생님이 상근이에게 준 종이에는 숫자와 알파벳 소문자로 되어있는 글자가 N줄있다. 

상근이는 여기서 숫자를 모두 찾은 뒤, 이 숫자를 비내림차순으로 정리해야한다. 

숫자의 앞에 0이 있는 경우에는 정리하면서 생략할 수 있다.

글자를 살펴보다가 숫자가 나오는 경우에는, 가능한 가장 큰 숫자를 찾아야 한다. 

즉, 모든 숫자의 앞과 뒤에 문자가 있거나, 줄의 시작 또는 끝이어야 한다.

예를 들어, 01a2b3456cde478에서 숫자를 찾으면 1, 2, 3456, 478이다.

선생님이 준 종이의 내용이 주어졌을 때, 상근이의 숙제를 대신하는 프로그램을 작성하시오.

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

입력

첫째 줄에 종이의 줄의 개수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개의 줄에는 각 줄의 내용이 주어진다. 

각 줄은 최대 100글자이고, 항상 알파벳 소문자와 숫자로만 이루어져 있다.

출력

종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다.

각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 

비내림차순은 내림차순의 반대인 경우인데, 다음 수가 앞의 수보다 크거나 같은 경우를 말한다.

예제 입력 1

2
lo3za4
01

예제 출력 1

1
3
4

예제 입력 2

4
43silos0
zita002
le2sim
231233

예제 출력 2

0
2
2
43
231233

예제 입력 3

4
01bond
02james007
03bond
04austinpowers000

예제 출력 3

0
1
2
3
4
7

풀이

# boj 2870 수학숙제
import re

res = list()
for i in range(int(input())):
    s = input()
    for v in re.split('[a-z]', s):
        if v:
            res.append(int(v))
res.sort()
for j in res: print(j)
728x90
728x90

BOJ 2535 아시아 정보올림피아드

문제

최근 아시아 지역의 학생들만 참여하는 정보 올림피아드 대회가 만들어졌다. 

이 대회는 온라인으로 치러지기 때문에 각 나라에서 이 대회에 참여하는 학생 수의 제한은 없다. 

참여한 학생들의 성적순서대로 세 명에게만 금, 은, 동메달을 수여한다. 

단, 동점자는 없다고 가정한다. 그리고 나라별 메달 수는 최대 두 개다.

예를 들어, 대회 결과가 다음의 표와 같이 주어졌다고 하자.
참가국 학생번호 점수
1 1 230
1 2 210
1 3 205
2 1 100
2 2 150
3 1 175
3 2 190
3 3 180
3 4 195
이 경우, 금메달 수상자는 1번 국가의 1번 학생이고, 은메달 수상자는 1번 국가의 2번 학생이며, 동메달 수상자는 3번 국가의 4번 학생이다. 

(1번 국가의 3번 학생의 성적이 동메달 수여자보다 높지만, 나라 별 메달 수가 두 개 이하 이므로 1번 국가 3번 학생은 동메달을 받을 수 없다.)

대회 결과가 입력으로 주어질 때, 메달 수상자를 결정하여 출력하는 프로그램을 작성하시오.

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

입력

첫 번째 줄에는 대회참가 학생 수를 나타내는 N이 주어진다. 단, 3 ≤ N ≤ 100이다. 

두 번째 줄부터 N개의 줄에는 각 줄마다 한 학생의 소속 국가 번호, 학생 번호, 그리고 성적이 하나의 빈칸을 사이에 두고 주어진다. 

단, 국가 번호는 1부터 순서대로 하나의 정수로 주어지며, 각 학생번호는 각 나라별로 1부터 순서대로 하나의 정수로 주어진다, 

점수는 0 이상 1000 이하의 정수이고, 동점자는 없다고 가정한다. 

입력으로 제공되는 국가는 적어도 두 나라 이상이다.

출력

메달을 받는 학생들을 금, 은, 동메달 순서대로 한 줄에 한 명씩 출력한다. 

즉, 첫 번째 줄에는 금메달 수상자를, 두 번째 줄에는 은메달 수상자를, 세 번째 줄에는 동메달 수상자를 출력한다. 

하나의 줄에는 소속국가 번호와 학생 번호를 하나의 빈칸을 사이에 두고 출력한다.

예제 입력 1

9
1 1 230
1 2 210
1 3 205
2 1 100
2 2 150
3 1 175
3 2 190
3 3 180
3 4 195

예제 출력 1

1 1
1 2
3 4

풀이

# boj 2535 아시아 정보올림피아드
n = int(input())
nums = [list(map(int,input().split())) for _ in range(n)]
nums = sorted(nums, key = lambda x : x[2], reverse=True)
cnt = [0] * (n+1)
res = 0
i = 0
while res < 3:
    if cnt[nums[i][0]] < 2:
        cnt[nums[i][0]] += 1
        print(nums[i][0],nums[i][1])
        res += 1
    i += 1
728x90

+ Recent posts