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
import re
def solution(new_id):
    # 아이디 제한 - 3~15길이, 소문자 숫자 - _ . 문자 사용 가능, 마침표(.)는 처음과 끝, 연속 사용 불가능
    answer = ''

    # 1번 : 대문자 -> 소문자
    one = new_id.lower()
    
    # 2번 : 소문자, 숫자, -, _, . 제외 문자 제거
    condition = '[^a-z0-9-_.]'
    two = re.sub(condition, '', one)
    
    # 3번 : .. -> .
    three = two
    while True:
        if '..' in three:
            three = three.replace('..', '.')
        else:
            break
    
    # 4번 : 첫 번째 or 마지막에 . 제거
    four = three
    if three[0] == '.':
        four = four[1:]
    if three[-1] =='.':
        four = four[:-1]

    # 5번 : 빈 문자열은 a 입력
    five = four
    if len(four)==0:
        five = 'a'
    
    # 6번 : 문자열 길이가 16이상이면, 앞의 15개 제외 뒤에 제거
    six = five
    if len(five)>=16:
        six = five[:15]
        # 맨 뒤에 . 있으면 제거
        if six[-1] == '.':
            six = six[:-1]
    
    # 7번 : 문자열 길이가 2 이하면, 문자열의 마지막 문자를 길이가 3이 될 때까지 붙이기
    seven = six
    if len(six)<=2:
        while True:
            word = six[-1]
            seven += word
            if len(seven)==3:
                break
    
    answer = seven
    return answer

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

 

프로그래머스

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

programmers.co.kr

 

queue1 = [1,2,1,2]
queue2 = [1,10,1,2]
from collections import deque
answer = 0
p1 = deque(queue1)
p2 = deque(queue2)
sum1 = sum(p1)
sum2 = sum(p2)

while True:
    if sum1 == sum2:
        break
    else:
        answer += 1
        if sum1 > sum2:
            e1 = p1.popleft()
            p2.append(e1)
            sum1 -= e1
            sum2 += e1
        else:
            e2 = p2.popleft()
            p1.append(e2)
            sum2 -= e2
            sum1 += e2
    if len(queue1)*3 < answer:
        answer = -1
        break
print(answer)
def divStr(p): # 문자열 u,v 분리
    leftCnt = 0
    rightCnt = 0
    
    for x in range(len(p)):
        if p[x]=='(':
            leftCnt += 1
        if p[x]==')':
            rightCnt += 1

        if leftCnt == rightCnt:
            return p[:x+1], p[x+1:] # u, v
    
def checkStr(u): # 올바른 괄호 문자열인지 체크
    stack = []
    for x in u:
        if x == '(':
            stack.append(x)
        else:
            if not stack:
                return False
            stack.pop()
    return True

def solution(p):
    answer = ''
    
    # 1번 - 빈 문자열이면 빈 문자열 반환
    if not p:
        return ""
        
    # 2번 - u, v으로 분리
    u, v = divStr(p)
    
    # 3번 - u가 올바른 문자열이면 v에 대해 1단계부터 수행
    # 수행한 결과 문자열을 u에 이어 붙이고 반환한다.
    if checkStr(u):
        return u + solution(v)
    else:
        # 4번 - u가 올바르지 않은 문자열인 경우
        # 4-1번 빈 문자열에 첫 번째 문자로 '(' 붙이기
        answer = '('
        
        # 4-2번 문자열 v에 대해 1단계부터 재귀적으로 수행하고 결과를 이어 붙이기
        answer += solution(v)
        
        # 4-3번 ')' 붙이기
        answer += ')'
        
        # 4-4번 u의 첫 번째 마지막 문자 제거, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙이기
        for x in u[1:len(u)-1]:
            if x == '(':
                answer += ')'
            else:
                answer += '('
        
    return answer
from itertools import combinations
from collections import Counter

