728x90

문제

한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다.

이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.

이 편집기가 지원하는 명령어는 다음과 같다.

LDBP $
커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)
삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임
$라는 문자를 커서 왼쪽에 추가함

초기에 편집기에 입력되어 있는 문자열이 주어지고, 그 이후 입력한 명령어가 차례로 주어졌을 때, 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램을 작성하시오. 단, 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 한다.

입력

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.

출력

첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.

코드

import sys
s = list(sys.stdin.readline().rstrip())
n = int(sys.stdin.readline())
cursor = len(s)
for i in range(n):
    orders = sys.stdin.readline().split()
    if orders[0] == "L":
        if cursor == 0:
            continue
        cursor -= 1
    elif orders[0] == "D":
        if cursor == len(s):
            continue
        cursor += 1
    elif orders[0] == "B":
        if cursor == 0:
            continue
        s.remove(s[cursor-1])
        cursor-=1
    elif orders[0] == "P":
        s.insert(cursor,orders[1])
        cursor+=1
print(''.join(s))

풀이

시간초과나서 다른 사람 풀이를 참고했다....

WOW 

나는 슈퍼 멍충이...공부하자

 

stack을 2개 사용했다.

커서 기준으로 커서 왼쪽 관련이면 입력받은 s1에서 해결, 오른쪽 관련이면 s2에서 해결한다.

 

  1. L이면 s1에 맨 위에 있는 것을 s2에 삽입
  2. D이면 s2에 맨 위에 있는 것을 s1에 삽입
  3. B이면 s1에 맨 위에 삭제
  4. P이면 s1에 입력 원소 삽입

 

이렇게 조건에 만족하면 s1+s2을 출력 시에 s2는 뒤집어서 출력해야한다.

list(reversed(s2)

다른 사람 코드

import sys
s1 = list(sys.stdin.readline().rstrip())
n = int(sys.stdin.readline())
s2 = []
for i in range(n):
    orders = sys.stdin.readline().split()
    if orders[0] == "L" and len(s1)!=0:
        s2.append(s1.pop())
    elif orders[0] == "D" and len(s2)!=0:
        s1.append(s2.pop())
    elif orders[0] == "B" and len(s1)!=0:
        s1.pop()
    elif orders[0] == "P":
        s1.append(orders[1])
print(''.join(s1+list(reversed(s2))))
728x90

문제

정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여덟 가지이다.

  • push_front X: 정수 X를 덱의 앞에 넣는다.
  • push_back X: 정수 X를 덱의 뒤에 넣는다.
  • pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 덱에 들어있는 정수의 개수를 출력한다.
  • empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
  • front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

코드

import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
q = deque()
for i in range(n):
    orders = input().split()

    if orders[0] == 'push_front':
        q.appendleft(orders[1])
    elif orders[0] == 'push_back':
        q.append(orders[1])
    elif orders[0] == 'pop_front':
        if len(q) == 0:
            print(-1)
        else:
            print(q.popleft())
    elif orders[0] == 'pop_back':
        if len(q) == 0:
            print(-1)
        else:
            print(q.pop())
    elif orders[0] == 'size':
        print(len(q))
    elif orders[0] == 'empty':
        if len(q) == 0:
            print(1)
        else:
            print(0)
    elif orders[0] == 'front':
        if len(q) == 0:
            print(-1)
        else:
            print(q[0])
    elif orders[0] == 'back':
        if len(q) == 0:
            print(-1)
        else:
            print(q[-1])

풀이

collections 의 deque를 사용했다.

deque는 첫 번째 원소를 제거할 때 popleft(), 마지막 원소를 제거할 때 pop()

첫 번째 인덱스에 원소 a 추가 할때 appendleft(a) , 마지막 인덱스에 원소를 삽입할 때 append(a)

728x90

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

코드

import sys
from collections import deque
n = int(input())
q = deque()
for i in range(n):
    orders = sys.stdin.readline().split()

    if orders[0] == 'push':
        q.append(orders[1])
    elif orders[0] == 'pop':
        if len(q) == 0:
            print(-1)
        else:
            print(q.popleft())
    elif orders[0] == 'size':
        print(len(q))
    elif orders[0] == 'empty':
        if len(q) == 0:
            print(1)
        else:
            print(0)
    elif orders[0] == 'front':
        if len(q) == 0:
            print(-1)
        else:
            print(q[0])
    elif orders[0] == 'back':
        if len(q) == 0:
            print(-1)
        else:
            print(q[-1])

풀이

sys 라이브러리로 입력받고 명령대로 수행한다.

python에서 큐는 리스트로도 가능하지만 collections에서 deque를 사용했다.

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1406 에디터 python (*)  (0) 2022.02.18
[백준] 10866 덱 python  (0) 2022.02.17
[백준] 10828 스택 python  (0) 2022.02.16
[백준] 10814 나이순 정렬 python  (0) 2022.02.15
[백준] 2529 부등호 python (*)  (0) 2022.02.15
728x90

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

코드

import sys
n = int(input())
stack = []

for i in range(n):
    orders = sys.stdin.readline().split()

    if orders[0]=='push':
        stack.append(orders[1])
    elif orders[0]=='pop':
        if len(stack)==0:
            print(-1)
        else:
            print(stack.pop())
    elif orders[0]=='size':
        print(len(stack))
    elif orders[0]=='empty':
        if len(stack)==0:
            print(1)
        else:
            print(0)
    elif orders[0]=='top':
        if len(stack)==0:
            print(-1)
        else:
            print(stack[-1])

풀이

python에서 stack은 리스트를 사용하면 된다.

sys 라이브러리를 사용해 입력받고 명령어에 따라 구현하면 된다.

728x90

문제

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

코드

n = int(input())
arr = []
for i in range(n):
    x,y = map(str,input().split())
    x = int(x)
    arr.append((x,y))
arr.sort(key = lambda a:a[0])
for i in arr:
    print(i[0],i[1])

풀이

sort 라이브러리 사용했다. 

728x90

문제

두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시된 부등호 순서열 A가 다음과 같다고 하자. 

A ⇒ < < < > < < > < >

부등호 기호 앞뒤에 넣을 수 있는 숫자는 0부터 9까지의 정수이며 선택된 숫자는 모두 달라야 한다. 아래는 부등호 순서열 A를 만족시키는 한 예이다. 

3 < 4 < 5 < 6 > 1 < 2 < 8 > 7 < 9 > 0

이 상황에서 부등호 기호를 제거한 뒤, 숫자를 모두 붙이면 하나의 수를 만들 수 있는데 이 수를 주어진 부등호 관계를 만족시키는 정수라고 한다. 그런데 주어진 부등호 관계를 만족하는 정수는 하나 이상 존재한다. 예를 들어 3456128790 뿐만 아니라 5689023174도 아래와 같이 부등호 관계 A를 만족시킨다. 

5 < 6 < 8 < 9 > 0 < 2 < 3 > 1 < 7 > 4

여러분은 제시된 k개의 부등호 순서를 만족하는 (k+1)자리의 정수 중에서 최댓값과 최솟값을 찾아야 한다. 앞서 설명한 대로 각 부등호의 앞뒤에 들어가는 숫자는 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }중에서 선택해야 하며 선택된 숫자는 모두 달라야 한다

