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()을 하면 딕셔너리 형태가 출력된다.

 

728x90

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

코드

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

풀이

sort()에서 key 값만 잘 활용하면 쉽게 풀 수 있다.

key값을 쌍으로 줄 때, (첫 번째 조건, 두 번째 조건) 기준으로 주면 된다.

728x90

출처 : https://www.hackerrank.com/challenges/the-pads/problem?isFullScreen=true" target="_blank" rel="noopener" data-mce-href="http:// https://www.hackerrank.com/challenges/the-pads/problem?isFullScreen=true">http:// https://www.hackerrank.com/challenges/the-pads/problem?isFullScreen=true 

 

The PADS | HackerRank

Query the name and abbreviated occupation for each person in OCCUPATIONS.

www.hackerrank.com

 

SELECT
    CONCAT (
        name
        , '(' 
        , SUBSTR(occupation, 1, 1)
        , ')'
    )
FROM
    occupations
ORDER BY
    name;

SELECT
    CONCAT(
        'There are a total of '
        , COUNT(occupation)
        , ' '
        , LOWER(occupation)
        , 's.'
    )
FROM
    occupations
GROUP BY
    occupation
ORDER BY 
    COUNT(occupation)
    , occupation

 

728x90

문제

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

입력

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

출력

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

코드

import sys
arr = []
for i in range(9):
    arr.append(int(sys.stdin.readline()))
sum_arr = sum(arr)
m1 = 0
m2 = 0

for i in range(8):
    for j in range(i+1,9):
        if sum_arr-(arr[i]+arr[j]) ==100:
            m1 = arr[i]
            m2 = arr[j]
arr.remove(m1)
arr.remove(m2)
arr.sort()
for i in arr:
    print(i)

풀이

일곱 난쟁이의 합은 무조건 100이다.

그러면 9명 중에 어떠한 2명만 제외하면 합이 100이 되어야 한다.

그 어떠한 2명을 찾아서 배열에서 제거하고 정렬한다.

+ Recent posts