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) -> 즉, 두 수의 곱에 두 수의 최대공약수를 곱한 값과 같다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/12926#

출처 : 프로그래머스

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr


def solution(s, n):
    s = list(s)
    for i in range(len(s)):
        if s[i].isupper(): # 대문자면
            s[i] = chr( (ord(s[i])-ord('A')+n) % 26 + ord('A'))
        elif s[i].islower() : # 소문자면
            s[i] = chr( (ord(s[i])-ord('a')+n) % 26 + ord('a'))
    return ''.join(s)

풀이

아스키코드를 활용한 파이썬 함수로 풀이했다.

이 부분은 아직 버벅이니 몇번더 풀어보자.

  • chr() :  아스키코드를 해당하는 문자열로 반환
  • ord() : 문자열에 해당하는 아스키코드 반환
728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을

programmers.co.kr


def solution(s):
    answer = ''
    i = 0 #각 단어 인덱스
    for ch in s:
        if ch == ' ': # 빈칸 체크
            answer += ch
            i = 0 # 빈칸이면 계속 단어 인덱스 0
        else: # 빈칸 아니면
            if i%2 == 0:
                answer += ch.upper()
            else:
                answer += ch.lower()
            i+= 1
    return answer
def solution(s):
    answer = ''
    for word in s.split(" "):
        n = ''
        for i in range(len(word)):
            if i%2 == 0:
                n += word[i].upper()
            else:
                n += word[i].lower()
        answer += (n+" ")
    return answer[:-1]

풀이

두 방법으로 풀었는데 비슷하다.

이 문제에서 주의할 점은 단어 사이의 공백이 하나만 있다는 것이 아니라는 점이다.

하나 이상의 공백을 갖고 있다.

그래서 모든 공백을 없애주고 하나의 공백으로만 문자열을 이어 붙이며 새로운 단어일 때 인덱스가 다시 0부터 시작하며 따져줘야 한다.

+ Recent posts