코딩한걸음
728x90
반응형

코딩 테스트 문제풀이의 목표

  • 코딩 테스트 문제풀이를 하며 알고리즘에 대한 이해도를 높힌다
  • 팀원들과 코드 리뷰를 하며 해당 코드를 짠 구체적인 이유를 제시한다
  • https://github.com/raoneli1013/codingtest

문제 1 : https://school.programmers.co.kr/learn/courses/30/lessons/132267

 

# https://school.programmers.co.kr/learn/courses/30/lessons/132267
# 콜라 문제

# 문제 설명
# 오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.

# 정답은 아무에게도 말하지 마세요.

# 콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 
# 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?

# 단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.

# 문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다.
# 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서
# 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 
# 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서
# 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 
# 1병을 또 받을 수 있습니다. 이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 
# 콜라를 받을 수 있습니다.

# 콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 
# 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 
# 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 
# return 하도록 solution 함수를 작성해주세요.

# 제한사항
# 1 ≤ b < a ≤ n ≤ 1,000,000
# 정답은 항상 int 범위를 넘지 않게 주어집니다.

a = 3
b = 2
n = 20

answer = 0
while n>=a:
    answer += (n//a)*b
    n = (n//a)*b + n%a
    print (answer)

# 반복문으로 풀기
def solution(a, b, n):
    answer = 0
    while n>=a:
        answer += (n//a)*b
        n = (n//a)*b + n%a
    return answer

# 일반화
# n병에서 처음 a병을 가져다주면 b병을 받음
# 재귀함수로 풀기
def bottle(n, a, b, sum=0):
    if n < a: return sum
    return bottle((n%a)+(n//a)*b, a, b, sum+(n//a)*b)

# 조금 더 일반화
# n - (a - b)*k < a 를 만족하는 k의 최소값을 구하면 됌
# k는 교환 횟수, k*b가 받는 총 병 수가 된다
# 정리하면
# k > (n-a)/(a-b) 를 만족하는 k의 최소값
# k = (n-a)//(a-b) + 1 이 됌

k = int((n-a)/(a-b)) + 1
answer = k*b
print(answer)

# 제출용 함수
def solution2(a, b, n):
    k = int((n-a)/(a-b)) + 1
    answer = k*b
    return answer

 

 

 


문제 2 : https://school.programmers.co.kr/learn/courses/30/lessons/131705

 

# https://school.programmers.co.kr/learn/courses/30/lessons/131705
# 삼총사

# 문제 설명
# 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 
# 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다.
# 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 
# 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 
# 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 
# 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 
# 방법으로 삼총사를 만들 수 있습니다.

# 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 
# 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록
# solution 함수를 완성하세요.

# 제한사항
# 3 ≤ number의 길이 ≤ 13
# -1,000 ≤ number의 각 원소 ≤ 1,000
# 서로 다른 학생의 정수 번호가 같을 수 있습니다.

number = [-2, 3, 0, 2, -5]


answer = 0
# itertools의 combinations로 3명 조합을 구하고
from itertools import combinations
for i in combinations(number, 3):
    # 각 조합의 합이 0이면 answer +1 씩 해주면 될 듯
    if sum(i) == 0 : answer+=1

print(answer)

# 제출용 함수
from itertools import combinations
def solution(number):
    answer = 0
    for i in combinations(number, 3):
        if sum(i) == 0 : answer+=1
    return answer

# 근데 솔직히 itertools쓰면 노잼임
# 그냥 한번 풀어보자

# 3명 combinations(조합)을 구하는 방법은 의외로 쉽다
# 대신 노가다가 있을 뿐
arr = []
for i in range(len(number)-2):
    for j in range(i+1,len(number)-1):
        for k in range(j+1,len(number)):
            # number[i],number[j],number[k]가 이제 3명 combinations가 된다
            # 이걸 모두 더했을 때 0 이 되면 answer +1
            if number[i]+number[j]+number[k] == 0: answer +=1
print(answer)

# 제출용 함수2
def solution(number):
    answer = 0
    for i in range(len(number)-2):
        for j in range(i+1,len(number)-1):
            for k in range(j+1,len(number)):
                if number[i]+number[j]+number[k] == 0: answer +=1
    return answer

 


문제 3 : https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

# https://school.programmers.co.kr/learn/courses/30/lessons/140108
# 문자열 나누기

# 문제 설명
# 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
# 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, 
# x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 
# 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
# s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 
# 남은 부분이 없다면 종료합니다.
# 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 
# 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
# 문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 
# 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

# 제한사항
# 1 ≤ s의 길이 ≤ 10,000
# s는 영어 소문자로만 이루어져 있습니다.

s = "aaabbaccccabba"
# result = 3

i = 0
answer = 0
while len(s)>i:
    if len(s[:i+1])==s[:i+1].count(s[0])*2:
        answer+=1
        s = s[i+1:]
        i = 0
    i += 1
if s: answer+=1
print(answer)

# 제출용 함수
def solution(s):
    i = 0
    answer = 0
    while len(s)>i:
        if len(s[:i+1])==s[:i+1].count(s[0])*2:
            answer+=1
            s = s[i+1:]
            i = 0
        i += 1
    if s: answer+=1
    return answer

 


문제 4 : https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

# https://school.programmers.co.kr/learn/courses/30/lessons/72410
# 신규 아이디 추천

# 문제 설명
# 다음은 카카오 아이디의 규칙입니다.

# 아이디의 길이는 3자 이상 15자 이하여야 합니다.
# 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
# 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

# "네오"는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다.
# 신규 유저가 입력한 아이디가 new_id 라고 한다면,

# 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
# 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
# 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
# 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
# 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
# 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
#      만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
# 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

new_id = "abcdefghijklmn.p"
# result = "bat.y.abcdefghi"

# 1단계
new_id = new_id.lower()

# 2단계
id = ''
for i in new_id:
    if i.isalpha() or i.isdigit() or i in ['-','_','.']:
        id += i

# 3단계
while True:
    id_org = id
    id = id.replace('..','.')
    if id == id_org : break

# 4단계
id = id.strip('.')

# 5단계
if not id: id+='a'

# 6단계
if len(id)>=16:
    id = id[:15].rstrip('.')

# 7단계
if len(id)<=2:
    id = id+id[-1]*(3-len(id))
answer = id
print(answer)

# 제출용 함수
def solution(new_id):
    new_id = new_id.lower()
    id = ''
    for i in new_id:
        if i.isalpha() or i.isdigit() or i in ['-','_','.']:
            id += i
    while True:
        id_org = id
        id = id.replace('..','.')
        if id == id_org : break
    id = id.strip('.')
    if not id: id+='a'
    if len(id)>=16:
        id = id[:15].rstrip('.')
    if len(id)<=2:
        id = id+id[-1]*(3-len(id))
    answer = id
    return answer

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!