Q. 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

입출력 예

"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

 

def solution(s, n):
    answer = []
    for alp in s:
        if alp.isalpha():    #alp가 알파벳일 때
            if 65 <= ord(alp) <= 90:  # alp의 ASKII코드가 65~90사이일때,(대문자일때)
                if ord(alp)+n >90:    # n을 더한 값이 Z = 90 보다 크면
                    answer.append(chr(ord(alp)+n-26))  #한바퀴 돌아와야하기 때문에 알파벳의 갯수 26을 뺌
                else:
                    answer.append(chr(ord(alp)+n))
            else:                     # alp의 ASKII코드가 92~122사이일때,(소문자일때)
                if ord(alp)+n > 122:  
                    answer.append(chr(ord(alp)+n-26))
                else:
                    answer.append(chr(ord(alp)+n))
        else:
            answer.append(' ')        #공백은 ' '로 처리
            
    return ''.join(answer)

 

도무지 혼자 풀 수 없어서 다른 사람들의 풀이를 참고하여 새로운 함수 몇가지를 배우고 써봤다.

isalpha() : 알파벳인지 아닌지 구분 (T/F로 출력)

ord() : 알파벳을 ASKII코드로 변환  (대문자는 A~Z가 65~90, 소문자는 a~z가 97~122)

chr() : ASKII코드를 알파벳으로 변환

 

 

내가 알던 시저암호는 C = E(k , p) = (p + k)mod26  , 즉 알파벳의 갯수 26으로 나눈 나머지로 계산하는 거였는데 아스키코드로 바꿔서 연산하려니 나머지보다 빼기가 더 만만해보였다.

내일 다시 일어나서 %로 연산을 해보기로!

'Algorithm' 카테고리의 다른 글

programmers #다리를 지나는 트럭  (0) 2021.08.08
programmers #기능개발  (0) 2021.08.08
programmers #체육복(정답아님)  (0) 2021.08.07
programmers #예산  (0) 2021.08.07
programmers #2016년  (0) 2021.08.06

Q. 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

입출력 예

nlostreservereturn

5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

 

 

 

 

def solution(n, lost, reserve):
    cnt = n - len(lost)
    for i in lost:
        for j in reserve:
            if j == i-1 or j == i or j == i+1:
                cnt += 1
                reserve.remove(j)
                break
            elif j != i-1 and j != i and j != i+1:
                cnt += 0
    return cnt

딱 2개 테스트케이스에서 실패가 나는데 왜때문인지....체육복은 왜 훔쳐가는건지.....도둑놈들 망해라

'Algorithm' 카테고리의 다른 글

programmers #기능개발  (0) 2021.08.08
programmers #시저암호  (0) 2021.08.07
programmers #예산  (0) 2021.08.07
programmers #2016년  (0) 2021.08.06
programmers #완주하지 못한 선수  (0) 2021.08.05

Q. S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

입출력 예

dbudgetresult

[1,3,2,5,4] 9 3
[2,2,3,3] 10 4

 

 

def solution(d, budget):
    answer = 0    #예산을 받을 수 있는 부서의 수
    d.sort()      #최대한 많은 부서를 주어야하기 때문에 예산이 적은 부서들을 위주로 정렬
    sum = 0       #부서에게 지급될 예산의 합
    
    for i in d:   #루프를 돌려 각 부서들의 예산을 더해서 budget보다 작으면 루프 탈출
        if sum + i <= budget:  
            sum += i
            answer += 1
        else:
            break
    return answer

sum과 budget을 비교해서 처음 코드를 세웠는데 계속 몇 테스트케이스에서 에러가 났다. 그 이유는 문제를 제대로 안봐서..ㅎㅎ

'최대한 많은 부서' 라고 문제에 주어졌음에도 정렬을 하지 않았었다.

앞으로는 문제를 성심성의껏 읽기^^

 

 

 

다른 사람의 풀이

