1. 단어뒤집기2 - 17413
- 단어 뒤집기2 📚 https://www.acmicpc.net/problem/17413
python
1"""2태그는 뒤집지 않고, 단어만 뒤집는 프로그램34📌 isalnum() : 문자열이 알파벳([a-zA-Z])과 숫자([0-9])로만 구성되었는지 확인하는 파이썬 문자열 메소드5📌 len() : 문자열의 길이 반환하는 함수,6(cf. 한글도 1로, 공백도 1로 처리함)7(cf. 리스트나 튜플 등에서는 그 안에 속한 값의 개수를 반환)89e.g.)10len( "한글과 공백" ) # 611len( [ 11, 22, 33, 44, 55, 66 ] ) # 612"""13import sys1415# 입력받은 문자열을 리스트로 변환하여 처리16word = list(sys.stdin.readline().rstrip())1718# 인덱스와 시작 위치 변수를 초기화19i = 020start = 02122# 문자열의 끝까지 반복하며 처리23while i < len(word):24# 만약 현재 문자가 "<"이라면,25if word[i] == "<":26i += 127# "<" 다음 문자부터 ">"를 찾을 때까지 인덱스를 증가28while word[i] != ">":29i += 130# ">"를 찾으면 인덱스를 한 번 더 증가시켜서 ">"를 건너뜀31i += 13233# 현재 문자가 알파벳이나 숫자라면,34elif word[i].isalnum():35start = i36# 현재 문자부터 연속된 알파벳이나 숫자를 찾을 때까지 인덱스를 증가37while i < len(word) and word[i].isalnum():38i += 139# 단어를 임시 변수에 저장하고 뒤집습니다.40temp = word[start:i]41temp.reverse()42# 원래 위치에 뒤집은 단어를 다시 저장합니다.43word[start:i] = temp4445# 현재 문자가 특수 문자나 공백이라면,46else:47i += 14849# 리스트의 문자들을 합쳐서 출력합니다.50print("".join(word))
2. 쇠막대기 - 10799
python
1"""2주어진 문자열에서 괄호 쌍(레이저)로 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램3스택을 이용하여서 레이저를 구분하여서 문제를 풀면 됨45💡 (1) 먼저 그림을 보면서 규칙을 찾아 보면 레이저가 나올때,6그 동안 여는괄호가 나온 만큼 스택에 추가됩니다.78💡 (2) 레이저가 아닐 경우에 닫는괄호가 나오면 결과값에 1개를 카운팅 해줘야 함9e.g. (()())10쇠 막대기 하나에 레이저가 2번 지나감.11이런 식으로 쇠 막대기 하나와 레이저가 2번 지나가게 되면,12만약 첫 번째 경우만 생각 해보면 쇠막대기는 2개가 나와야합니다.13하지만 두 번째의 경우가 말하는 것은 레이저가 아닌 닫는괄호가 나올 시에 1개를 카운팅 해주어서 3개가 됩14151. '('가 나타날 때마다 스택(Stack)에 push합니다.16172. ')'가 나타날 때, 스택(Stack)의 top이 '('인 경우 레이저가 있다는 의미이므로,18스택(Stack)에서 '('를 pop하고 스택(Stack)에 남아있는 '('의 개수를 정답에 더해줍니다.19203. ')'가 나타날 때, 스택(Stack)의 top이 '('가 아닌 경우,21닫는 괄호 ')'에 대응하는 여는 괄호가 없다는 의미이므로, 스택(Stack)에서 ')'를 pop하고 정답에 1을 더해줍니다.22"""23arr = input() # 입력으로 받은 문자열을 저장2425stack = []26cntOfIronBar = 02728# 문자열의 각 문자를 처리29for i in range(len(arr)):30# 여는 괄호일 경우, 스택에 추가31if arr[i] == "(":32stack.append(arr[i])33# 닫는 괄호일 경우34else:35# 첫 번째 경우인 현재의 쇠막대기들을 카운팅36if arr[i - 1] == "(":37stack.pop()38cntOfIronBar += len(stack)39# 두 번째 경우인 나머지 부분을 세는 것40else:41stack.pop()42cntOfIronBar += 14344print(cntOfIronBar)
3. 오큰수 - 17298
python
1"""2Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미3e.g.) A = [3, 5, 2, 7]인 경우4NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -156e.g.)7A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -189스택에 새로 들어오는 수가 top에 존재하는 수보다 크면 그 수는 오큰수가 된다.10오큰수를 구한 후 수열에서 오큰수가 존재하지 않는 숫자에 -1을 출력11값이 아니라 인덱스를 넣는다!!!12"""13N = int(input()) # 입력으로 정수 N을 받음14sequence = list(map(int, input().split())) # 정수들을 리스트로 입력받음15result = [0] * N # 결과를 저장할 리스트를 초기화16stack = [0] # 스택을 초기화하고, 첫 번째 원소의 인덱스를 스택에 넣음1718# 1부터 N-1까지의 범위에서 순회19for i in range(1, N):20# 스택이 비어있으면 현재 원소를 스택에 추가21if not stack:22stack.append(i)2324# 현재 원소가 스택의 가장 위에 있는 원소보다 큰 경우, => 오큰수25while stack and sequence[stack[-1]] < sequence[i]:26# 스택의 가장 위 원소와 매칭되는 값을 결과 리스트에 저장27result[stack.pop()] = sequence[i]2829# 현재 원소의 인덱스를 스택에 추가30stack.append(i)3132# 스택에 남은 인덱스들은 오큰수가 없으므로 -1로 처리33while stack:34result[stack.pop()] = -13536# 결과 리스트의 값을 문자열로 변환하여 출력37print(" ".join(map(str, result)))
4. 오등큰수 - 17299
python
1"""2오등큰수는 등장 횟수가 가장 많은 수 중 가장 왼쪽의 수 입니다. 없는 경우 -1을 출력3"""45freq = [0] * 1000001 # 숫자 빈도수를 저장하는 리스트를 초기화6n = int(input()) # 숫자 개수 n을 입력받습니다.7a = list(map(int, input().split())) # 숫자들을 리스트로 입력받습니다.8ans = [0] * n # 결과를 저장할 리스트를 초기화9stack = [0] # 스택을 초기화하고, 첫 번째 원소의 인덱스를 스택에 넣습니다1011# 입력된 숫자들의 빈도수를 계산하여 freq 리스트에 저장합니다12for i in range(n):13freq[a[i]] += 11415# 1부터 n까지 순회16for i in range(1, n):17# 스택이 비어있으면 현재 인덱스를 스택에 추가18if not stack:19stack.append(i)2021# 현재 원소의 빈도수가 스택의 가장 위에 있는 원소의 빈도수보다 큰 경우22while stack and freq[a[stack[-1]]] < freq[a[i]]:23# 스택의 가장 위 원소와 매칭되는 값을 결과 리스트에 저장24ans[stack.pop()] = a[i]2526# 현재 원소의 인덱스를 스택에 추가27stack.append(i)2829# 스택에 남은 인덱스들은 빈도수에 따라 오른쪽에 더 큰 원소가 없는 경우이므로 처리30while stack:31ans[stack.pop()] = -13233# 결과 리스트의 값을 문자열로 변환하여 출력34print(" ".join(map(str, ans)))