ML/AI/SW Developer

Programmers 월간 챌린지 10월 - 1번 / 2번 (Python)

1번

1. 문제 설명

  • 나머지가 1이되는 가장 작은 수 찾기
  • 문제 = 설명인 아주 쉬운 문제였다.

2. 코드

  • 제한 범위인 2 ~ 1,000,000 까지 범위를 잡고 반복문을 돌려준다.
def solution(n):
    for i in range(2, 1000000):
        if n % i == 1:
            break
    return i

2번

1. 문제 설명

  • n x n 크기의 비어있는 2차원 배열
  • i = 1~n 까지 다음을 반복
    • 1행 1열 ~ i행 i열 까지 영역내 모든 빈칸을 숫자 i로 채우기
  • 1 ~ n 행을 잘라 붙인 1차원 배열 생성
  • arr[left] ~ arr[right] 까지 남기고 제거한 arr 반환
[조건]
1 <= n <= 10^7
0 <= left <= right <= n^2
right - left < 10^5

2. 풀이

  • 처음 읽어보면 뭔소리지 싶다. 하지만 그림을 그려보면 쉽게 이해할 수 있다.
    • 일단 다음과 같이 숫자를 채우라는 얘기이다. 하지만 n의 범위를 보면 다 채워서 찾으라는 말은 아니라는 것을 직감할 수 있다. 다 채운다면 분명이 메모리 에러를 뿜뿜할 것 같은 크기이다.
    • 그럼 우리는 어떤 규칙을 찾아야한다.
    • 분홍색으로 표시된 영역을 보자. 2열에 채워진 숫자는 [2, 2, 3, 4, 5] 이다. 그 옆인 3열은 [3, 3, 3, 4, 5] 이다. 여기서 우리는 유레카를 외칠 수 있다.
      • 열번호와 행번호를 비교했을 때, 큰 번호를 그 값으로 가진다는 것을 알 수 있다.
      • 이제 우리는 left ~ right의 행번호와 열번호만 알 수 있으면, 전체 gird를 다 채워 넣지 않아도 답을 구할 수 있다!
    • 행번호와 열번호는 어떻게 구할까?
      • 문제의 조건에서 행을 기준으로 잘라 1차원 배열로 만든다고 했다. 그럼 위 그림처럼 번호를 매겨 볼 수 있다.
      • 이제 그 관계를 살펴보면, 행번호는 몫, 열번호는 나머지라는 것을 쉽게 유추할 수 있다.
    • left ~ right 까지 행번호와 열번호를 계산하고, 그 값을 answer 배열에 넣어주면 끝이다!

3. 코드

def solution(n, left, right):
    answer = []
    
    for idx in range(left, right+1):
        x = idx // n # 몫 - 행번호
        y = idx % n  # 나머지 - 열번호
        v = max(x, y)# 둘중에 큰거
        answer.append(v+1) # 문제 조건에서는 0이 아니라 1부터 시작하기 때문에 +1 해주기
    
    return answer