공부 기록

Level 1 위주로 풀어보기 본문

다양한 분야 공부 기록/Python Coding Test

Level 1 위주로 풀어보기

kstar2 2025. 1. 30. 23:06

1. [PCCE 기출문제] 10번 / 공원

지민이가 가진 돗자리들의 한 변의 길이들이 담긴 정수 리스트 mats, 현재 공원의 자리 배치도를 의미하는 2차원 문자열 리스트 park가 주어질 때 지민이가 깔 수 있는 가장 큰 돗자리의 한 변 길이를 return 하도록 solution 함수를 완성해 주세요. 아무런 돗자리도 깔 수 없는 경우 -1을 return

제한사항

  • 1 ≤ mats의 길이 ≤ 10
  • 1 ≤ mats의 원소 ≤ 20
  • mats는 중복된 원소를 가지지 않습니다.
  • 1 ≤ park의 길이 ≤ 50
  • 1 ≤ park[i]의 길이 ≤ 50
  • park[i][j]의 원소는 문자열입니다.
  • park[i][j]에 돗자리를 깐 사람이 없다면 "-1", 사람이 있다면 알파벳 한 글자로 된 값을 갖습니다.

mats의 값 중에 최대 크기보다 작은 값이 없으면 -1을 리턴하는 거가 필요하고

계산양을 최소화하면서 행과 열이 연속되게 정사각형 모양으로 -1인걸 구해야하는데

일단 -1이 나오면 다음 index를 보고 그것도 -1이면 다음행의 같은 index와 +1을 보고 이게 막힐때까지 반복하는거 하나가 필요

여기서 계산양을 줄이고 싶으면 이미 고려된 index가 -1이라도 제외하는 과정이 필요함

def can_place_mat(park, x, y, size):
    """
    주어진 (x, y) 위치에서 size x size 크기의 돗자리를 깔 수 있는지 확인
    """
    n, m = len(park), len(park[0])
    if x + size > n or y + size > m:
        return False
    
    for i in range(x, x + size):
        for j in range(y, y + size):
            if park[i][j] != "-1":
                return False
    return True

def solution(mats, park):
    mats.sort(reverse=True)  # 큰 돗자리부터 시도
    n, m = len(park), len(park[0])
    
    for size in mats:
        for i in range(n):
            for j in range(m):
                if can_place_mat(park, i, j, size):
                    return size
    
    return -1

chatpgt의 힘을 빌렸다

내가 생각하다 막힌 부분은

park의 행별로 -1의 index를 구하고 그 다음 index가 out or range가 아니면 확인하면서 확인할껄 줄여가는

방안이었는데

그걸 위해서 

list(filter(lambda x: test_list[x] == 3, range(len(test_list))))를 활용할 계획이었는데

막상 뽑아놓고 나니 막혔다

chatgpt의 풀이를 보면 size까지 정의한 함수에 넘겨 해당 위치가 park의 범위를 초과하지 않으면서

해당 위치부터 x축 y축 모두가 -1이면 true를 넘겨서 size를 리턴하게 한다

이때 가장 큰거부터해서 차차 줄여가는 방안으로 했다

내가 생각한건 돗자리의 최대 크기를 구해서

해당하는 최대값을 구하는 것이었다. 해당 조건으로 작성하게 gpt에게 시켜보자

-> 쓸대없이 길어지고 def가 많아지니 언급할 가치가 없다

여기서 내가 생각 못한건 mat의 사이즈를 활용하는 생각이다

 

2. 가장 많이 받은 선물

두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
예를 들어 A가 B에게 선물을 5번 줬고, B가 A에게 선물을 3번 줬다면 다음 달엔 A가 B에게 선물을 하나 받습니다.
두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.
선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.
예를 들어 A가 친구들에게 준 선물이 3개고 받은 선물이 10개라면 A의 선물 지수는 -7입니다. B가 친구들에게 준 선물이 3개고 받은 선물이 2개라면 B의 선물 지수는 1입니다. 만약 A와 B가 선물을 주고받은 적이 없거나 정확히 같은 수로 선물을 주고받았다면, 다음 달엔 B가 A에게 선물을 하나 받습니다.
만약 두 사람의 선물 지수도 같다면 다음 달에 선물을 주고받지 않습니다.
위에서 설명한 규칙대로 다음 달에 선물을 주고받을 때, 당신은 선물을 가장 많이 받을 친구가 받을 선물의 수를 알고 싶습니다.

친구들의 이름을 담은 1차원 문자열 배열 friends 이번 달까지 친구들이 주고받은 선물 기록을 담은 1차원 문자열 배열 gifts가 매개변수로 주어집니다. 이때, 다음달에 가장 많은 선물을 받는 친구가 받을 선물의 수를 return 하도록 solution 함수를 완성

def solution(friends, gifts):
    n = len(friends)
    cnt_list = []
    gift_pnt = [0 for i in range(n)]
    next_m = [0 for i in range(n)]   
    
    for i in range(n):
        line = []
        for j in range(n):
            line.append(0)
        cnt_list.append(line)
    
    for gift in gifts:
        a, b = gift.split()
        i = friends.index(a)
        j = friends.index(b)
        cnt_list[i][j] += 1
        cnt_list[j][i] -= 1
        gift_pnt[i] += 1
        gift_pnt[j] -= 1
    
    for i in range(n):
        for j in range(i, n):
            if i != j:
                if cnt_list[i][j] < cnt_list[j][i]:
                    next_m[j] +=1
                elif cnt_list[i][j] > cnt_list[j][i]:
                    next_m[i] +=1
                else:
                    if gift_pnt[i] < gift_pnt[j]:
                        next_m[j] +=1
                    elif gift_pnt[i] > gift_pnt[j]:
                        next_m[i] +=1
    return max(next_m)

실수 했던게 마지막 최종 next_m할때 중복되게 하느게 있었는데

j의 range를 수정하여서 해결함

def solution(friends, gifts):
    f = {v: i for i, v in enumerate(friends)}
    l = len(friends)
    p = [0] * l
    answer = [0] * l
    gr = [[0] * l for i in range(l)]
    for i in gifts:
        a, b = i.split()
        gr[f[a]][f[b]] += 1
    for i in range(l):
        p[i] = sum(gr[i]) - sum([k[i] for k in gr])

    for i in range(l):
        for j in range(l):
            if gr[i][j] > gr[j][i]:
                answer[i] += 1
            elif gr[i][j] == gr[j][i]:
                if p[i] > p[j]:
                    answer[i] += 1
    return max(answer)

다른사람은 이렇게 dict을 사용해서 풀었는데

enumerate()의 역할도 모르고 내일 분석해보자... ㅈㅈ

 

'다양한 분야 공부 기록 > Python Coding Test' 카테고리의 다른 글

github 잔디 심기용 문제 풀기 + 자료구조 공부  (1) 2025.02.02
Level 1 풀기  (0) 2025.02.01
Level 1도 풀어보기  (0) 2025.01.29
코테 연습기  (0) 2025.01.28
다시 코테 준비하기  (0) 2025.01.27