코딩 테스트 연습/프로그래머스

[Python]Programmers 할인 행사(lv2)

jaeheon0520 2024. 3. 16. 11:05

1. 문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

위의 애니메이션과 같은 규칙이 적용되어 있는 n x n 배열의 각행을 떼어서

 

n x n 길이의 1차원 배열로 만들었을 때  left부터 right사이의 값을 구하는 문제이다.

 

2. 풀이

index 0 1 2
0 1 2 3
1 2 2 3
2 3 3 3

 

위 n x n 배열의 각 행을 떼어서 1차원 배열로 나타내면 다음과 같다.

 

index 0 (0,0) 1 (0,1) 2 (0,2) 3 (1,0) 4 (1,1) 5 (1,2) 6 (2,0) 7 (2,1) 8 (2,2)
value 1 2 3 2 2 3 3 3 3

 

규칙을 보면 각 index의 value는 max( (index // n), (index % n)) + 1 임을 알 수 있다.

3. 코드

나의 풀이:

def solution(n, left, right):
    answer = []
    for i in range (left, right+1):
        answer.append(max((i//n), (i % n))+1)
    return answer

 

다른 사람의 풀이:

def solution(n, left, right):
    Coord = list(divmod(left, n))
    answer = [Coord[1] + 1 if Coord[0] < Coord[1] else Coord[0] + 1]
    Coord[1] += 1
    for _ in range(left + 1, right + 1):
        if Coord[1] >= n:
            Coord[0] += 1
            Coord[1] = 0
        answer.append(Coord[1] + 1 if Coord[0] < Coord[1] else Coord[0] + 1)
        Coord[1] += 1
    return answer

 

친구의 코드가 조금더 복잡하긴 하지만 더 개연성 있는 느낌이다.