//
728x90
반응형

BOJ 20291 파일 정리

문제

친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 

바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 

그리고 화면의 구석에서 친구의 메시지를 확인할 수 있었다.

바탕화면의 파일들에는 값진 보물에 대한 정보가 들어 있어. 
하나라도 지우게 된다면 보물은 물론이고 다시는 노트북을 쓸 수 없게 될 거야. 
파일들을 잘 분석해서 보물의 주인공이 될 수 있길 바랄게. 힌트는 “확장자”야.

화가 났던 스브러스는 보물 이야기에 금세 화가 풀렸고 보물의 정보를 알아내려고 애썼다. 

하지만 파일이 너무 많은 탓에 이내 포기했고 보물의 절반을 보상으로 파일의 정리를 요청해왔다.

스브러스의 요청은 다음과 같다.

파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
보기 편하게 확장자들을 사전 순으로 정렬해 줘

그럼 보물의 절반을 얻어내기 위해 얼른 스브러스의 노트북 파일 정리를 해줄 프로그램을 만들자!

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

입력

첫째 줄에 바탕화면에 있는 파일의 개수 N이 주어진다. (1 <= N <= 50000)

둘째 줄부터 N개 줄에 바탕화면에 있는 파일의 이름이 주어진다. 

파일의 이름은 알파벳 소문자와 점(.)으로만 구성되어 있다.

점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다. 

각 파일의 이름의 길이는 최소 3, 최대 100이다.

출력

확장자의 이름과 그 확장자 파일의 개수를 한 줄에 하나씩 출력한다. 

확장자가 여러 개 있는 경우 확장자 이름의 사전순으로 출력한다.

예제 입력 1

8
sbrus.txt
spc.spc
acm.icpc
korea.icpc
sample.txt
hello.world
sogang.spc
example.txt

예제 출력 1

icpc 2
spc 2
txt 3
world 1

노트

엄청난 보물의 정체는 바탕화면을 정리했다는 뿌듯함이라고 알려진다.

풀이

# boj 20291 파일정리
import sys

input = sys.stdin.readline
dic = {}

for _ in range(int(input())):
    file_name, extension = (input().rstrip()).split('.')
    
    if extension not in dic:
        dic[extension] = 1
    else:
        dic[extension] += 1

for key in sorted(dic.keys()):
    print(key, dic[key])
728x90
반응형
728x90
반응형

BOJ 1822 차집합

문제

몇 개의 자연수로 이루어진 두 집합 A와 B가 있다.

집합 A에는 속하면서 집합 B에는 속하지 않는 모든 원소를 구하는 프로그램을 작성하시오.

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

입력

첫째 줄에는 집합 A의 원소의 개수 n(A)와 집합 B의 원소의 개수 n(B)가 빈 칸을 사이에 두고 주어진다.

(1 ≤ n(A), n(B) ≤ 500,000)이 주어진다. 

둘째 줄에는 집합 A의 원소가, 셋째 줄에는 집합 B의 원소가 빈 칸을 사이에 두고 주어진다. 

하나의 집합의 원소는 2,147,483,647 이하의 자연수이며, 하나의 집합에 속하는 모든 원소의 값은 다르다.

출력

첫째 줄에 집합 A에는 속하면서 집합 B에는 속하지 않는 원소의 개수를 출력한다. 

다음 줄에는 구체적인 원소를 빈 칸을 사이에 두고 증가하는 순서로 출력한다.

집합 A에는 속하면서 집합 B에는 속하지 않는 원소가 없다면 첫째 줄에 0만을 출력하면 된다.

예제 입력 1

4 3
2 5 11 7
9 7 4

예제 출력 1

3
2 5 11

예제 입력 2

3 5
2 5 4
1 2 3 4 5

예제 출력 2

0

풀이

# boj 1822 차집합
import sys

input = sys.stdin.readline
n, m = map(int, input().split())
a = set(map(int, input().split()))
b = set(map(int, input().split()))
res = a-b
if res:
    print(len(res))
    print(*sorted(list(res)))
else:
    print(0)
728x90
반응형
728x90
반응형

BOJ 1755 숫자놀이

문제

79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 

80은 마찬가지로 "eight zero"라고 읽는다. 

79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로 먼저 온다.

문제는 정수 M, N(1 ≤ M ≤ N ≤ 99)이 주어지면 

M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.

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

입력

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

출력

M 이상 N 이하의 정수를 문제 조건에 맞게 정렬하여 한 줄에 10개씩 출력한다.

예제 입력 1

8 28

예제 출력 1

