https://school.programmers.co.kr/learn/courses/30/lessons/17687

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 요약

- 사람들이 번갈아가면서 숫자를 하나씩 말하는 게임

- 숫자가 10 이상인 경우, 한 자리씩 끊어서 말한다. 

ex. 123 이면, 1, 2, 3 

- 특정 위치의 사람이 말해야 하는 숫자 순서대로 출력

 

입력 값

- 진법 n

- 미리 구할 숫자의 개수 t

- 게임 참여 인원 m

- 튜브 순서 p

 

풀이 방법

- 10진법 숫자를 n진법으로 변환하는 함수 구현 get_convert

- 출력 형식에서 10~15는 대문자 A~F 으로 출력해야 한다.

- 10진법 이상에서만 변환된다.

 

- 튜브가 말해야 하는 순서를 구해줘서 배열에 담는다.

- 0부터 최대 값까지 숫자를 변환해주고, 튜브가 말해야 하는 순서인 경우 출력 배열에 담아준다.

 

def get_convert(num, base):
    if num == 0:
        return 0
    
    temp = ''
    while num > 0:
        num, mod = divmod(num, base) # divmod 몫, 나머지
        if base > 10 and 10 <= mod <= 15: 
            temp += "ABCDEF"[mod % 10] # 10 ~ 15는 대문자 ABCDEF 변경
        else:
            temp += str(mod)
    return temp[::-1]

def solution(n, t, m, p): # 진법, 미리 구할 숫자의 개수, 게임 참여 인원, 튜브 순서
    answer = ''
    order = []
    numbers = []
    
    # 말해야 하는 숫자 순서
    for i in range(t):
        order.append(p+m*i)
    
    max_value = order[-1]
    idx = 1
    
    for i in range(max_value):
        change_num = str(get_convert(i, n)) # 바꾼 숫자
        
        for j in change_num:
            if idx in order:
                answer += j
            idx += 1    
    return answer

https://www.acmicpc.net/problem/2910

 

2910번: 빈도 정렬

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.

www.acmicpc.net

 

 

문제 풀이 

- dictionary에 등장 순서, 빈도수를 저장한다.

- 빈도수를 내림차순, 등장 순서를 오름차순으로 정렬

N, C = map(int, input().split())  # N개의 숫자, C보다 작다
num_list = list(map(int, input().split()))  # 메시지 수열
dict_info = {}  # [0] 등장 순서, [1] 빈도수
idx = 1
answer = ''

for num in num_list:
    if num in dict_info:
        dict_info[num][0] += 1
    else:
        dict_info[num] = [1, idx]
        idx += 1

sorted_num = sorted(dict_info.items(), key=lambda x: [-x[1][0], x[1][1]])

for key, value in sorted_num:
    answer += (str(key) + ' ') * value[0]

print(answer[:-1])

https://www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

 

문제 풀이

- 수열이 주어질 때, 값 들을 곱해서 최대 합을 구하기

- 2가지 수를 묶거나 묶지 않을 수 있다.

- 양수값과 음수값을 따로 구해서 곱해준다.

N = int(input())  # 수열의 크기
plus = []
minus = []
res = 0

for _ in range(N):
    num = int(input())
    if num > 1:
        plus.append(num)
    elif num == 1:
        res += 1
    else:
        minus.append(num)

plus.sort(reverse=True)
minus.sort()
plus_size, minus_size = len(plus), len(minus)

if len(plus) % 2 == 0:  # 양수 + 짝수 개수
    for idx in range(0, plus_size, 2):
        res += plus[idx] * plus[idx + 1]
else:  # 양수 + 홀수 개수
    res += plus[plus_size - 1]  # 마지막 값
    for idx in range(0, plus_size - 1, 2):
        res += plus[idx] * plus[idx + 1]

if len(minus) % 2 == 0:  # 음수 + 짝수 개수
    for idx in range(0, minus_size, 2):
        res += minus[idx] * minus[idx + 1]
else:  # 음수 + 홀수 개수
    res += minus[minus_size - 1]  # 마지막 값
    for idx in range(0, minus_size - 1, 2):
        res += minus[idx] * minus[idx + 1]

print(res)

https://www.acmicpc.net/problem/2170

 

2170번: 선 긋기

첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.

www.acmicpc.net

 

 

문제 풀이

- 두 가지 값이 주어지면 왼쪽에서 오른쪽으로 선을 그을 수 있다. 

