전체 글 168

콜라 문제

[문제] 문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.   콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 sol..

문자열 내 마음대로 정렬하기

[문제]문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다. [풀이]직접 for문이나 if문을 통해 구현해봐도 되고, 정렬함수의 key매개변수를 이용해도 된다. 나는 단어를 하나씩 꺼내와서 word[n]을 추출했고, 같을 시 사전 순으로 정렬해야 하니 word[n]에 기존 word를 연결했다. 그 뒤 정렬을 진행했고 앞의 word[n]를 제거한 문자열 리스트를 반환했다 def solution(strings, n): return list(map(la..

시저 암호

[문제] 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.  [풀이]아스키 코드를 이용해서 문제를 풀면 된다. A~Z 는 아스키 코드로 65 ~ 90a ~ z 는 아스키 코드로 97 ~ 122  ord 함수로 문자를 아스키 코드로 변환할 수 있으며, chr 함수로 아스키 코드를 문자로 변환할 수 있다. 문자가 문자를 나타내는 아스키 코드 범위 밖으로 나가지 않도록 작업을 해줘야 한다. (랩어라운드라고 한다)(ord(문자)..

삼총사

[문제]한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다. 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요...

이상한 문자 만들기

[문제] 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.  [풀이]split 함수로 공백을 기준으로 단어를 나눠보자. 여기서 단어 사이의 공백이 두 개 이상일 경우 하나를 제외한 나머지는 빈 문자열로 저장된다. 나눈 단어들을 하나씩 꺼내서 인덱스가 홀수인지 짝수인지에 따라 대소문자 처리를 해준다. 이를 편히 하기 위해 단어들을 꺼낼 때 enumerate를 사용한다. 대소문자 처리한 단어들을 join 함수로 빈문자열로 연결하고, 그런 단어들을 또 join함수로 처리하되 이번엔 공백으로 연결한다. def solution(s)..

3진법 뒤집기

[문제]자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.  [풀이]먼저 10진법에서 3진법으로 변환하는 과정을 살펴보자.123 ÷ 3 = 41 나머지 0         41 ÷ 3 = 13 나머지 2            13 ÷ 3 = 4 나머지 1         4 ÷ 3 = 1 나머지 1           1 ÷ 3 = 0 나머지 1 몫이 0이 되었다면 나머지 부분을 아래서 위로(역순으로) 읽어준다.123을 3진법으로 변환하면 11120이 된다. 이를 이용해서 n을 3진법으로 변환해준 뒤 문제서 요구한대로 뒤집어주면 되는데 뒤집을 필요없이 나머지를 구하는 과정에서 역순이 아닌 원래 순..

최대공약수와 최소공배수

[문제] 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다. [풀이]유클리드 호제법을 이용해서 문제를 풀어보자. 이는 최대공약수를 효율적으로 계산하는 알고리즘이다.a > b 일 때 a 와 b 의 최대공약수는  b 와  a % b 의 최대공약수와 같다.a % b 가 0이 될 때 b가 최대공약수가 된다. a 와 b 의 최대공약수와 최소공배수 사이에는 다음과 같은 관계가 성립한다.최소공배수 = a x b / 최대공약수이를 활용하여 최소공배수를 구해보자def..

행렬의 덧셈

[문제] 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.  [풀이]arr1 = [[1, 2], [2, 3]] arr2 = [[3, 4], [5, 6]] 두 배열(행렬)을 덧셈해서 [[4, 6], [7, 9]]를 만들어야 한다.1과 3을, 2와 4를, 2와 5를, 3과 6를 더해야 한다 zip을 이용해 풀어보자zip(arr1, arr2) 를 하면 다음과 같다. 1번 요소 ([1, 2], [3, 4])2번 요소 ([2, 3], [5 ,6])arr1[0] 과 arr2[0] 을 묶고, arr1[1] 과 arr2[1] 을 묶어주는 것이다. 요소 하나..

부족한 금액 계산하기

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

약수의 개수와 덧셈

[문제] 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.  [풀이]이 문제는 어떤 정수의 약수의 개수가 홀수인지 짝수인지 판별하는 방법만 알면 효율적으로 풀 수 있다.약수는 쌍으로 존재하는데, 제곱수의 경우 그 쌍이 자기 자신이다. 즉, 제곱수의 약수의 개수는 홀수개이다.이를 이용해 문제를 풀어보자 def solution(left, right): return sum(-n if (n**0.5).is_integer() else n for n in range(left, right+1))