[백준] 17413번 단어 뒤집기 2

[백준] 17413번 단어 뒤집기 2

출처: [백준] 17413번 단어 뒤집기 2


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 7264 3947 3069 55.317%

문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자(‘a‘-‘z‘), 숫자(‘0‘-‘9‘), 공백(‘ ‘), 특수 문자(‘<‘, ‘>‘)로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. <‘와 ‘>‘가 문자열에 있는 경우 번갈아가면서 등장하며, ‘<‘이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 ‘<‘로 시작해서 ‘>‘로 끝나는 길이가 3 이상인 부분 문자열이고, ‘<‘와 ‘>‘ 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.


입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.


출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.


예제 입력 1

1
baekjoon online judge

예제 출력 1

1
noojkeab enilno egduj

예제 입력 2

1
<open>tag<close>

예제 출력 2

1
<open>gat<close>

예제 입력 3

1
<ab cd>ef gh<ij kl>

예제 출력 3

1
<ab cd>fe hg<ij kl>

예제 입력 4

1
one1 two2 three3 4fourr 5five 6six

예제 출력 4

1
1eno 2owt 3eerht rruof4 evif5 xis6

예제 입력 5

1
<int><max>2147483647<long long><max>9223372036854775807

예제 출력 5

1
<int><max>7463847412<long long><max>7085774586302733229

예제 입력 6

1
<problem>17413<is hardest>problem ever<end>

예제 출력 6

1
<problem>31471<is hardest>melborp reve<end>

예제 입력 7

1
<   space   >space space space<    spa   c e>

예제 출력 7

1
<   space   >ecaps ecaps ecaps<    spa   c e>

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sys

input = sys.stdin.readline

input_string = list(input().rstrip())

temp_stack = []
result = []
flag = 0

for x in input_string:
if x == '<':
flag = 1
temp_stack.append(x)
elif x == '>':
flag = 0
temp_stack.append(x)
result += temp_stack
temp_stack = []
elif x == ' ':
temp_stack.append(x)
result += temp_stack
temp_stack = []
else:
if flag == 0:
temp_stack.insert(0, x)
elif flag:
temp_stack.append(x)

result += temp_stack

for x in result:
print(x, end='')

[백준] 2331번 반복수열

[백준] 2331번 반복수열

출처: [백준] 2331번 반복수열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 256 MB 9795 4407 3250 44.176%

문제

다음과 같이 정의된 수열이 있다.

  • D[1] = A
  • D[n] = D[n-1]의 각 자리의 숫자를 P번 곱한 수들의 합

예를 들어 A=57, P=2일 때, 수열 D는 {57, 74(=5^2+7^2=25+49), 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37, …}이 된다. 그 뒤에는 앞서 나온 수들(57부터가 아니라 58부터)이 반복된다.

이와 같은 수열을 계속 구하다 보면 언젠가 이와 같은 반복수열이 된다. 이때, 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 구하는 프로그램을 작성하시오. 위의 예에서는 {57, 74, 65, 61}의 네 개의 수가 남게 된다.


입력

첫째 줄에 A(1 ≤ A ≤ 9999), P(1 ≤ P ≤ 5)가 주어진다.


출력

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.


예제 입력 1

1
57 2

예제 출력 1

1
4

출처

-


알고리즘 분류


소스코드1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys

input = sys.stdin.readline

A, P = map(int, input().split())

stack = [A]
temp = 0
while 1:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P

if temp in stack:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P
break
else:
stack.append(temp)

print(stack.index(temp))

소스코드2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys

input = sys.stdin.readline

A, P = map(int, input().split())

stack = [A]
removed_stack = []

while stack:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P

if temp not in stack:
stack.append(temp)
else:
stack.append(temp)
if temp in removed_stack:
break
else:
removed_stack.append(temp)

print(len(set(stack) - set(removed_stack)))

[백준] 1051번 숫자 정사각형

[백준] 1051번 숫자 정사각형

출처: [백준] 1051번 숫자 정사각형


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 10235 3747 3173 37.528%

문제

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.


입력

첫째 줄에 N과 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 수가 주어진다.


출력

첫째 줄에 정답 정사각형의 크기를 출력한다.


예제 입력 1

1
2
3
4
3 5
42101
22100
22101

예제 출력 1

1
9

출처

  • 빠진 조건을 찾은 사람: adh0463
  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: jh05013

알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys

input = sys.stdin.readline

N, M = map(int, input().split())
rectangle = [list(map(int, input().rstrip())) for _ in range(N)]

max_edge = min(N, M)
result = 0
for i in range(N):
for j in range(M):
for k in range(max_edge):
if i + k < N and j + k < M:
if rectangle[i][j] == rectangle[i][j + k] == rectangle[i + k][j] == rectangle[i + k][j + k]:
result = max(result, (k + 1) ** 2)
print(result)