- 중복되는 선은 제외하고 총 선의 길이를 구해준다.

- 선이 이어지는지 최대값과 비교하면서 확인한다.

- 다음 선으로 넘어가면서,  이전에 그었던 선의 (도착점의 최대위치-시작점의 최소 위치) 길이를 더해준다.

import sys

input = sys.stdin.readline
N = int(input())
lines = list(tuple(map(int, input().split())) for _ in range(N))
lines.sort()

left = lines[0][0]
right = lines[0][1]
total = 0

for idx in range(1, N):
    key, value = lines[idx]

    if key < right:
        right = max(value, right)
    else:
        total += right - left
        left, right = key, value

total += right - left
print(total)

https://www.acmicpc.net/problem/11501

 

11501번: 주식

입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타

www.acmicpc.net

 

문제

홍준이는 요즘 주식에 빠져있다. 그는 미래를 내다보는 눈이 뛰어나, 날 별로 주가를 예상하고 언제나 그게 맞아떨어진다. 매일 그는 아래 세 가지 중 한 행동을 한다.

  1. 주식 하나를 산다.
  2. 원하는 만큼 가지고 있는 주식을 판다.
  3. 아무것도 안한다.

홍준이는 미래를 예상하는 뛰어난 안목을 가졌지만, 어떻게 해야 자신이 최대 이익을 얻을 수 있는지 모른다. 따라서 당신에게 날 별로 주식의 가격을 알려주었을 때, 최대 이익이 얼마나 되는지 계산을 해달라고 부탁했다.

예를 들어 날 수가 3일이고 날 별로 주가가 10, 7, 6일 때, 주가가 계속 감소하므로 최대 이익은 0이 된다. 그러나 만약 날 별로 주가가 3, 5, 9일 때는 처음 두 날에 주식을 하나씩 사고, 마지막날 다 팔아 버리면 이익이 10이 된다.

 

 

문제 풀이

- 주식 가격의 리스트를 맨 뒤에서부터 반복해서 최대 가격과 비교해가면서 계산

- 최대 가격과 현재 가격의 차익을 더해준다.

tc = int(input())

for _ in range(tc):
    day = int(input())
    cost_list = list(map(int, input().split()))

    total = 0
    max_value = 0
    for idx in range(day - 1, -1, -1):
        if cost_list[idx] > max_value:
            max_value = cost_list[idx]
        else:
            total += max_value - cost_list[idx]
    print(total)

 

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

문제

- 세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

- 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

- 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

 

 

문제 풀이

- 최소 값으로 만들기 위해서는 '-' 값을 크게 만들어 주어야 한다.

- split으로 '-' 이 나오는 부분을 쪼개주고 뒤에 나오는 값들을 전부 합해준다.

num = input().split('-')
total = 0

for plus in num[0].split('+'):
    total += int(plus)

for minus in num[1:]:
    sub_sum = sum(map(int, minus.split('+')))
    total -= int(sub_sum)
print(total)

https://www.acmicpc.net/problem/9996

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

 

 

 

문제 풀이

- 패턴은 '*'을 기준으로 앞에와야 하는 문자열 + * + 뒤에와야 하는 문자열을 입력받는다.

- 앞에와야 하는 문자열은 ^으로, 뒤에와야 하는 문자열은 $으로 패턴을 만든다.

- 예시) a*d 일때 ad도 매치된다. 

import re

tc = int(input())
pattern = list(map(str, input().split('*')))
str_pattern = '^' + pattern[0] + '.*' + pattern[1] + '$'
# p = re.compile("^{0}.*{1}$".format(pattern[0], pattern[1]))
p = re.compile(str_pattern)

for _ in range(tc):
    word = input()
    m = p.search(word)
    if m:
        print("DA")
    else:
        print("NE")

https://www.acmicpc.net/problem/1543

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한

www.acmicpc.net

 

 

문제 풀이

- 문자열과 찾으려고 하는 단어를 입력받는다.

- 문자열에 중복 없이 찾으려고 하는 단어의 개수 구하기

- 정규식 findall 사용 : 정규식과 매치되는 모든 문자열을 리스트로 리턴한다.

 

 

예시

ababababa
aba

##### 정답
2

 

코드 

import re

word = input()
check = input()

p = re.compile(check)
m = p.findall(word)

print(len(m))

+ Recent posts