modular 연산 활용하기
modular 연산 활용하기 — #모듈러연산 #mod #코딩테스트 #modular연산 사용된 언어: 코틀린, 혹은 파이썬 순서: 로직, 코드 구현, 코...
#모듈러연산 #mod #코딩테스트 #modular연산
- 사용된 언어: 코틀린, 혹은 파이썬
- 순서: 로직, 코드 구현, 코드 분석
modular연산
프로그래머스 - 2025 프로그래머스 코드 챌린지 1차 예선 - 유연근무제
[코딩테스트 연습 - 유연근무제
알고리즘 문제 연습 카카오톡 친구해요! 프로그래머스 교육 카카오 채널을 만들었어요. 여기를 눌러, 친구 추가를 해주세요. 신규 교육 과정 소식은 물론 다양한 이벤트 소식을 가장 먼저 알려드립니다.
school.programmers.co.kr](https://school.programmers.co.kr/learn/courses/30/lessons/388351#)
✍️ 문제 구현은 단순하다. modular연산에 익숙하다면 빨리 풀 수 있다.
🖌️ modular연산?
나머지 연산이다.
5 mod 3 = 2
👉 기억하면 좋은 특징들
1. 0 ≤ (a mod m) <m
2. 분배법칙
(a + b) mod m = ((a mod m) + (b mod m)) mod m
(a x b) mod m = ((a mod m) x (b mod m)) mod m
3. 뺄셈과 음수 처리
(a - b) mod m = ((a mod m) - (b mod m) + m) mod m
👉 음수가 나올 경우에 +m을 더한 뒤 다시 모듈로 취하면 1의 범위로 변환
4. 결합 법칙
((a mod m) mod m) = (a mod m)
5. 주기성
(a + km) mod = a mod m
좌표측 변환
D∈{1,2,…,7} 인 상황에서 start를 특정 요일의 새로운 0번으로 삼고 싶다면 D에서 start를 빼면 된다.
예를들어 D = 3은 수요일이다. D에서 start = 3을 빼주면 수요일이 0번이되며, 4 - 3 = 1이 목요일이 된다.다른 모든 요일은 그에 따라 index가 조정된다.
월요일이나 화요일의 경우 D - start를 하면 -2, -1이 되는데 음수의 나머지는 언어마다 다르다. 정확성을 위해 + 7을 해주면 5, 6으로 제대로 된 인덱스가 설정된다.
+7을 하는 경우 월요일 부터 index가 5, 6, 7, 8, 9, 10, 11 이된다. 이를 mod 7을 해주면 올바른 인덱스가 설정됨.
기준점을 변환하는 것이 좌표측 변환과 유사하다.
정답 코드
def solution(schedules, timelogs, startday):
answer = 0
# need adjust 759 -> 809
deadlines = [time + 10 for time in schedules]
adjusted = []
for dl in deadlines:
if dl % 100 > 59:
hour = dl // 100 + 1
minute = dl % 10
adjusted.append(hour * 100 + minute)
else:
adjusted.append(dl)
R = len(timelogs)
C = 7
sat = (6 - startday + 7) % 7
sun = (7 - startday + 7) % 7
for i in range(R):
gift = True
for j in range(C):
# check
if j == sat or j == sun:
continue
if timelogs[i][j] > adjusted[i]:
gift = False
if gift:
answer += 1
return answer
- 이런 시간 문제는 항상 59분을 신경쓰자.
- 769 -> 809로 잘 처리해주기
- 시간복잡도 : O(n)
코드 줄이기
deadlines = [time + 10 for time in schedules]
adjusted = []
for dl in deadlines:
if dl % 100 > 59:
hour = dl // 100 + 1
minute = dl % 10
adjusted.append(hour * 100 + minute)
else:
adjusted.append(dl)
이 부분을 python 연산을 사용하면 줄일 수 있을 것 같다.
adjusted = [dl + 40 if dl % 100 > 59 else dl
for dl in (t + 10 for t in schedules)]
