728x90

BOJ 2675 문자열 반복

문제

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 

즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. 

S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

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

입력

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

각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. 

S의 길이는 적어도 1이며, 20글자를 넘지 않는다.

출력

각 테스트 케이스에 대해 P를 출력한다.

예제 입력 1

2
3 ABC
5 /HTP

예제 출력 1

AAABBBCCC
/////HHHHHTTTTTPPPPP

풀이

t = int(input())

for _ in range(t):
    r, s = input().split()
    res = ''
    for i in s:
        res += int(r) * i
    print(res)
728x90
728x90

BOJ 1152 단어의 개수

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 

이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오.

단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

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

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 

이 문자열의 길이는 1,000,000을 넘지 않는다.

단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 

또한 문자열은 공백으로 시작하거나 끝날 수 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

예제 입력 1

The Curious Case of Benjamin Button

예제 출력 1

6

예제 입력 2

 The first character is a blank

예제 출력 2

6

예제 입력 3

The last character is a blank

예제 출력 3

6

풀이

a = input().split()

print(len(a))
728x90
728x90

BOJ 10809 알파벳 찾기

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 

각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

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

입력

첫째 줄에 단어 S가 주어진다. 

단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 

단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

예제 입력 1

baekjoon

예제 출력 1

1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

풀이

s = input()
alphabet = list(range(97, 123))

for i in alphabet:
    print(s.find(chr(i)), end=' ')
728x90
728x90

BOJ 8958 OX퀴즈

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다.

O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 

문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 

예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

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

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 

각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 

문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.

예제 입력 1

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력 1

10
9
7
55
30

풀이

import sys

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

for _ in range(n):
    ox = input()
    res = 0
    score = 1
    for i in ox:
        if i == 'O':
            res += score
            score += 1
        else:
            score = 1
    print(res)
728x90
728x90

BOJ 2828 사과 담기 게임

문제

상근이는 오락실에서 바구니를 옮기는 오래된 게임을 한다. 스크린은 N칸으로 나누어져 있다.

스크린의 아래쪽에는 M칸을 차지하는 바구니가 있다. 

(M<N) 플레이어는 게임을 하는 중에 바구니를 왼쪽이나 오른쪽으로 이동할 수 있다. 

하지만, 바구니는 스크린의 경계를 넘어가면 안 된다. 가장 처음에 바구니는 왼쪽 M칸을 차지하고 있다.

스크린의 위에서 사과 여러 개가 떨어진다. 

각 사과는 N칸중 한 칸의 상단에서 떨어지기 시작하며, 스크린의 바닥에 닿을때까지 직선으로 떨어진다. 

한 사과가 바닥에 닿는 즉시, 다른 사과가 떨어지기 시작한다.

바구니가 사과가 떨어지는 칸을 차지하고 있다면, 바구니는 그 사과가 바닥에 닿을 때, 사과를 담을 수 있다. 

상근이는 사과를 모두 담으려고 한다. 

이때, 바구니의 이동 거리의 최솟값을 구하는 프로그램을 작성하시오.

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

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M < N ≤ 10) 둘째 줄에 떨어지는 사과의 개수 J가 주어진다.

(1 ≤ J ≤ 20) 다음 J개 줄에는 사과가 떨어지는 위치가 순서대로 주어진다.

출력

모든 사과를 담기 위해서 바구니가 이동해야 하는 거리의 최솟값을 출력한다.

예제 입력 1 

5 1
3
1
5
3

예제 출력 1

6

예제 입력 2

5 2
3
1
5
3

예제 출력 2

4

풀이

n, m = map(int, input().split())
j = int(input())
apple = []
 
for _ in range(j):
    apple.append(int(input()))
 
res = 0
end = m     
start = 1   
 
for i in range(j):
    if(end >= apple[i] and start <= apple[i]):
        continue
    elif (end < apple[i]):
        res += apple[i] - end
        end = apple[i]
        start = apple[i] - (m - 1)
    elif (start > apple[i]):
        res += start - apple[i]
        start = apple[i]
        end = apple[i] + (m - 1)
 
print(res)
728x90
728x90

BOJ 19941 햄버거 분배

문제

기다란 벤치 모양의 식탁에 사람들과 햄버거가 아래와 같이 단위 간격으로 놓여 있다. 

사람들은 자신의 위치에서 거리가 $K$ 이하인 햄버거를 먹을 수 있다.
햄버거 사람 햄버거 사람 햄버거 사람 햄버거 햄버거 사람 사람 햄버거 사람
1 2 3 4 5 6 7 8 9 10 11 12
위의 상태에서 K = 1인 경우를 생각해보자. 

이 경우 모든 사람은 자신과 인접한 햄버거만 먹을 수 있다. 

10번의 위치에 있는 사람은 11번 위치에 있는 햄버거를 먹을 수 있다. 

이 경우 다음과 같이 최대 5명의 사람이 햄버거를 먹을 수 있다.

2번 위치에 있는 사람: 1번 위치에 있는 햄버거
4번 위치에 있는 사람: 5번 위치에 있는 햄버거
6번 위치에 있는 사람: 7번 위치에 있는 햄버거
9번 위치에 있는 사람: 8번 위치에 있는 햄버거
10번 위치에 있는 사람: 11번 위치에 있는 햄버거
12번 위치에 있는 사람: 먹을 수 있는 햄버거가 없음

K = 2인 경우에는 6명 모두가 햄버거를 먹을 수 있다.