def solution(d, budget):
    d.sort()
    cnt = 0

    for i in d :
        budget -= i
        if budget < 0 :
               break
        cnt += 1
    return cnt

예산에서 부서들의 신청금액을 빼서 찾는 것도 괜찮은 방법이다! 거꾸로 연산 ㅇㅋㅇㅋ

 

 

 

def solution(d, budget):
    d.sort()
    while budget < sum(d):
        d.pop()
    return len(d)

pop은....흠...냐링...ㅎㅎㅎㅎㅎㅎㅎㅎㅎ 스택/큐 공부를 다시 한 후에 확인해보자!

'Algorithm' 카테고리의 다른 글

programmers #시저암호  (0) 2021.08.07
programmers #체육복(정답아님)  (0) 2021.08.07
programmers #2016년  (0) 2021.08.06
programmers #완주하지 못한 선수  (0) 2021.08.05
programmers #모의고사  (0) 2021.07.29

Q.

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각  SUN,MON,TUE,WED,THU,FRI,SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

 

제한 조건

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

입출력 예

abresult

5 24 "TUE"

 

 

 

def solution(a, b):
    day = ['FRI','SAT','SUN','MON','TUE','WED','THU']
    month = [31,29,31,30,31,30,31,31,30,31,30,31]
    total = []
    cnt,date = 0,0
    
    for i in range(0,12):
        cnt=sum(month[0:i])
        total.append(cnt)
        
    if a == 1:
        date = b
    else:
        date = total[a-1] + b
        
    i = date%7
    answer = day[i-1]
    return answer

왠지 이 문제에서 핵심은 a월b일을 수로 바꿨을때 몇일이 되냐였던 것 같다.

달마다 요일이 달랐고 if문을 12번 쓸수는 없어서 우선 리스트를 이용해서 월들의 누적합을 구하고싶었다.

 

for문을 이용해서 누적합을 total리스트에 추가했다. 그리고 그 누적합에 b일도 더해서 총 일수를 구했다.

요일은 7개가 반복되니까 일수를 7로 나눈 나머지를 idx로 day리스트에서 찾게끔 했다.

 

처음에는 문제보고 좀 막막할 줄 알았는데 제한시간보다 더 일찍풀려서 당황쓰;

 

def solution(a, b):
    day = ['THU','FRI','SAT','SUN','MON','TUE','WED']
    month = [0,31,29,31,30,31,30,31,31,30,31,30,31]
 
    return day[(sum(month[0:a]) + b)%7]

 

대단하신 분의 팁으로 변수들을 줄이고 효율성을 살려 3줄로 풀이를 끝냈다..

와...대박....신기..재밌다..와..

 

day의 인덱스와 일수의 합을 7로 나누었을 때의 나머지를 같게 하려고 day 리스트에서 THU를 가장 먼저 넣었다.

누적합에 + b일만 추가하면 되기 때문에 변수로 잡았던 cnt도 없앴고 return에 바로 원하는 값을 집어넣었다.

 

 

 

다음 공부할 함수

zip()

'Algorithm' 카테고리의 다른 글

programmers #체육복(정답아님)  (0) 2021.08.07
programmers #예산  (0) 2021.08.07
programmers #완주하지 못한 선수  (0) 2021.08.05
programmers #모의고사  (0) 2021.07.29
programmers #K번째수  (0) 2021.07.22

Q. 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

 

입출력 예

participantcompletionreturn

