[백준] 1259번 팰린드롬수

[백준] 1259번 팰린드롬수

출처: [백준] 1259번 팰린드롬수


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 10385 6386 5764 62.659%

문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. ‘radar’, ‘sees’는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.


입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.


출력

각 줄마다 주어진 수가 팰린드롬수면 ‘yes’, 아니면 ‘no’를 출력한다.


예제 입력 1

1
2
3
4
121
1231
12421
0

예제 출력 1

1
2
3
yes
no
yes

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline


def isPalindrome(value):
for i in range(len(value)):
if value[i] != value[len(value) - 1 - i]:
return 0
return 1


while True:
num = int(input())
if not num:
break
else:
arr = list(str(num))
if isPalindrome(arr):
print('yes')
else:
print('no')

[백준] 10798번 세로읽기

[백준] 10798번 세로읽기

출처: [백준] 10798번 세로읽기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 12502 6979 6023 57.758%

문제

아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.

이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.

1
2
3
4
5
A A B C D D
a f z z
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x

<그림 1>

한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.

심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.

그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.


입력

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.


출력

영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.


예제 입력 1

1
2
3
4
5
ABCDE
abcde
01234
FGHIJ
fghij

예제 출력 1

1
Aa0FfBb1GgCc2HhDd3IiEe4Jj

예제 입력 2

1
2
3
4
5
AABCDD
afzz
09121
a8EWg6
P5h3kx

예제 출력 2

1
Aa0aPAf985Bz1EhCz2W3D1gkD6x

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

input_string = [[0] * 15 for _ in range(5)]

for i in range(5):
temp = list(input().rstrip())
for j in range(len(temp)):
input_string[i][j] = temp[j]

for i in range(15):
for j in range(5):
if input_string[j][i] == 0:
continue
else:
print(input_string[j][i], end="")

소스코드

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

input = sys.stdin.readline

input_string = [list(input().rstrip()) for _ in range(5)]

for i in range(15):
for j in range(5):
if not input_string[j]:
continue
else:
print(input_string[j].pop(0), end="")

[백준] 1913번 달팽이

[백준] 1913번 달팽이

출처: [백준] 1913번 달팽이


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 6337 3430 2684 55.045%

문제

홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.

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

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.


입력

첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.


출력

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.


예제 입력 1

1
2
7
35

예제 출력 1

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

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

N = int(input())
M = int(input())

snail = [[0 for _ in range(N)] for _ in range(N)]

move = [(1, 0), (0, 1), (-1, 0), (0, -1)] # 하, 우, 상, 좌

cur_num = N ** 2
cur_x, cur_y = 0, 0
direction = 0
while cur_num > 0:
snail[cur_y][cur_x] = cur_num
ny, nx = move[direction]
dx = cur_x + nx
dy = cur_y + ny
if 0 > dx or dx >= N or 0 > dy or dy >= N or snail[dy][dx] != 0: # 갈 수 없는 곳만 (방문했던 곳X, 벽X)
direction = (direction + 1) % 4

ny, nx = move[direction]
cur_x += nx
cur_y += ny
cur_num -= 1

temp_x, temp_y = 0, 0
for i in range(N):
for j in range(N):
if snail[i][j] == M:
temp_x = j
temp_y = i
print(snail[i][j], end=" ")
print()
print(temp_y + 1, temp_x + 1)

[백준] 1138번 한 줄로 서기

[백준] 1138번 한 줄로 서기

출처: [백준] 1138번 한 줄로 서기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 6699 3604 3033 55.939%

문제

N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.

어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.

사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.

각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.


출력

첫째 줄에 줄을 선 순서대로 키를 출력한다.


예제 입력 1

1
2
4
2 1 1 0

예제 출력 1

1
4 2 1 3

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

N = int(input())

memo = list(map(int, input().split()))
result = [0 for _ in range(N)]
for i in range(N):
cnt = 0
for j in range(N):
if memo[i] == cnt and result[j] == 0:
result[j] = i + 1
break
elif result[j] == 0:
cnt += 1

print(*result)

[백준] 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=" ")