def solution(lottos, win_nums):
answer = []
# 최저와 최고 순위번호를 6으로 할당한다.
max_win = 6
min_win = 6
# 하나씩 맞출 때마다 순위가 상승하지만 두개까지는 똑같은 6위이기에 아래와 같이 할당한다.
score = [1,2,3,4,5,6,6]
# for문으로 0부터 5 까지의 인덱스를 i에 할당.
for i in range(6):
# 만약 lottos[i]가 win_nums에 있는 번호라면
if lottos[i] in win_nums:
# 최저와 최고 순위번호를 1씩 차감한다.
min_win -= 1
max_win -= 1
# 만약 lottos[i]가 0이라면
elif lottos[i] == 0:
# 최고 순위 번호만 1씩 차감한다.
max_win -= 1
# max_win과 min_win에 해당하는 score의 인덱스 요소를 answer에 넣는다.
answer.append(score[max_win])
answer.append(score[min_win])
return answer
# 함수를 실행시켜 보자.
solution(lottos, win_nums)
# [3, 5]
다른 풀이
def solution(lottos, win_nums):
# rank라는 딕셔너리를 만든다
# rank에는 아래와 같은 key와 value값이 있다.
rank = {
0: 6,
1: 6,
2: 5,
3: 4,
4: 3,
5: 2,
6: 1
}
# lottos의 값 중 0인 값의 갯수를 카운팅한다
zero_count = lottos.count(0)
# 집합을 이용해 lottos와 win_nums를 교집합으로 같은 값만 빼내어 그 길이를 잰다.
correct_count = len(set(lottos) & set(win_nums))
# 위 예제에서 rank[correct_count + zero_count] -> rank[2 + 2] -> rank[4] = 3
# rank[correct_count] -> rank[2] = 5
# [3, 5]가 출력된다.
return [rank[correct_count + zero_count], rank[correct_count]]
나만의 카카오 성격 유형 검사지를 만들려고 합니다. 성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.
4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.
검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.
각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.
이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.
위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다. 하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.
-매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다. -동의나 비동의 선택지를 선택하면 2점을 얻습니다. -약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다. -모르겠음 선택지를 선택하면 점수를 얻지 않습니다.
검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ survey의 길이 ( = n) ≤ 1,000
survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다. -survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
choices의 길이 = survey의 길이
choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
1 ≤ choices의 원소 ≤ 7
survey = ["AN", "CF", "MJ", "RT", "NA"]
choices = [5, 3, 2, 7, 5]
# 이때 예상 리턴 값은 "TCMA" 입니다.
def solution(survey, choices):
# 최종 값을 넣을 변수를 만들어 줍니다.
answer = ''
# 각 성격유형 종류와 점수를 딕셔너리 타입으로 선언합니다.
score = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0,'M':0,'A':0,'N':0}
# choices의 길이만큼의 범위에서 for문을 사용하여 각 성격 유형마다 비교합니다.
for i in range(len(choices)):
first = survey[i][0] # sruvey의 i 인덱스의 문자의 첫 번째 알파벳입니다.
second = survey[i][1] # sruvey의 i 인덱스의 문자의 두 번째 알파벳입니다.
if choices[i] > 4:
score[second] += choices[i] -4
# if 문으로 choices[0]의 값은 5라고 가정
# 이 때 같은 survey[1]은 "AN" 질문이다.
# "AN" 질문에서 값이 4보다 높아지면 성격유형이 N쪽으로 기운다.
# 4 보다 1 큰 5이기 때문에 "AN" 질문에서 N 쪽으로 1점
# 이때 second는 survey[0][1] 즉, N이다
# score["N"]에 5(choices[0]) - 4 인 1을 더하여 저장한다.
elif choices[i] < 4:
score[first] += 4 - choices[i]
# if 문으로 choices[1]의 값은 3라고 가정
# 이 때 같은 survey[1]은 "CF" 질문이다.
# "CF" 질문에서 값이 4보다 작아지면 성격유형이 C쪽으로 기운다.
# 4 보다 1 작은 3이기 때문에 "CF" 질문에서 C 쪽으로 1점
# 이때 first는 survey[1][0] 즉, C이다
# score["c"]에 4 - 3(choices[1]) 인 1을 더하여 저장한다.
# for을 완료하면
# score = {'R': 0, 'T': 3, 'C': 1, 'F': 0, 'J': 0, 'M': 2, 'A': 1, 'N': 1}
# 위와 같은 score값이 나온다.
if score["R"] >= score["T"]:
answer += "R"
else:
answer += "T"
# score의 R과 T값을 비교하여 R이 T보다 같거나 크면
# answer에 R을 추가, 아니면 "T"를 추가한다.
# 값이 같을 땐 영어 순서대로 추가된다.
# 나머지 C와F, J와M, A와N도 같은 코드를 짜준다.
if score["C"] >= score["F"]:
answer += "C"
else:
answer += "F"
if score["J"] >= score["M"]:
answer += "J"
else:
answer += "M"
if score["A"] >= score["N"]:
answer += "A"
else:
answer += "N"
return answer
# 함수를 돌려보자
solution(survey, choices)
# 'TCMA'
다른 사람의 풀이
def solution(survey, choices):
# 성격 유형 문제와 값을 가진 딕셔너리 타입인 my_dict
my_dict = {"RT":0,"CF":0,"JM":0,"AN":0}
# zip을 사용하여 survey와 choices를 key와 value로 나눠 각각 A와 B에 할당
for A,B in zip(survey,choices):
# 만약 survey의 값이
# my_dict.keys() 즉, "RT","CF","JM","AN" 중에 없으면
if A not in my_dict.keys():
A = A[::-1] # A[::-1]을 이용해 뒤집어서 사용
my_dict[A] -= B-4 # my_dict의 A에 해당하는 value에 B - 4 빼기
else:
my_dict[A] += B-4 #survey의 값이 my_dict.keys()에 있으면 B - 4 더하기
# 위 for문을 돌리면 최종적으로
# my_dict = {'RT': 3, 'CF': -1, 'JM': 2, 'AN': 0} 가 출력된다.
result = "" # result를 선언
# for문으로 my_dict.keys()의 값을 하나하나 name으로 확인한다.
for name in my_dict.keys():
# 예를 들어 my_dict.keys()의 첫 요소인 'RT'를 사용하여
# my_dict['RT']의 값은 3 -> 0보다 큰 수 이므로
# result에 name 즉, 'RT'의 1번 인덱스 값인 T가 들어간다.
if my_dict[name] > 0:
result += name[1]
# 그 다음으로 my_dict.keys()의 첫 요소인 'CF'를 사용하여
# my_dict['CF']의 값은 -1 -> 0보다 작은 수 이므로
# result에 name 즉, 'CF'의 0번 인덱스 값인 C가 들어간다.
elif my_dict[name] < 0:
result += name[0]
# 위 경우 이외에 my_dict의 value 값이 0인 key값은
# name을 sorted로 정렬하여 맨 처음 값을 집어 넣는다.
else:
result += sorted(name)[0]
return result
고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다. 당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
모든 달은 28일까지 있다고 가정합니다.
다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.
첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.
오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
1 ≤ terms의 길이 ≤ 20
terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
1 ≤ privacies의 길이 ≤ 100
privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
2000 ≤ YYYY ≤ 2022
1 ≤ MM ≤ 12
MM이 한 자릿수인 경우 앞에 0이 붙습니다.
1 ≤ DD ≤ 28
DD가 한 자릿수인 경우 앞에 0이 붙습니다.
파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.
from datetime import datetime
from dateutil.relativedelta import relativedelta
today = "2022.05.19"
terms = ["A 6", "B 12", "C 3"]
privacies = ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
# 결과값은 [1,3]이 나와야한다.
def solution(today, terms, privacies):
today = datetime.strptime(today,'%Y.%m.%d')
terms_key = []
terms_items = []
for term in terms:
terms_key.append(term[0])
terms_items.append(term[2:])
terms_dict = dict(zip(terms_key,terms_items))
answer = []
for i in range(len(privacies)):
mon = int(terms_dict[privacies[i].split(' ')[1]])
pre = datetime.strptime(privacies[i].split(' ')[0],'%Y.%m.%d')
stop_day = pre + relativedelta(months=mon)
# print(f'계약날자 : {pre}')
# print(f'유효기간 : {mon}개월')
# print(f'종료 날짜 : {stop_day}')
if stop_day <= today:
# print('파기')
answer.append(i+1)
return answer
코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.
원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.
문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.
제한사항
1 ≤ cards1의 길이, cards2의 길이 ≤ 10
1 ≤ cards1[i]의 길이, cards2[i]의 길이 ≤ 10
cards1과 cards2에는 서로 다른 단어만 존재합니다.
2 ≤ goal의 길이 ≤ cards1의 길이 + cards2의 길이
1 ≤ goal[i]의 길이 ≤ 10
goal의 원소는 cards1과 cards2의 원소들로만 이루어져 있습니다.
cards1, cards2, goal의 문자열들은 모두 알파벳 소문자로만 이루어져 있습니다.
def solution(cards1, cards2, goal):
answer = []
# for문을 사용하여 goal리스트의 값을 하나하나 살펴 봅니다
for word in goal:
# 만약 word와 cards1의 첫번째 요소가 같다면
if word == cards1[0]:
# cards1의 첫번째 요소를 빼서 cards1의 마지막에 넣습니다.
cards1.append(cards1.pop(0))
# 그리고 answer에는 'Yes'를 넣습니다.
answer.append('Yes')
# 만약 word와 cards2의 첫번째 요소가 같다면
elif word == cards2[0]:
# cards2의 첫번째 요소를 빼서 cards2의 마지막에 넣습니다.
cards2.append(cards2.pop(0))
# 그리고 answer에는 'Yes'를 넣습니다.
answer.append('Yes')
# 만약 word가 cards1과 cards2의 첫번째요소와 모두 맞지 않다면
elif (word != cards1[0]) and (word != cards2[0]):
# answer에 'No'를 첫번째 요소로 집어 넣습니다.
answer.insert(0,'No')
# anwer의 첫번째 요소를 반환합니다.
return answer[0]
# 함수를 실행 합니다.
solution(cards1, cards2, goal)
# 'Yes'