[백준] 3085번 사탕게임

[백준] 3085번 사탕게임

출처: [백준] 3085번 사탕게임


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 17749 5491 3869 30.534%

문제

상근이는 어렸을 적에 “봄보니 (Bomboni)” 게임을 즐겨했다.

가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.

사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)

다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.

사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.


출력

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.


예제 입력 1

1
2
3
4
3
CCP
CCP
PPC

예제 출력 1

1
3

예제 입력 2

1
2
3
4
5
4
PPPP
CYZY
CCPY
PPCC

예제 출력 2

1
4

예제 입력 3

1
2
3
4
5
6
5
YCPZY
CYZZP
CCPPP
YCYZC
CPPZZ

예제 출력 3

1
4

힌트

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.


출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys

input = sys.stdin.readline


def check(arr):
n = len(board)
answer = 1
for i in range(n):
cnt = 1
for j in range(1, n): # 열 순회하면서 연속 숫자 세기
if arr[i][j] == arr[i][j - 1]: # 이전것과 같으면 cnt+1
cnt += 1
else: # 이전 것과 다르면 cnt=1 초기화
cnt = 1
if cnt > answer:
answer = cnt

cnt = 1
for j in range(1, n): # 행 순회하면서 연속 숫자 세기
if arr[j][i] == arr[j - 1][i]: # 이전것과 같으면 cnt+1
cnt += 1
else: # 이전 것과 다르면 cnt=1 초기화
cnt = 1
if cnt > answer:
answer = cnt

return answer


N = int(input())
board = [list(input().rstrip()) for _ in range(N)]
result = 0

for i in range(N):
for j in range(N):
if j + 1 < N: # 열 체크
board[i][j], board[i][j + 1] = board[i][j + 1], board[i][j] # 인접 교환
temp = check(board)
if temp > result:
result = temp
board[i][j], board[i][j + 1] = board[i][j + 1], board[i][j] # 원복

if i + 1 < N: # 행 체크
board[i][j], board[i + 1][j] = board[i + 1][j], board[i][j] # 인접 교환
temp = check(board)
if temp > result:
result = temp
board[i][j], board[i + 1][j] = board[i + 1][j], board[i][j] # 원복

print(result)

[백준] 2693번 N번째 큰 수

[백준] 2693번 N번째 큰 수

출처: [백준] 2693번 N번째 큰 수


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 32 MB 3791 3044 2767 81.502%

문제

배열 A가 주어졌을 때, N번째 큰 값을 출력하는 프로그램을 작성하시오.

배열 A의 크기는 항상 10이고, 자연수만 가지고 있다. N은 항상 3이다.


입력

첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,000보다 작거나 같은 자연수이다.


출력

각 테스트 케이스에 대해 한 줄에 하나씩 배열 A에서 3번째 큰 값을 출력한다.


예제 입력 1

1
2
3
4
5
4
1 2 3 4 5 6 7 8 9 1000
338 304 619 95 343 496 489 116 98 127
931 240 986 894 826 640 965 833 136 138
940 955 364 188 133 254 501 122 768 408

예제 출력 1

1
2
3
4
8
489
931
768

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
import sys

input = sys.stdin.readline

T = int(input())

for _ in range(T):
arr = list(map(int, input().split()))
arr.sort(reverse=True)
print(arr[2])

[백준] 10973번 이전 순열

[백준] 10973번 이전 순열

출처: [백준] 10973번 이전 순열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 7635 4771 3960 64.780%

문제

1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 바로 이전에 오는 순열을 구하는 프로그램을 작성하시오.

사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.

N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

입력

첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.


출력

첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다.


예제 입력 1

1
2
4
1 2 3 4

예제 출력 1

1
-1

예제 입력 2

1
2
5
5 4 3 2 1

예제 출력 2

1
5 4 3 1 2

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import sys

input = sys.stdin.readline

N = int(input())
compare_list = list(map(int, input().split()))


i, j, k = [len(compare_list) - 1 for _ in range(3)] # 맨 뒤부터...
while i > 0 and compare_list[i - 1] <= compare_list[i]: # 맨 뒤부터 내림차순... 즉 오름차순일 경우
i -= 1

if not i: # 이전 순열이 없을 경우
print(-1)
exit(0)

while compare_list[i - 1] <= compare_list[j]:
j -= 1
compare_list[i - 1], compare_list[j] = compare_list[j], compare_list[i - 1]

while i < k:
compare_list[i], compare_list[k] = compare_list[k], compare_list[i]
i += 1
k -= 1

print(*compare_list)



