본문 바로가기

알고리즘풀이/프로그래머스

[2/10] 기출문제 풀이

👉 사용 언어 : 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