8 9 18 15 14 19 11 17 16 13
12 10 28 25 24 21 27 26 23 22
20

풀이

# boj 1755 숫자놀이

m, n = map(int, input().split())
dic = {'1':'one', '2':'two', '3':'three', '4':'four', '5':'five', '6':'six',
        '7':'seven', '8':'eight', '9':'nine', '0':'zero'}
arr = []

for i in range(m, n+1):
    itoa = ' '.join([dic[j] for j in str(i)])
    arr.append([i, itoa])
    
arr.sort(key=lambda x:x[1])

for i in range(len(arr)):
    if i%10 == 0 and i!= 0:
        print(sep = '\n')
    print(arr[i][0], end=' ')
728x90
반응형
728x90
반응형

BOJ 2910 빈도 정렬

문제

위대한 해커 창영이는 모든 암호를 깨는 방법을 발견했다. 그 방법은 빈도를 조사하는 것이다.

창영이는 말할 수 없는 방법을 이용해서 현우가 강산이에게 보내는 메시지를 획득했다. 

이 메시지는 숫자 N개로 이루어진 수열이고, 숫자는 모두 C보다 작거나 같다. 

창영이는 이 숫자를 자주 등장하는 빈도순대로 정렬하려고 한다.

만약, 수열의 두 수 X와 Y가 있을 때, X가 Y보다 수열에서 많이 등장하는 경우에는 X가 Y보다 앞에 있어야 한다. 

만약, 등장하는 횟수가 같다면, 먼저 나온 것이 앞에 있어야 한다.

이렇게 정렬하는 방법을 빈도 정렬이라고 한다.

수열이 주어졌을 때, 빈도 정렬을 하는 프로그램을 작성하시오.

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

입력

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000)

둘째 줄에 메시지 수열이 주어진다.

출력

첫째 줄에 입력으로 주어진 수열을 빈도 정렬한 다음 출력한다.

예제 입력 1

5 2
2 1 2 1 2

예제 출력 1

2 2 2 1 1

예제 입력 2

9 3
1 3 3 3 2 2 2 1 1

예제 출력 2

1 1 1 3 3 3 2 2 2

예제 입력 3

9 77
11 33 11 77 54 11 25 25 33

예제 출력 3

11 11 11 33 33 25 25 77 54

풀이

# boj 2910 빈도 정렬

n, c = map(int, input().split())
seq = list(map(int, input().split()))
cnt = {}
idx = 1
for s in seq:
    if s in cnt:
        cnt[s][0] +=1
    else:
        cnt[s] = [1, idx]
        idx += 1
        
nums = [[i, j] for i, j in cnt.items()]
nums.sort(key=lambda x:(-x[1][0], x[1][1]))
res = []
for i, j in nums:
    res += [i]*j[0]
    
print(*res)
728x90
반응형
728x90
반응형

BOJ 1059 좋은 구간

문제

정수 집합 S가 주어졌을때, 다음 조건을 만족하는 구간 [A, B]를 좋은 구간이라고 한다.

1. A와 B는 양의 정수이고, A < B를 만족한다.
2. A ≤ x ≤ B를 만족하는 모든 정수 x가 집합 S에 속하지 않는다.

집합 S와 n이 주어졌을 때, n을 포함하는 좋은 구간의 개수를 구해보자.

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

입력

첫째 줄에 집합 S의 크기 L이 주어진다. 

둘째 줄에는 집합에 포함된 정수가 주어진다. 

셋째 줄에는 n이 주어진다.

출력

첫째 줄에 n을 포함하는 좋은 구간의 개수를 출력한다.

제한

* 1 ≤ L ≤ 50
* 집합 S에는 중복되는 정수가 없다.
* 집합 S에 포함된 모든 정수는 1보다 크거나 같고, 1,000보다 작거나 같다.
* 1 ≤ n ≤ (집합 S에서 가장 큰 정수)

예제 입력 1

4
1 7 14 10
2

예제 출력 1

4

예제 입력 2

5
4 8 13 24 30
10

예제 출력 2

5

예제 입력 3

5
10 20 30 40 50
30

예제 출력 3

0

예제 입력 4

8
3 7 12 18 25 100 33 1000
59

예제 출력 4

1065

풀이

l = int(input())
arr = list(map(int, input().split()))
n = int(input())
arr.insert(0, 0)  
arr.sort()

if n in arr: 
    print(0)
else:
    for i in range(l):
        if arr[i] < n < arr[i + 1]:  
            res = (n - arr[i]) * (arr[i + 1] - n) - 1
            print(res)
            break
728x90
반응형
728x90
반응형

