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 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

+ Recent posts