728x90

문제 설명

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.


제한사항
  • n은 1 이상 100,000,000 이하인 자연수입니다.

입출력 예nresult
45 7
125 229

입출력 예 설명

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45 1200 0021 7
  • 따라서 7을 return 해야 합니다.

 

<나의 풀이>

def solution(n):
    tmp = ''
    while n:
        tmp += str(n % 3)
        n = n // 3

    answer = int(tmp, 3)
    return answer
  • n // 3 -> n을 3으로 나눈 몫
  • n % 3 -> n을 3으로 나눈 나머지
  • n 을 나누고 나머지를 answer에 순서대로 넣음
  • 순서대로 넣으면 앞뒤 반전 한 것과 같음
  • n이 1이 될때까지 계속 나눔
  • int(n, base)를 통해 base진법을 10진법으로 변환

<다른 사람의 풀이>

def solution(n):
    answer = ''

    while n > 0:			
        n, re = divmod(n,3)	# n을 3으로 나눈 몫과 나머지
        answer += str(re)
    return int(answer, 3)

# divmod() : 몫과 나머지를 리턴합니다. 리턴 값이 2개이므로 튜플을 사용
# int(x, base) : base 진법으로 구성된 str 형식의 수를 10진법으로 변환해 줌
  • divmod()함수를 통해 몫과 나머지를 구할 수 있음 (2개의 값 리턴)

 

 

10진수 → n진수

int 같은 함수가 없기 때문에 코드작성이 필요하다

def solution(n, q):
    rev_base = ''

    while n > 0:
        n, mod = divmod(n, q)
        rev_base += str(mod)

    return rev_base[::-1] 
    # 역순인 진수를 뒤집어 줘야 원래 변환 하고자하는 base가 출력
    
print(solution(45, 3))

1200

728x90
728x90

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

예시

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

시간
2013-11-18 17:03:00

※ 컬럼 이름(위 예제에서는 "시간")은 일치하지 않아도 됩니다.

 

<풀이>

SELECT MAX(DATETIME) 
FROM ANIMAL_INS

DATETIME(보호 시작일)이 가장 최근인 동물의 보호 시작일이란, DATETIME의 값이 가장 큰 값을 가져오면 됩니다. 이 때 사용할 수 있는 게 바로 MAX 구문입니다.

 

MAX 구문

SELECT MAX(column_name) 
  FROM table_name
 WHERE condition;

MAX 구문의 문법은 위와 같습니다. 해당 구문은 선택한 컬럼에서 가장 큰 값을 가져옵니다.

728x90
728x90

문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

입출력 예arranswer
[1,1,3,3,0,1,1] [1,3,0,1]
[4,4,4,3,3] [4,3]

 

 

<풀이>

def solution(arr):
    b = []
    for i in range(len(arr)):
        if i == 0:
            b.append(arr[i])
        elif arr[i] != arr[i-1]:
            b.append(arr[i])

    return b

빈 배열 만들고 [0] 인덱스 넣어준 후 그 다음 숫자부터는 전 인덱스랑 비교해서 다르면 새 열에 넣어주기.

 

def solution(arr):
    a = []
    for i in arr:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

빈 배열를 만들어주고 거기에 비교해서 없으면 하나씩 넣어주기.

728x90
728x90

문제 설명

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

제한 사항
  • 두 수는 1이상 1000000이하의 자연수입니다.
입출력 예nmreturn
3 12 [3, 12]
2 5 [1, 10]
입출력 예 설명

입출력 예 #1
위의 설명과 같습니다.

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

<풀이1>

유클리드 호제법

: 최대공약수를 구하는 알고리즘

  • a와 b에 대해서(a<b) r=a%b이라고 하면, r==0이 될 때까지 b%r=r', r%r'을 했을 때 r'이 최대공약수이다.
  • 최소공배수: (a*b)/최대공약수
import math

def solution(n, m):
    # 최대 공약수 구하기
    for i in range(min(n, m), 0, -1):
        if (n % i == 0) and (m % i == 0):
            a = i
            break
    # 최소 공배수 구하기        
    for j in range(max(n, m), (n * m) + 1):
        if j % n == 0 and j % m == 0:
            b = j
            break
        
    return [a, b]

<풀이2>