입력

첫 줄에 부등호 문자의 개수를 나타내는 정수 k가 주어진다. 그 다음 줄에는 k개의 부등호 기호가 하나의 공백을 두고 한 줄에 모두 제시된다. k의 범위는 2 ≤ k ≤ 9 이다. 

출력

여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다. 

코드

k = int(input())
oper = input().split()
visited = [0]*10
r_max, r_min = "",""

def giveAnswer(op,i,j):
    if op==">":
        return i>j
    else:
        return i<j
    return

def dfs(cnt,s):
    global r_max,r_min
    if cnt==k+1:
        if len(r_min)==0:
            r_min = s
        else:
            r_max = s
        return
    for i in range(10):
        if not visited[i]:
            if cnt==0 or giveAnswer(oper[cnt-1],s[-1],str(i)):
                visited[i] = 1
                dfs(cnt+1, s+str(i))
                visited[i] = 0

dfs(0,"")
print(r_max)
print(r_min)

풀이

1) min, max 문자열 따로 

2) 0~9까지 숫자 중복되면 안되니까 방문 체크 visited 생각남

3) dfs 방식으로 재귀함수 사용하자.

4) 글자수가 k+1이면 종료해야 하니까 글자 수 관리

5) 입력받은 부등호랑 부등호 앞뒤로 넣을 숫자 비교해야 함 ( 부등호 조건 만족해야 함) -> 따로 관리 (함수 필요)

 

 

dfs(cnt, s) 재귀 함수를 사용하면 된다.

cnt가 0부터 k+1까지 문자열을 입력받는다.

0부터 시작하니까 처음 입력된 문자열이 최솟값, 맨 나중이 최댓값이다. ( 첫 번째가 9일 때까지 반복문 돌면 최댓값이다.)

 

 

문제를 보고 이러한 조건들을 만족해야 풀 수 있다고 생각이 들었고 풀 수 있을 줄 알았다^^..

ㅎㅇㅌ 더 열심히 하자~!~!~! ㅠㅠㅠㅠㅠㅠ 아 어려워....

728x90

문제

N개의 정수가 주어진다. 이때, N개의 정수를 오름차순으로 정렬하는 프로그램을 작성하시오. 같은 정수는 한 번만 출력한다.

입력

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다.

출력

첫째 줄에 수를 오름차순으로 정렬한 결과를 출력한다. 이때, 같은 수는 한 번만 출력한다.

코드

import sys
n = int(input())
arr = list(map(int,sys.stdin.readline().split()))
arr = list(set(arr))
arr.sort()
for i in arr:
    print(i,end=' ')

풀이

list을 set 으로 중복을 없애고 sort 라이브러리를 사용했다.

 

* set()을 하면 딕셔너리 형태가 출력된다.

 

+ Recent posts