👉 사용 언어 : PYTHON3
예상 대진표
✅ Solution
import math
def solution(n,a,b):
answer = 0
while math.ceil(a/2) != math.ceil(b/2):
a = math.ceil(a/2)
b = math.ceil(b/2)
answer += 1
return answer +1
👉 문제 설명 및 제한 사항
- 매개변수 : 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B
- N : 2^1이상 2^20 이하인 자연수 (2의 제곱수 > 부전승 고려 X)
- A, B : N 이하인 자연수 (A ≠ B)
- 리턴값 : 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return
- A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정
👉 아이디어
- n번 참가자가 이길 경우 다음 라운드에서는 ⌈n / 2⌉ 번 참가자가 된다.
- 따라서, 둘이 라운드에서 만나려면 두 참가자의 ⌈n / 2⌉ 값이 같아야 한다.
- (EX) 3번 - 4번 (모두 2)
- 둘의 ⌈n / 2⌉ 값이 같아지기 전까지 반복문을 돌리며 참가한 라운드 수를 카운트한다.
- 두 참가자가 만나는 라운드까지 카운트해야하므로 반환할 때, +1을 하여 값을 반환한다.
✅ 다른 사람 풀이 참고
def solution(n,a,b):
answer = 0
while a != b:
answer += 1
a, b = (a+1)//2, (b+1)//2
return answer
👉 깨달은 것 / 알게된 것
- ceil 함수를 사용하지 않고 +1을 한 후, // 를 사용하여 몫을 구함으로써 나눈 값을 올림한 값과 동일한 결과를 얻을 수 있다.
- a != b를 조건으로 하여 while문을 돌림으로써 두 참가자가 만나는 라운드까지 카운트할 수 있다.
- 정답 반환 시, +1 해줄 필요가 없어진다❗️
튜플
✅ Solution
def solution(s):
answer = []
list = s[1:-2].replace('{', '').split('},')
list.sort(key=len)
for i in range(len(list)):
for j in list[i].split(','):
j = int(j)
if j not in answer:
answer.append(j)
return answer
👉 문제 설명 및 제한 사항
- 튜플 : 셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음
- 중복 원소 가능
- 원소에 정해진 순서가 있으며, 순서가 다르면 서로 다른 튜플
- 원소 개수 : 유한
- 매개변수 : 특정 튜플을 표현하는 집합이 담긴 문자열 s
- 길이 : 5 이상 1,000,000 이하
- 숫자 (0으로 시작하는 경우 X)와 '{' , '}' , ',' 로만 이루어져 있다.
- 항상 중복되는 원소가 없는 튜플
- 리턴값 : s가 표현하는 튜플 을 담은 배열
- 튜플 원소 : 1 이상 100,000 이하 자연수
- 길이 : 1 이상 500 이하
- 테스트 케이스 예시

👉 아이디어
- 외부 { }를 벗겨내기 위해 문자열 슬라이싱 ([1:-2])를 사용한다.
- 내부 { }를 벗겨낸 (특정 튜플을 표현하는) 집합을 각각 문자열로 묶어서 배열에 저장한다.
- replace('{', '') 를 통해 내부 { 를 벗겨낸다.
- .split('},') 를 통해 내부 } 와 ,를 지운 후 저장한다.
- sort(key = len)를 사용하여 길이순으로 정렬한다.
- 정렬한 리스트에서 원소(내부 배열)를 하나씩 뽑아 ',' 를 기준으로 분리하여 정수로 변환 후, 정답 배열 에 없을 경우에만 추가한다.
- 이미 길이순으로 정렬했기 때문에 정답 배열에 없는 숫자만 추가하면, 각 내부 배열에서 1개씩만 순서대로 추가 하는 것과 같다.
- 결과적으로, 문자열 s가 표현하는 튜플을 담은 배열이 리턴값(= 정답 배열)이 된다.

✅ 다른 사람 풀이 참고
def solution(s):
s = Counter(re.findall('\d+', s))
return list(map(int, [k for k, v in sorted(s.items(), key=lambda x: x[1], reverse=True)]))
import re
from collections import Counter
- re.findall('\d+', s) : 주어진 문자열 s에서 숫자를 추출하는데, 이를 re.findall()을 사용하여 정규표현식 '\d+'에 매칭되는 모든 숫자를 찾아낸다. 여기서 '\d+' 는 하나 이상의 숫자를 의미한다.
- collections.Counter : 등장하는 요소들의 개수를 셀 때 유용한 클래스
- 위의 풀이에서는 re.findall()을 통해 얻은 숫자 리스트를 Counter에 넣어 각 숫자의 등장 횟수를 센다.
- 메뉴 리뉴얼 문제 해설 중 Counter 설명 참고 : https://mungchstudy.tistory.com/82
- sorted(s.items(), key=lambda x: x[1], reverse=True) : Counter 객체인 s의 items() 메서드를 사용하여 (숫자, 등장 횟수) 쌍을 리스트로 만들고, 등장 횟수를 기준으로 내림차순으로 정렬한다.
- map(int, ...) : 정렬된 숫자 - 등장 횟수 쌍의 리스트에서 숫자만을 선택하여 정수로 변환한다.
- list(...) : 위의 결과를 리스트로 변환하여 반환한다.
👉 겹치지 않는 숫자만 추가하여 정답 리스트를 만들 수도 있지만 위의 풀이처럼 등장 횟수가 가장 많은 숫자부터 리스트에 추가하는 방법도 있다. 리턴해야 할 튜플 리스트에서의 맨 마지막 원소는 s에서 모든 집합 안에 포함되어 있으므로 등장 횟수가 가장 많기 때문이다.
def solution(s):
answer = []
tuples = s[2:-2].split("},{") # 튜플 문자열 추출
tuples = [tuple(map(int, t.split(','))) for t in tuples] # 각 튜플 내의 원소들을 정수형으로 변환하여 리스트에 추가
tuples.sort(key=len) # 튜플의 길이를 기준으로 정렬
for t in tuples:
answer.extend(list(set(t) - set(answer))) # answer에 없는 원소만 추가
print(answer)
return answer
👉 깨달은 것 / 알게된 것
- sort를 사용할 때, key 매개변수를 통해 길이순, 크기순, 알파벳순 등 원하는 기준으로 정렬할 수 있다.
- 디폴트 : 크기순, 알파벳순
- 길이순 지정 방법 : key = len
- 그 밖의 정렬 예시
- my_list.sort(key=lambda x: x[1]) : 튜플의 두 번째 요소를 기준으로 정렬
- sort(key=lambda person: person.age) : 객체의 age 속성을 기준으로 정렬
- extend( ) : 배열과 배열을 합칠 때, 원소들끼리만 합쳐진 하나의 배열이 된다.
- append( ) : 배열 안에 배열이 들어간다.
list1 = [1, 3, 5, 7, 9]
list2 = [2, 4, 6, 8, 10]
list1.extend(list2)
# 결과 : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list1.append(list2)
# 결과 : [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글
| [2/18] Kakao Internship 기출문제 풀이 (0) | 2024.02.15 |
|---|---|
| 하노이의 탑 (2) | 2024.02.11 |
| [2/5] Kakao Internship 기출문제 풀이 (0) | 2024.02.03 |
| [2/2] Kakao Internship 기출문제 풀이 (0) | 2024.01.31 |
| 옹알이 (1) (2) | 2024.01.29 |