🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
CS
백준-codeplus
기초1
201-자료구조1-연습

1. 단어뒤집기2 - 17413

python

1
"""
2
태그는 뒤집지 않고, 단어만 뒤집는 프로그램
3
4
📌 isalnum() : 문자열이 알파벳([a-zA-Z])과 숫자([0-9])로만 구성되었는지 확인하는 파이썬 문자열 메소드
5
📌 len() : 문자열의 길이 반환하는 함수,
6
(cf. 한글도 1로, 공백도 1로 처리함)
7
(cf. 리스트나 튜플 등에서는 그 안에 속한 값의 개수를 반환)
8
9
e.g.)
10
len( "한글과 공백" ) # 6
11
len( [ 11, 22, 33, 44, 55, 66 ] ) # 6
12
"""
13
import sys
14
15
# 입력받은 문자열을 리스트로 변환하여 처리
16
word = list(sys.stdin.readline().rstrip())
17
18
# 인덱스와 시작 위치 변수를 초기화
19
i = 0
20
start = 0
21
22
# 문자열의 끝까지 반복하며 처리
23
while i < len(word):
24
# 만약 현재 문자가 "<"이라면,
25
if word[i] == "<":
26
i += 1
27
# "<" 다음 문자부터 ">"를 찾을 때까지 인덱스를 증가
28
while word[i] != ">":
29
i += 1
30
# ">"를 찾으면 인덱스를 한 번 더 증가시켜서 ">"를 건너뜀
31
i += 1
32
33
# 현재 문자가 알파벳이나 숫자라면,
34
elif word[i].isalnum():
35
start = i
36
# 현재 문자부터 연속된 알파벳이나 숫자를 찾을 때까지 인덱스를 증가
37
while i < len(word) and word[i].isalnum():
38
i += 1
39
# 단어를 임시 변수에 저장하고 뒤집습니다.
40
temp = word[start:i]
41
temp.reverse()
42
# 원래 위치에 뒤집은 단어를 다시 저장합니다.
43
word[start:i] = temp
44
45
# 현재 문자가 특수 문자나 공백이라면,
46
else:
47
i += 1
48
49
# 리스트의 문자들을 합쳐서 출력합니다.
50
print("".join(word))

2. 쇠막대기 - 10799

python

1
"""
2
주어진 문자열에서 괄호 쌍(레이저)로 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램
3
스택을 이용하여서 레이저를 구분하여서 문제를 풀면 됨
4
5
💡 (1) 먼저 그림을 보면서 규칙을 찾아 보면 레이저가 나올때,
6
그 동안 여는괄호가 나온 만큼 스택에 추가됩니다.
7
8
💡 (2) 레이저가 아닐 경우에 닫는괄호가 나오면 결과값에 1개를 카운팅 해줘야 함
9
e.g. (()())
10
쇠 막대기 하나에 레이저가 2번 지나감.
11
이런 식으로 쇠 막대기 하나와 레이저가 2번 지나가게 되면,
12
만약 첫 번째 경우만 생각 해보면 쇠막대기는 2개가 나와야합니다.
13
하지만 두 번째의 경우가 말하는 것은 레이저가 아닌 닫는괄호가 나올 시에 1개를 카운팅 해주어서 3개가 됩
14
15
1. '('가 나타날 때마다 스택(Stack)에 push합니다.
16
17
2. ')'가 나타날 때, 스택(Stack)의 top이 '('인 경우 레이저가 있다는 의미이므로,
18
스택(Stack)에서 '('를 pop하고 스택(Stack)에 남아있는 '('의 개수를 정답에 더해줍니다.
19
20
3. ')'가 나타날 때, 스택(Stack)의 top이 '('가 아닌 경우,
21
닫는 괄호 ')'에 대응하는 여는 괄호가 없다는 의미이므로, 스택(Stack)에서 ')'를 pop하고 정답에 1을 더해줍니다.
22
"""
23
arr = input() # 입력으로 받은 문자열을 저장
24
25
stack = []
26
cntOfIronBar = 0
27
28
# 문자열의 각 문자를 처리
29
for i in range(len(arr)):
30
# 여는 괄호일 경우, 스택에 추가
31
if arr[i] == "(":
32
stack.append(arr[i])
33
# 닫는 괄호일 경우
34
else:
35
# 첫 번째 경우인 현재의 쇠막대기들을 카운팅
36
if arr[i - 1] == "(":
37
stack.pop()
38
cntOfIronBar += len(stack)
39
# 두 번째 경우인 나머지 부분을 세는 것
40
else:
41
stack.pop()
42
cntOfIronBar += 1
43
44
print(cntOfIronBar)

