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