PS/프로그래머스 82

수박수박수박수박수박수? (lv1)

문제 설명 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다. 제한 조건 n은 길이 10,000이하인 자연수입니다. 코드 def solution(n): watermelon = ''.join(['수박'] * (n//2)) last = '' if n % 2 == 0 else '수' return watermelon + last 나름 간결하게 짰다고 생각했으나... def water_melon(n): s = "수박" * n return s[:n] 문자열도 저렇게 곱셈 연산을 적용할 수 있는지 몰랐다. 그 외에는... 글쎄 내가 짠 코드보다 우위에 있는지는 잘 모..

소수 찾기 (lv1)

지금까지 소수를 찾는 문제는 제곱근까지 나눠보는 방법을 사용했다. 그러나 에라토스테네스의 체 라는 약 10배정도 빠른 알고리즘이 존재한다는 사실을 알아냈다. 에라토스테네스의 체 - 나무위키 (namu.wiki) 에라토스테네스의 체 - 나무위키 임의의 자연수 n에 대해 그 이하의 소수를 찾는 가장 간단하고 빠른[2] 방법이다. 예를 들어 1~100까지 숫자 중 소수를 찾는다 하자. 일단 1부터 100까지 숫자를 쭉 쓴다. 1234567891011121314151617181920212223 namu.wiki 코드 my def solution(n): answer = 0 for v in range(2,n+1): for divisor in range(2, int(v**0.5)+1): if v % divisor =..

문자열 다루기 기본 (lv1)

문제 설명 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. 제한 사항 s는 길이 1 이상, 길이 8 이하인 문자열입니다. 코드 def alpha_string46(s): return s.isdigit() and len(s) in (4, 6) isdigit이라는 메서드의 존재, 그리고 뒷부분인 len(s) in (4, 6) 모두 생각 못한 풀이이다. 숫자인지 확인할 때는 isdigit, 그리고 in 을 활용한 기법 모두 기억해두자...

문자열 내 p와 y의 개수 (lv1)

문제 설명 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다. 예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다. 제한사항 문자열 s의 길이 : 50 이하의 자연수 문자열 s는 알파벳으로만 이루어져 있습니다. 코드 def numPY(s): # 함수를 완성하세요 return s.lower().count('p') == s.lower().count('y') 난 Counter로 각 알파벳의 개수를 ..

같은 숫자는 싫어 (lv1)

문제 설명 배열 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보다 크거나 ..

[1차] 다트 게임 (lv1)

문제 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다. 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다. 다트 게임은 총 3번의 기회로 구성된다. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 ..

[1차] 비밀지도 (lv1)

문제 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다. 암호화된 배열은 지도의 각 가로줄에..

최소직사각형 (lv1)

명함을 가로 세로를 바꿔서 지갑에 넣을 수 있기 때문에, 지갑의 방향을 고정하고 카드의 방향만 바꿔가면서 최적의 지갑 크기를 계산하면 된다. 여기서 주목 해야할 부분은 지갑의 방향을 고정했다는 점인데, 즉 카드의 가로 세로 길이를 서로 바꿀 때 어느쪽에 더 큰 값을 넣을지 기준을 정해야한다는 뜻이다. 코드 before def solution(sizes): row = [] col = [] for card in sizes: if card[0] > card[1]: row.append(card[0]) col.append(card[1]) else : row.append(card[1]) col.append(card[0]) return max(row) * max(col) after def solution(sizes)..

약수의 개수와 덧셈 (lv1)

주어진 두 수 사이의 값들이 약수를 홀수개로 갖는지 짝수개로 갖는지 판단하는 문제이다. 따라서 먼저 약수의 개수를 구하고, 그 값이 짝수 인지 홀수 인지 판별하는 식으로 접근했다. 그러나 수학적으로 다음과 같은 명제가 존재한다. 약수(수학) - 나무위키 (namu.wiki) 약수(수학) - 나무위키 6, 10, 12, 14, 15, 18, 20, 21, 22, 24, 26, 28, 33, 34, 35, 36, 38, 39, 40, 44, 45, 46, 48, 50, 51, 52, 54, 55, 56, 57, 58, 62, 63, 65, 68, 69, 72, 74, 75, 76, 77, 80, 82, 85, 86, 87, 88, 91, 92, 93, 94, 95, 96, 98, 99, 100 (56개) n..