------------메모리초과
import sys
from itertools import permutations

input = sys.stdin.readline

N = int(input())
compare_list = list(map(int, input().split()))
num_list = [i for i in range(1, N + 1)]

perm_list = list(permutations(num_list))
for i in range(len(perm_list)):
if list(perm_list[i]) == compare_list:
if i==0:
print(-1)
else:
for num in perm_list[i-1]:
print(num, end=" ")

[백준] 10972번 다음 순열

[백준] 10972번 다음 순열

출처: [백준] 10972번 다음 순열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 17068 7204 5176 43.001%

문제

1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 다음에 오는 순열을 구하는 프로그램을 작성하시오.

사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.

N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

입력

첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.


출력

첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.


예제 입력 1

1
2
4
1 2 3 4

예제 출력 1

1
1 2 4 3

예제 입력 2

1
2
5
5 4 3 2 1

예제 출력 2

1
-1

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys

input = sys.stdin.readline

N = int(input())
compare_list = list(map(int, input().split()))


i, j, k = [len(compare_list) - 1 for _ in range(3)] # 맨 뒤부터...
while i > 0 and compare_list[i - 1] >= compare_list[i]: # 맨 뒤부터 오름차순... 즉 내림차순일 경우
i -= 1

if not i: # 다음 순열이 없을 경우
print(-1)
exit(0)

while compare_list[i - 1] >= compare_list[j]:
j -= 1
compare_list[i - 1], compare_list[j] = compare_list[j], compare_list[i - 1]

while i < k:
compare_list[i], compare_list[k] = compare_list[k], compare_list[i]
i += 1
k -= 1

print(*compare_list)
[백준] 1292번 쉽게 푸는 문제

[백준] 1292번 쉽게 푸는 문제

출처: [백준] 1292번 쉽게 푸는 문제


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 10628 5891 5197 57.559%

문제

동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.

이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.

하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.


입력

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.


출력

첫 줄에 구간에 속하는 숫자의 합을 출력한다.


예제 입력 1

1
3 7

예제 출력 1

1
15

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys

input = sys.stdin.readline

A, B = map(int, input().split())

cur_value = 1
position = 1
result = 0

for i in range(A, B + 1):
while position < i:
cur_value += 1
position += cur_value
result += cur_value

print(result)

[백준] 1748번 수 이어 쓰기 1

[백준] 1748번 수 이어 쓰기 1

출처: [백준] 1748번 수 이어 쓰기 1


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.15 초 128 MB 12262 5639 4743 51.209%

문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

1234567891011121314151617181920212223…

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.


출력

첫째 줄에 새로운 수의 자릿수를 출력한다.


예제 입력 1

1
5

예제 출력 1

1
5

예제 입력 2

1
15

예제 출력 2

1
21

예제 입력 3

1
120

예제 출력 3

1
252

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
N = input()
exp = 0
result = 0
while exp < len(N) - 1:
result += 9 * (10 ** exp) * (exp + 1)
exp += 1
result += (int(N) - (10 ** (len(N) - 1)) + 1) * len(N)
print(result)


---------------
# 시간초과
N = int(input())
new_num = ""
for i in range(1, N + 1):
new_num += str(i)

print(len(new_num))

[백준] 11723번 집합

[백준] 11723번 집합

출처: [백준] 11723번 집합


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1.5 초 4 MB (하단 참고) 32627 10094 7070 30.218%

문제

비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.

  • add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
  • remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
  • check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
  • toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
  • all: S를 {1, 2, …, 20} 으로 바꾼다.
  • empty: S를 공집합으로 바꾼다.

입력

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.

둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.


출력

check 연산이 주어질때마다, 결과를 출력한다.


예제 입력 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
26
add 1
add 2
check 1
check 2
check 3
remove 2
check 1
check 2
toggle 3
check 1
check 2
check 3
check 4
all
check 10
check 20
toggle 10
remove 20
check 10
check 20
empty
check 1
toggle 1
check 1
toggle 1
check 1

예제 출력 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
1
0
1
0
1
0
1
0
1
1
0
0
0
1
0

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys

input = sys.stdin.readline

M = int(input())
S = set()

for _ in range(M):
comm = input().strip().split()

if comm[0] == 'add':
S.add(int(comm[1]))
elif comm[0] == 'remove':
S.discard(int(comm[1]))
elif comm[0] == 'check':
if int(comm[1]) in S:
print(1)
else:
print(0)
elif comm[0] == 'toggle':
if int(comm[1]) in S:
S.discard(int(comm[1]))
else:
S.add(int(comm[1]))
elif comm[0] == 'all':
S = set([i for i in range(1, 21)])
elif comm[0] == 'empty':
S = set()