BOJ 18310 안테나

문제

일직선 상의 마을에 여러 채의 집이 위치해 있다. 

이중에서 특정 위치의 집에 특별히 한 개의 안테나를 설치하기로 결정했다. 

효율성을 위해 안테나로부터 모든 집까지의 거리의 총 합이 최소가 되도록 설치하려고 한다.

이 때 안테나는 집이 위치한 곳에만 설치할 수 있고, 논리적으로 동일한 위치에 여러 개의 집이 존재하는 것이 가능하다.

집들의 위치 값이 주어질 때, 안테나를 설치할 위치를 선택하는 프로그램을 작성하시오.

예를 들어 N=4이고, 각 위치가 1, 5, 7, 9일 때를 가정하자.

출처 - 백준 온라인 저지

이 경우 5의 위치에 설치했을 때, 안테나로부터 모든 집까지의 거리의 총 합이 (4+0+2+4)=10으로, 최소가 된다.

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

입력

첫째 줄에 집의 수 N이 자연수로 주어진다. (1≤N≤200,000) 

둘째 줄에 N채의 집에 위치가 공백을 기준으로 구분되어 1이상 100,000이하의 자연수로 주어진다.

출력

첫째 줄에 안테나를 설치할 위치의 값을 출력한다. 

단, 안테나를 설치할 수 있는 위치 값으로 여러 개의 값이 도출될 경우 가장 작은 값을 출력한다.

예제 입력 1

4
5 1 7 9

예제 출력 1

5

풀이

import sys

input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split(' ')))

arr.sort()
print(arr[(n-1)//2])
728x90
반응형
728x90
반응형

BOJ 16212 정열적인 정렬

문제

형준이는 수열을 하나 가지고 있다. 

형준이는 수열을 정열적으로 정렬해보려 한다. 과연, 정렬할 수 있을까?

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

입력

첫째 줄에는 수열의 길이 N (1 ≤ N ≤ 500,000)이 주어진다.

둘째 줄에는 수열의 각 원소 ai가 공백을 사이에 두고 차례대로 주어진다.

ai의 절댓값은 200만 이하이다.

출력

수열 a를 오름차순으로 정렬해서, 공백을 사이에 두고 하나씩 차곡차곡 출력하자.

서브태스크 1 (10점)

정렬하려 하는 배열의 길이 N이 N ≤ 1,000을 만족한다.

서브태스크 2 (15점)

문제에 제시된 조건 이외의 다른 제약은 없다.

예제 입력 1

6
14 5 8 7 1 10

예제 출력 1

1 5 7 8 10 14

힌트

언어별로 정렬 함수를 구글에 검색해보자~~

예를 들면 C++에서는 sort(arr, arr+n);와 같이, Python에서는 arr.sort() 와 같이 배열 arr을 정렬할 수 있다.

풀이

import sys

input = sys.stdin.readline
n = int(input())
a = list(map(int, input().strip().split()))
a.sort()

for i in a:
    print(i, end=' ')
728x90
반응형
728x90
반응형

BOJ 11536 줄 세우기

문제

악독한 코치 주혁은 선수들을 이름 순으로 세우는 것을 좋아한다.

더 악독한 것은 어떤 순서로 서야할지도 알려주지 않았다! 

선수들의 이름이 주어질 때 어떤 순서로 이루어져있는지 확인해보자.

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

입력

첫째 줄에 N개의 이름이 주어진다. (2 ≤ N ≤ 20)

다음 N개의 줄에는 각 선수들의 이름이 주어진다.

이름은 2 이상 12 이하의 대문자로만 이루어져있다. 

선수의 이름은 중복되지 않는다.

출력

이름이 증가하는 순으로 나타나면 INCREASING, 감소하는 순이면 DECREASING을 한 줄에 출력한다. 

만약 위의 두 경우가 아니라면 NEITHER를 출력한다.

예제 입력 1

5
JOE
BOB
ANDY
AL
ADAM

예제 출력 1

DECREASING

예제 입력 2

11
HOPE
ALI
BECKY
JULIE
MEGHAN
LAUREN
MORGAN
CARLI
MEGAN
ALEX
TOBIN

예제 출력 2

NEITHER

예제 입력 3

4
GEORGE
JOHN
PAUL
RINGO

예제 출력 3

INCREASING

풀이

n = int(input())
name = []

for i in range(n):
    name.append(str(input()))
    
if name==sorted(name, reverse=True):
    print('DECREASING')
elif name==sorted(name):
    print('INCREASING')
else:
    print('NEITHER')
728x90
반응형

+ Recent posts