3. 오큰수 - 17298

python

1
"""
2
Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미
3
e.g.) A = [3, 5, 2, 7]인 경우
4
NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1
5
6
e.g.)
7
A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1
8
9
스택에 새로 들어오는 수가 top에 존재하는 수보다 크면 그 수는 오큰수가 된다.
10
오큰수를 구한 후 수열에서 오큰수가 존재하지 않는 숫자에 -1을 출력
11
값이 아니라 인덱스를 넣는다!!!
12
"""
13
N = int(input()) # 입력으로 정수 N을 받음
14
sequence = list(map(int, input().split())) # 정수들을 리스트로 입력받음
15
result = [0] * N # 결과를 저장할 리스트를 초기화
16
stack = [0] # 스택을 초기화하고, 첫 번째 원소의 인덱스를 스택에 넣음
17
18
# 1부터 N-1까지의 범위에서 순회
19
for i in range(1, N):
20
# 스택이 비어있으면 현재 원소를 스택에 추가
21
if not stack:
22
stack.append(i)
23
24
# 현재 원소가 스택의 가장 위에 있는 원소보다 큰 경우, => 오큰수
25
while stack and sequence[stack[-1]] < sequence[i]:
26
# 스택의 가장 위 원소와 매칭되는 값을 결과 리스트에 저장
27
result[stack.pop()] = sequence[i]
28
29
# 현재 원소의 인덱스를 스택에 추가
30
stack.append(i)
31
32
# 스택에 남은 인덱스들은 오큰수가 없으므로 -1로 처리
33
while stack:
34
result[stack.pop()] = -1
35
36
# 결과 리스트의 값을 문자열로 변환하여 출력
37
print(" ".join(map(str, result)))

4. 오등큰수 - 17299

python

1
"""
2
오등큰수는 등장 횟수가 가장 많은 수 중 가장 왼쪽의 수 입니다. 없는 경우 -1을 출력
3
"""
4
5
freq = [0] * 1000001 # 숫자 빈도수를 저장하는 리스트를 초기화
6
n = int(input()) # 숫자 개수 n을 입력받습니다.
7
a = list(map(int, input().split())) # 숫자들을 리스트로 입력받습니다.
8
ans = [0] * n # 결과를 저장할 리스트를 초기화
9
stack = [0] # 스택을 초기화하고, 첫 번째 원소의 인덱스를 스택에 넣습니다
10
11
# 입력된 숫자들의 빈도수를 계산하여 freq 리스트에 저장합니다
12
for i in range(n):
13
freq[a[i]] += 1
14
15
# 1부터 n까지 순회
16
for i in range(1, n):
17
# 스택이 비어있으면 현재 인덱스를 스택에 추가
18
if not stack:
19
stack.append(i)
20
21
# 현재 원소의 빈도수가 스택의 가장 위에 있는 원소의 빈도수보다 큰 경우
22
while stack and freq[a[stack[-1]]] < freq[a[i]]:
23
# 스택의 가장 위 원소와 매칭되는 값을 결과 리스트에 저장
24
ans[stack.pop()] = a[i]
25
26
# 현재 원소의 인덱스를 스택에 추가
27
stack.append(i)
28
29
# 스택에 남은 인덱스들은 빈도수에 따라 오른쪽에 더 큰 원소가 없는 경우이므로 처리
30
while stack:
31
ans[stack.pop()] = -1
32
33
# 결과 리스트의 값을 문자열로 변환하여 출력
34
print(" ".join(map(str, ans)))