728x90

https://programmers.co.kr/learn/courses/30/lessons/42586

 

출처 : 프로그래머스

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr


import math
def solution(progresses, speeds):
    answer = []
    result = []
    for i in range(len(progresses)):
        answer.append((math.ceil((100-progresses[i]) / speeds[i])))
        
    tmp = answer[0]
    cnt = 1
    for i in range(1,len(answer)):
        if tmp < answer[i]:
            result.append(cnt)
            cnt = 1
            tmp = answer[i]
        else:
            cnt += 1
    result.append(cnt)
    
    return result

풀이

math.ceil() 을 사용해 시간을 올림해줬다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

출처 : 프로그래머스


def solution(record):
    answer = []
    # userid : nickname 관리
    users = {}
    for records in record:
        rec = records.split()
        if len(rec) == 3:
            users[rec[1]] = rec[2]
            
    # 최종적으로 보게되는 메시지
    for records in record:
        rec = records.split()
        if rec[0] == 'Enter':
            answer.append(users[rec[1]] + "님이 들어왔습니다.")
        elif rec[0] == 'Leave':
            answer.append(users[rec[1]] + "님이 나갔습니다.")
            
    return answer

풀이

명령어가 입력될 때마다 메시지가 출력되는 것이 아니고, 최종적으로 모두 변경된 후 메시지를 출력해야 한다.

user id가 중복되는 사람의 닉네임도 바뀐 최종 users 딕셔너리를 관리해야 한다.

user id가 중복되는 사람의 닉네임은 딕셔너리 키값으로 value를 덮어씌워준다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/12941

 

출처 : 프로그래머스

 

코딩테스트 연습 - 최솟값 만들기

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱

programmers.co.kr

def solution(A,B):
    answer = 0
    A.sort()
    B.sort(reverse = True)
    print(A,B)
    for i in range(len(A)):
        answer += A[i]*B[i]       
    return answer

풀이

결국에는 A의 최소값과 B의 최대값을 계속 구해서 더해줘야 최종적으로 최소값이 나온다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/17682

출처 : 프로그래머스

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

def solution(dartResult):
    n = ''
    point = []
    for i in dartResult:
        if i.isdigit(): # 숫자면 n에 담기
            n += i
        if i == 'S': # S면 1제곱
            n = int(n) **1
            point.append(n)
            n = ''
        elif i == 'D': # D면 2제곱
            n = int(n) **2
            point.append(n)
            n = ''
        elif i == 'T': # T면 3제곱
            n = int(n) **3
            point.append(n)
            n = ''
        elif i == '*': # *(스타상)일때
            if len(point)>1:
                point[-2] *=2
                point[-1] *=2
            else: # 첫 번째 기회일 때
                point[-1] *=2
        elif i == '#': # #(아차상)일때
            point[-1] *=(-1)
    return sum(point)

풀이 1

dartResult 배열을 돌면서 숫자는 따로 관리해주고,

점수 또한 직전의 점수를 활용해야 할 부분이 있어서 배열로 관리해줬다.

 

S, D, T 가 나오면 각각 조건에 맞게 1, 2, 3씩 제곱해준다.

스타 상일 때는 point 배열이 1개일 때,

즉, 이번에 추가된 점수가 첫 번째 기회일 때만 현재 추가한 점수에 *2를 해주고

point 배열이 2이상부터는 추가된 점수와 직전의 점수에 각각 2를 곱해서 더해준다.

 

import re


def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}
    option = {'' : 1, '*' : 2, '#' : -1}
    p = re.compile('(\d+)([SDT])([*#]?)')
    dart = p.findall(dartResult)
    for i in range(len(dart)):
        if dart[i][2] == '*' and i > 0:
            dart[i-1] *= 2
        dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]

    answer = sum(dart)
    return answer

풀이 2

다른 사람 풀이다..

정규식을 활용한 풀이이다.

이렇게 보니 정규식으로 풀라고 낸 문제같다^^..

728x90

https://programmers.co.kr/learn/courses/30/lessons/12921

출처 : 프로그래머스

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

