상세 컨텐츠

본문 제목

2022년 4월 4일 - 삼각 달팽이 lv2, 스킬트리 lv2

컴퓨터 공부/코딩테스트 스터디

by 주중 (zuzung) 2022. 4. 20. 10:07

본문

삼각달팽이

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항

  • n은 1 이상 1,000 이하입니다.

해답

나는 이 문제를 풀지 못했다. 다른 이의 풀이를 첨부한다.

def solution(n):
    dx = [0,1,-1]
    dy = [1,0,-1]
    b = [[0]*i for i in range(1,n+1)]
    x, y = 0, 0
    num = 1
    d = 0 
    while num <= n*(n+1)//2:
        b[y][x] = num
        ny = y + dy[d]
        nx = x + dx[d]
        num += 1
        if 0<=ny<n and 0<=nx<=ny and b[ny][nx] ==0:
            y,x = ny,nx
        else:
            d = (d+1)%3
            y += dy[d]
            x += dx[d]
    return sum(b,[])

느낀점

이렇게 도형같은 것을 이용한 문제는 정말 어려운 것 같다. 항상 느끼지만 아직 나는 한참 멀은 것 같다..ㅎㅎ..ㅎㅎ

 

스킬트리

문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 "CBD"로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

입출력 예 설명

  • "BACDE": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • "CBADF": 가능한 스킬트리입니다.
  • "AECB": 가능한 스킬트리입니다.
  • "BDA": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

해답

이 문제도 다른 사람의 풀이를 참고했다.

def solution(skill, skill_trees):
    answer = 0

    for skills in skill_trees:
        skill_list = list(skill)

        for s in skills:
            if s in skill:
                if s != skill_list.pop(0):
                    break
        else:
            answer += 1

    return answer
def solution(skill,skill_tree):
    answer=0

    for i in skill_tree:
        skillist=''

        for z in i:
            if z in skill:
                skillist+=z

        if skillist==skill[0:len(skillist)]:
            answer+=1

    return answer

느낀점

ㅎㅎ.. level 2 가 왜캐 어렵지... 일단 이번 문제는 잘 생각해보면 풀 수 있는 문제였는데 오히려 어렵게 돌아가다가 못푼 것 같다. 내일은 무조건 한 문제는 내 손으로 풀고싶다.

관련글 더보기

댓글 영역