2번 위치에 있는 사람: 1번 위치에 있는 햄버거
4번 위치에 있는 사람: 3번 위치에 있는 햄버거
6번 위치에 있는 사람: 5번 위치에 있는 햄버거
9번 위치에 있는 사람: 7번 위치에 있는 햄버거
10번 위치에 있는 사람: 8번 위치에 있는 햄버거
12번 위치에 있는 사람: 11번 위치에 있는 햄버거

식탁의 길이 N, 햄버거를 선택할 수 있는 거리 K, 사람과 햄버거의 위치가 주어졌을 때, 

햄버거를 먹을 수 있는 사람의 최대 수를 구하는 프로그램을 작성하시오.

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

입력

첫 줄에 두 정수 N과 K가 있다.

그리고 다음 줄에 사람과 햄버거의 위치가 문자 P(사람)와 H(햄버거)로 이루어지는 길이 N인 문자열로 주어진다.

출력

첫 줄에 햄버거를 먹을 수 있는 최대 사람 수를 나타낸다.

제한

 1 <= N <= 20,000
 1 <= K <= 10

예제 입력 1

20 1
HHPHPPHHPPHPPPHPHPHP

예제 출력 1

8

예제 입력 2

20 2
HHHHHPPPPPHPHPHPHHHP

예제 출력 2

7

풀이

import sys

input = sys.stdin.readline
n, k = map(int, input().split())
arr = list(input().rstrip())
res = 0

for i in range(n):
    if arr[i] == 'P':
        for j in range(i - k, i + k + 1):
            if -1 < j < n:
                if arr[j] == 'H':
                    arr[j] = '-'
                    res += 1
                    break

print(res)
728x90
728x90

BOJ 1072 게임

문제

김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 

형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 

누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시작했다. 

의심을 피했다고 생각한 형택이는 다시 게임을 켰다. 

그 때 형택이는 잠시 코딩을 하는 사이에 자신의 게임 실력이 눈에 띄게 향상된 것을 알았다.

이제 형택이는 앞으로의 모든 게임에서 지지 않는다. 

하지만, 형택이는 게임 기록을 삭제 할 수 없기 때문에, 자신의 못하던 예전 기록이 현재 자신의 엄청난 실력을 증명하지 못한다고 생각했다.

게임 기록은 다음과 같이 생겼다.

게임 횟수 : X
이긴 게임 : Y (Z%)
Z는 형택이의 승률이고, 소수점은 버린다. 예를 들어, X=53, Y=47이라면, Z=88이다.

X와 Y가 주어졌을 때, 형택이가 게임을 최소 몇 번 더 해야 Z가 변하는지 구하는 프로그램을 작성하시오.

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

입력

각 줄에 정수 X와 Y가 주어진다.

출력

첫째 줄에 형택이가 게임을 최소 몇 판 더 해야하는지 출력한다. 

만약 Z가 절대 변하지 않는다면 -1을 출력한다.

제한

1 ≤ X ≤ 1,000,000,000
0 ≤ Y ≤ X

예제 입력 1

10 8

예제 출력 1

1

예제 입력 2

100 80

예제 출력 2

6

예제 입력 3

47 47

예제 출력 3

-1

예제 입력 4

99000 0

예제 출력 4

1000

예제 입력 5

1000000000 470000000

예제 출력 5

19230770

풀이

import sys

input = sys.stdin.readline
x , y = map(int, input().rstrip().split())
z = (y * 100) // x
res = 0

if z >= 99:
    print(-1)
else:
    res = 0
    start = 1
    end = 1000000000

    while start <= end:
        mid = (start + end)//2
        if (y + mid) * 100 // (x + mid) > z:
            res = mid
            end = mid-1
        else:
            start = mid+1
    print(res)
728x90
728x90

BOJ 2012 등수 매기기

문제

2007년 KOI에 N명의 학생들이 참가하였다. 

경시일 전날인 예비소집일에, 모든 학생들은 자신이 N명 중에서 몇 등을 할 것인지 예상 등수를 적어서 제출하도록 하였다.

KOI 담당조교로 참가한 김진영 조교는 실수로 모든 학생의 프로그램을 날려 버렸다.

1등부터 N등까지 동석차 없이 등수를 매겨야 하는 김 조교는, 

어쩔 수 없이 각 사람이 제출한 예상 등수를 바탕으로 임의로 등수를 매기기로 했다.

자신의 등수를 A등으로 예상하였는데 실제 등수가 B등이 될 경우, 이 사람의 불만도는 A와 B의 차이 (|A - B|)로 수치화할 수 있다.

당신은 N명의 사람들의 불만도의 총 합을 최소로 하면서, 학생들의 등수를 매기려고 한다.

각 사람의 예상 등수가 주어졌을 때, 김 조교를 도와 이러한 불만도의 합을 최소로 하는 프로그램을 작성하시오.

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

입력

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

둘째 줄부터 N개의 줄에 걸쳐 각 사람의 예상 등수가 순서대로 주어진다.

예상 등수는 500,000 이하의 자연수이다.

출력

첫째 줄에 불만도의 합을 최소로 할 때, 그 불만도를 출력한다.

예제 입력 1 

5
1
5
3
1
2

예제 출력 1

3

풀이

import sys

input = sys.stdin.readline
n = int(input())
s = []
for i in range(n):
    s.append(int(input()))

s.sort()
res = 0
for i in range(1, n + 1):
    res += abs(i - s[i - 1])
print(res)
728x90

+ Recent posts