def solution(n, m):
    a, b = sorted([n, m], reverse=True)
    r = 1
    while r > 0:
        r = a % b
        a, b = b, r
    answer = [a, n*m//a]
    return answer

<풀이3>

def solution(n, m):
    c, d = max(n, m), min(n, m)
    t = 1
    while t > 0:
        t = c % d
        c, d = d, t
    answer = [c, int(n*m/c)]

    return answer

<풀이4>

def solution(n, m):
    a = n
    b = m
    if n>m:
        n, m = m, n
    while m%n:
        r = m%n
        m = n
        n = r
    return [n, a*b/n]

풀이
1. a, b = n, m 중 최대 최소 값
2. (r = 나머지) r이 0일 때까지 : 유클리드 호제법
    - r = a%b
    - a, b = n, r
3. 두 수를 최대공약수로 나눈 값은 최소공배수
4. answer 리턴

 

 

 1. 유클리드 호제법

두 정수 ab의 최대공약수를 G(ab)라고 하자.

정수 abq r (b ≠ 0)에 대하여 a = bq + r,이면 G(ab) = G(br)가 성립한다.

〈증명〉
G(ab) = g라고 하자. 최대공약수의 성질에 의해 a = agb = bg이고 G(a′, b′) = 1이다.
a = bq + r로부터 r = a - bq = g(a′ - bq) 이고, g는 r의 약수이다.
G(br) = g임을 보이기 위해서는 G(b′, a′ - bq) = 1임을 보이면 된다.

귀류법을 적용하여 결론을 부정해보자.
어떤 정수 d가 존재하여 G(b′, a′ - bq) =d(≠ 1)라고 하면, b′ = dma′ - bq = dn라고 할 수 있고, a′ = bq + dndmq + dn = d(mq + n) 이므로 G(a′, b′) = 1라는 가정에 모순이다. 따라서 G(b′, a′ - bq) = 1이므로 G(bq) = g가 성립한다.

 

나머지 ( % )

>>> 10%3

1

>>> 5%3

2

728x90
728x90

문제 설명

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.


제한 조건
  • n과 m은 각각 1000 이하인 자연수입니다.

예시

입력

5 3

출력

*****
*****
*****

 

<나의 풀이>

a, b = map(int, input().strip().split(' '))
for i in range(b):            
    for j in range(a):        
        print('*', end='') 
    print()

입력값을 a, b 라 하면 , map으로 입력 받기
세로가 b 니까 겉 루프는 범위를 비로, 에이가 가로니까 안쪽 루프 범위는 에이로.
별 을 프린트 하되 끝은 띄어쓰기로 정해주기
바깥쪽 프린트는 빈 프린트를 넣어줘서 줄바꿈 하도록함.

 

<다른 사람의 풀이>

a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)

연산자로 초간단..

728x90
728x90

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예arr1arr2return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]
[[1],[2]] [[3],[4]] [[4],[6]]

 

<풀이>

def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[i])):
            arr1[i][j] += arr2[i][j]
    return arr1
def solution(arr1, arr2):

문제에서 원하는 결과를 넘겨주는 solution 함수를 만들어야 한다. 리스트 두 개가 주어지고 각 리스트의 같은 번쨰 수를 더한 리스트를 출력해 주면 된다.

for i in range(len(arr1)):

일단 반복해서 더해줘야 한다는 개념을 생각하면 for문을 사용하게 된다. for문을 통해 처음 받은 리스트의 길이만큼 반복을 실행해 준다. 2중 리스트를 쓰고 있으므로 리스트 안에 리스트가 몇 개가 있는지 확인하고 그 수 만큼 반복하는 것이다.

for j in range(len(arr[i])):

2중 리스트에서 2번째 리스트 값 만큼 반복을 해주기 위해 for 문을 만들어 준다.

arr1[i][j] += arr2[i][j]

각 자리수 별로 더해주고

return arr1

리턴을 해주면 끝이다.

프로그래머스에서는 answer로 리턴을 해줘야 하니까 answer에 담아서 제출하면 된다.

이해가 잘 가지 않는다면 아래 코드를 참고하자

def solution(arr1, arr2):

    for i in range(len(arr1)):
        print(i, ' i값')

        for j in range(len(arr1[i])):
            print(j, ' j값')
            arr1[i][j] += arr2[i][j]

    return arr1

print(solution([[1,2],[2,3]],[[3,4],[5,6]]))

이해를 돕기 위한 코드

0  i값
0  j값
1  j값
1  i값
0  j값
1  j값
[[4, 6], [7, 9]]

이해를 돕기 위한 코드의 출력값

728x90
728x90

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항
  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

입출력 예pricemoneycountresult
3 20 4 10
입출력 예 설명

입출력 예 #1
이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.

 

<나의 풀이>

def solution(price, money, count):

    for i in range(1,count+1):
        money -= price*i
    if money < 0:
        money = abs(money)
    else:
        money = 0 

    return money
  • money에서 count의 N배로 빼주어야 하므로 for문을 이용해 나타냈다.
  • money가 0보다 작을 경우, abs() 절댓값 함수를 사용해 부족한 금액을 양수로 바꿔준다.
  • money가 0보다 크거나 0일 경우, 부족한 금액이 없으므로 0으로 반환되어야 한다.

<다른사람의 풀이>

def solution(price, money, count):
    return max(0,price*(count+1)*count//2-money)
  • 산술 평균을 활용한 풀이법이다.
    • price X 1+price X 2+price X 3+price X 4+...
      = price(1+2+3+4+...)
      = price X (n(n+1)/2)
728x90
728x90

문제 설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항
  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.
  • s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예sreturn
"a234" false
"1234" true

 

<풀이>

def solution(s):
    if (len(s) == 4 or len(s) == 6) and s.isdigit():
        return True

    else:
        return False

isdigit을 통해 숫자인지 확인해주고 len(s)의 길이가 (4, 6)에 포함되는지 확인해주는 코드입니다.

 

<한줄 코딩>

def solution(s):
	return s.isdigit() and len(s) in (4,6)
728x90

+ Recent posts