import math
def solution(n):
    answer = 0
    arr = [False,False] + [True]*n
    for i in range(2, int(math.sqrt(n))+1):
        if arr[i]:
            j = 2
            while i*j<=n:
                arr[i*j] = False
                j+=1
    for i in range(2, n+1):
        if arr[i]:
            answer+= 1
    return answer
def solution(n):
    num=set(range(2,n+1))

    for i in range(2,n+1):
        if i in num:
            num-=set(range(2*i,n+1,i))
    return len(num)

풀이

에라토스테네스의 체로 풀이해야한다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/17681

출처 : 프로그래머스

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

def solution(n, arr1, arr2):
    answer = []
    tmp1 = []
    tmp2 = []
    
    # arr1 수를 이진수로 바꾸기
    for i in range(len(arr1)):
        tmp = ''
        while True:
            if arr1[i]==0:
                while len(tmp)!=n:
                    tmp+='0'
                tmp1.append(tmp[::-1])
                break
            tmp += str(arr1[i]%2)
            arr1[i]//=2
            
    # arr2 수를 이진수로 바꾸기
    for i in range(len(arr2)):
        tmp = ''
        while True:
            if arr2[i]==0:
                while len(tmp)!=n:
                    tmp+='0'
                tmp2.append(tmp[::-1])
                break
            tmp += str(arr2[i]%2)
            arr2[i]//=2

    for i in range(n):
        tmp = ''
        for j in range(n):
            if tmp1[i][j] == '1' or tmp2[i][j] == '1':
                tmp += '#'
            else:
                tmp += ' '
        answer.append(tmp)
                
    return answer

 

풀이 1

10진수를 2진수로 만드는 방법을 10진수를 계속 2로 나눠줘서 나머지를 구하는 방식으로 했다.

거의 빡구현이다.

계속 반복문이 반복되는 부분을 느꼈지만, 일단 풀어봤다.

 

다른 사람들의 풀이를 보고 너무 짧아서 놀랐다.

 

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        arr = str(bin(i|j))[2:] # 둘 중에 하나라도 있으면 (비트 연산..)
        arr = arr.rjust(n,'0') # 0으로 채워주기
        arr = arr.replace('1','#')
        arr = arr.replace('0',' ')
        answer.append(arr)
    return answer

풀이 2

python 내장 함수를 사용하는 풀이다.

arr = str(bin(i|j))[2:] # 둘 중에 하나라도 있으면 (비트 연산..)
arr = arr.rjust(n,'0') # 0으로 채워주기

bin () 함수는 10진수를 2진수로 변환해주는 함수이다.

bin(n) 을 출력해보면 0b01001처럼 앞에 '0b' 가 붙어서 나온다.

이는 문제에서 쓸모없으니 슬라이싱해준다.

 

rjust() 함수는 rjust(자릿수, 채워줄 값)의 옵션을 갖고 있다.

오른쪽 정렬을 하고 자릿수까지 남는 값을 채워줄 값으로 채워주는 함수다.

 

bin으로 10진수를 2진수로 바꾸고 남는 앞자리 수는 모두 0으로 채워줘야 하는데, 

이를 rjust() 함수로 해결한 것이다.

 

그리고 arr1, arr2를 zip으로 묶어줬다.

또한, arr1과 arr2에서 하나라도 벽이면 벽이다. 이는 비트 연산 | 을 이용했다.

 

728x90

https://programmers.co.kr/learn/courses/30/lessons/12940

 

코딩테스트 연습 - 최대공약수와 최소공배수

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의

programmers.co.kr

출처 : 프로그래머스


def gcd(a,b):
    if a<b:
        a,b = b,a
    while b!=0:
        a,b = b, a%b
    return a

def solution(n, m):
    answer = []
    answer.append(gcd(n,m))
    answer.append(n*m//gcd(n,m))
    return answer

풀이

유클리드 호제법 알고리즘이다.

최대공약수는 math.gcd(n,m) 으로 구할 수도 있다.

최소공배수는 n*m//gcd(n,m) -> 즉, 두 수의 곱에 두 수의 최대공약수를 곱한 값과 같다.

+ Recent posts