["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

 

 

 

def solution(participant, completion):
    participant.sort()
    completion.sort()
    num = len(completion)
    
    for idx in range(num):
        if participant[idx] != completion[idx]:
            return participant[idx]
    return participant[num]

처음에는 루프문을 돌려서 참가자 명단에 있는 요소를 완주자 리스트에서 뒤져보려고 했으나 분명 효율성이 똥일 될 것같았다. 시간 초과도 있으니...

sort함수를 이용해서 알파벳 순으로 배열을 하면 for문을 돌릴 때 시간이 단축되는 것을 힌트 삼아 쓰게 되었다.

(사실 쓰다보니 간결해져서 다른분의 풀이를 배낀 느낌..?)

 

return을 한번만 하니까 리스트 제일 마지막에 있는 선수는 찾지 못하길래 맨 마지막에 있는 선수를 못찾아서 return을 두번 쓰게 되었다리.

'Algorithm' 카테고리의 다른 글

programmers #예산  (0) 2021.08.07
programmers #2016년  (0) 2021.08.06
programmers #모의고사  (0) 2021.07.29
programmers #K번째수  (0) 2021.07.22
programmers #하샤드 수  (0) 2021.07.22

Q. 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

입출력 예

answersreturn

[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

 

 

def solution(answers):
    answer = []
    st1 = [1,2,3,4,5]     #수포자1,2,3의 찍기 규칙을 파악하고 리스트에 담기
    st2 = [2,1,2,3,2,4,2,5] 
    st3 = [3,3,1,1,2,2,4,4,5,5] 
    cnt1,cnt2,cnt3  = 0,0,0    #수포자들이 맞춘 점수를 셀 변수 cnt 
    
    for i in range (0, len(answers)):
        if answers[i] == st1[i%5]:   #문제(answers)의 길이만큼을 수포자들의 길이로 나눔
            cnt1 += 1        
        if answers[i] == st2[i%8]:
            cnt2 += 1  
        if answers[i] == st3[i%10]:
            cnt3 += 1    
            
    m = max(cnt1, cnt2, cnt3)   #max 함수를 써서 cnt 최댓값 비교
    if m == cnt1:
        answer.append(1)
    if m == cnt2:
        answer.append(2)
    if m == cnt3:
        answer.append(3)
        
    return answer

 

문제(answers)의 길이만큼(=편하게 문제의 갯수)을 수포자들의 찍는 규칙의 길이만큼으로 나누는 것을 생각했다.

수포자1을 예를 들면, [1,2,3,4,5]가 규칙적으로 찍어지기 때문에 6번 문제는 1로 7번 문제는 2... 이런식으로 찍게 될텐데 만약 문제의 갯수가 6이라면 6을 수포자1이 찍는 규칙의 길이 5로 나눈 나머지 1과 같고 수포자1은 규칙 첫번째에 해당하는 1번을 찍게 될 것이다. 그래서 문제의 갯수 len(answers)를 수포자 1의 규칙 5개로 나누어 비교하게끔 했다!!

 

알고리즘 스터디 출제 문제중에서 처음으로 맞추고 포스팅하는 문제가 있다니...감회가 새롭다.

 

'Algorithm' 카테고리의 다른 글

programmers #2016년  (0) 2021.08.06
programmers #완주하지 못한 선수  (0) 2021.08.05
programmers #K번째수  (0) 2021.07.22
programmers #하샤드 수  (0) 2021.07.22
programmers #핸드폰 번호 가리기도움말  (0) 2021.07.21

Q. 배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

입출력 예

arraycommandsreturn

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

 

 

 

def solution(array, commands):
    answer = []
    lst = []
    lst2 = []
    ks = []
    for x in range(0, len(commands)):
        i = commands[x][0]
        j = commands[x][1]
        k = commands[x][2]

        lst = array[i - 1:j]
        lst.sort()
        lst2.append(lst)

        ks.append(k)
        
    for i in range(0, len(lst2)):
        q = ks[i]
        answer.append(lst2[i][q-1])
        

    return answer

 

 

맨 처음 문제를 봤을 때는 아예 머릿속에서 문제 이해도 되지 않았다.. ㅠㅠ 결국 다음 날에 해결하게 되었는데 이것도 한시간은 걸려서 문제를 풀었네...아직 다차원리스트가 어색해서 그런지 자꾸 인덱스가 아웃 오브 레인지라고 하는데 환장하겄더라!! 계속 새로운 리스트에 담고담아야해서 리스트마다 확인을 하느라 풀이 속도가 느려졌다.

다차원 리스트 뷁

'Algorithm' 카테고리의 다른 글

programmers #완주하지 못한 선수  (0) 2021.08.05
programmers #모의고사  (0) 2021.07.29
programmers #하샤드 수  (0) 2021.07.22
programmers #핸드폰 번호 가리기도움말  (0) 2021.07.21
programmers #정수 제곱근 판별  (0) 2021.07.21

Q.

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

 

sol)

def solution(n):
    x=n
    a =[]
    while(n>0):
        a.append(n%10)
        n = n //10

    if x % sum(a) == 0:
        return True
    else:
        return False

 

 

 

def solution(n):
    a =[]
    while(n>0):
        a.append(n%10)
        n = n //10

    if x % sum(a) == 0:
        return True
    else:
        return False

맨 처음 오류가 났던 코드. while문을 돌리면 결론적으로 n=0이 되버리고 그렇게 나온 0을 if 문에 넣었으니 오류가 났다. (실수는 스터디 팀원분이 알려주셨음) 그래서 결국 x에 미리 n을 담아두어서 문제를 해결했다. 겁나 이렇게 얼탱이 없는 실수를 하다니...매일 알고리즘을 풀다보니 머리가 꼬여있는 가보다.....

 

'Algorithm' 카테고리의 다른 글

programmers #모의고사  (0) 2021.07.29
programmers #K번째수  (0) 2021.07.22
programmers #핸드폰 번호 가리기도움말  (0) 2021.07.21
programmers #정수 제곱근 판별  (0) 2021.07.21
programmers # 행렬의 덧셈  (0) 2021.07.20

Q. 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

입출력 예

phone_numberreturn

"01033334444" "*******4444"
"027778888" "*****8888"

 

 

def solution(phone_number):

    a = list(phone_number)
    for i in range(0, (len(a)-4)):
        a[i] = '*'
    
    return ''.join(a)

나름 잘했다고 생각했는데 ^^

 

def hide_numbers(s):
    return "*"*(len(s)-4) + s[-4:]

넘나 간단한것 ^^ ^^ ^^ ^^

처음에 슬라이싱 했을 때, 

a[0:-4]='*' 했더니 아예 싹다 '*' 한개로만 바꼈다..왜지?

 -> 왜냐하믄 0번방 부터 -4번방까지 통째로 *로 바꿔버려라 라고 해서란다!!!! 필요한 *의 갯수만큼 곱을 더 해줘야했을 듯

'Algorithm' 카테고리의 다른 글

programmers #K번째수  (0) 2021.07.22
programmers #하샤드 수  (0) 2021.07.22
programmers #정수 제곱근 판별  (0) 2021.07.21
programmers # 행렬의 덧셈  (0) 2021.07.20
programmers #정수 내림차순으로 배치하기  (0) 2021.07.20

Q. 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

 

입출력 예

nreturn

121 144
3 -1

 

통과 코드)

def solution(n): 
    for x in range(1, n+1):
        if n == x**2:
            return (x+1)**2
        
    return -1

 

 

def solution(n): 
    for x in range(1, n):
        if n == x**2:
            return (x+1)**2
        else:
        	return -1

맨 처음에 생각해냈던 코드이다. 여기서 에러가 난 이유는 else: return -1 때문!

만약 n = 121이더라도 if 밑에 else가 있기 때문에 121 == 1**2 부터 바로 if를 성립하지 않아 else로 넘어가서 -1을 출력했었다.

그래서 return -1은 아예 if 밖으로 ㄱㄱ

 

그리고 for x in range(1, n):

이 틀린 이유는 만약 n = 1 이라면 x와 비교가 되지 않기때문에 에러가 낫던 듯!

오늘도 열심히다! 기특하군

+ Recent posts