def solution(orders, course): 
    # 코스요리 재구성 - 최소 2가지 이상 단품메뉴 + 최소 2명 이상이 시킨 메뉴, 인기 메뉴 
    answer = []
    for k in course:
        tmp = []
        for menu in orders:
            menuList = combinations(sorted(menu), k) # k개씩 오름차순 조합 만들기
            tmp += menuList
        cnt = Counter(tmp) # 만들어진 조합 리스트들 중에서, 각 원소들의 중복 수를 구해준다.
        
        # cnt.values() 조합의 개수를 출력 조합이 없고, 중복 개수가 1인 경우 출력 X
        if len(cnt) != 0 and max(cnt.values()) != 1:
            for x in cnt:
                if cnt[x] == max(cnt.values()):
                    answer.append(''.join(x))
    answer.sort()
    return answer
from collections import defaultdict
def solution(record):
    # 닉네임 변경 방법 - 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 모두 변경
    # 1. 채팅방을 나가고, 새로운 닉네임으로 들어온다.
    # 2. 채팅방에 입장한 상태에서, 닉네임을 변경한다.
    
    answer = []
    userDict = defaultdict(str)

    for x in range(len(record)):
        tmp = record[x].split(' ')
        opt = tmp[0]
        uid = tmp[1]
        if len(tmp) >2:
            nickname = tmp[2]
            userDict[uid] = nickname 
        if opt == 'Enter':
            answer.append(uid+'님이 들어왔습니다.')
        elif opt == 'Leave':
            answer.append(uid+'님이 나갔습니다.')
        elif opt == 'Change':
            # 이름 변경
            userDict[uid] = nickname
    
    for x in range(len(answer)):
        idx = answer[x].index('님')
        userList = answer[x][:idx]
        answer[x] = userDict[userList] + answer[x][idx:] 
    return answer
from collections import defaultdict
import math
def solution(fees, records): 
    # 주차요금 - 기본시간(분), 기본요금(원), 단위시간(분), 단위요금(원)  
    # 자동차입/출차내역 - 시간(시:분), 차량번호, 내역(입차or출차)
    # 차량 번호가 작은 자동차부터 청구 금액 출력
    answer = []
    timeDict = defaultdict(str)
    totalDict = defaultdict(int)
    
    # 차량 번호마다, 총 사용 시간을 구한다. - 출차내역이 없으면 23:59 출차
    for x in range(len(records)):
        tmp = records[x].split(' ')
        hour = tmp[0]
        carNum = tmp[1]
        opt = tmp[2]
        
        if opt == 'IN':
            timeDict[carNum] = hour
        else:
            resTime = 0
            inTime = timeDict[carNum]
            inHour = int(inTime[:2])
            inMinute = int(inTime[-2:])
            outHour = int(hour[:2])
            outMinute = int(hour[-2:])
            timeDict[carNum] = '' # 초기화
            
            # 출차 시간(분) 계산
            if outMinute < inMinute:
                resTime = (outHour - inHour - 1)*60
                resTime += (60 - inMinute) + outMinute
            else:
                resTime = (outHour - inHour)*60
                resTime += (outMinute - inMinute)
            # 차량 번호의 사용 시간 업데이트
            totalDict[carNum] = totalDict.get(carNum, 0) + resTime 

    # 출차 기록이 없는 차량 번호 23:59으로 계산
    for key, value in timeDict.items():
        if len(value) != 0:
            time = (59 - int(value[-2:])) + (23 - int(value[:2]))*60
            totalDict[key] = totalDict.get(key, 0) + time

    # 요금 계산
    for key, value in totalDict.items():
        if value <= fees[0]: # 시간이 넘지 않은 경우
            totalDict[key] = fees[1] # 기본 요금
        else:
            remain = fees[1] + math.ceil((value - fees[0]) / fees[2]) * fees[3]
            totalDict[key] = remain

    # 차량번호별 정렬
    sorted_dict = dict(sorted(totalDict.items()))

    for i in sorted_dict.values():
        answer.append(i)
    return answer
import math
def isPrime(num):
    if num == 1:
        return False
    for x in range(2, int(math.sqrt(num) + 1)):
        if num % x == 0:
            return False
    return True
def solution(n, k):
    answer = 0
    tmp = ''
    
    # k진법 계산
    while n!=0:
        tmp += str(n%k)
        n //=k
    tmp = tmp[::-1] # 거꾸로 뒤집기
    
    arr = tmp.split('0')
    
    for x in range(len(arr)):
        if len(arr[x]) != 0 and isPrime(int(arr[x])): 
            answer += 1
    return answer

+ Recent posts