Imos알고리즘 (누적합)

2023. 5. 9. 09:25· Computer Science/알고리즘
목차
  1. IMOS (いもす法, imos法)
  2. 정의
  3. 1차원에서의 구현 방법
  4. 2차원에서의 구현 방법(효율성 매우 좋음)
  5. 2차원에서의 삼각형 구현 방법(특수좌표계)
  6.  

IMOS (いもす法, imos法)

정의

 

누적합 문제에서 쓸 수 있는 개념
정해진 구간 내에 시작과 끝이 포함된 부분 집합에 대한 명령이 여러개 들어올 때, 반복적으로 연산하게 되면 연산 시간이 매우 커질 수 있다.

 

예시문제) 도서관 좌석 예약된 수time[0]~time[100000] 의 시간이 있다.입력으로는 각 개개인의 좌석예약시작시간과 종료시간이 들어온다.이를 time[i]+=1로 수행하면 정확도는 통과하지만 속도가 무지하게 느려질 수 있다.이때 효율적으로 사용할 수 있는 것이 imos알고리즘이다.

 

Imos의 시간복잡도는 배열의 길이이다. 1차원: O(H), 2차원: O(HW) (H:가로, W:세로)

 

1차원에서의 구현 방법

시작시간과 끝시간을 기록하여 준다.

먼저 각 시간에 대한 1차원 배열을 생성하고 값을 0으로 초기화 해준다. 그 후 각 명령에 대해 시작시간에 +1, 종료시간에 -1을 해준다.

만약 A(1시 ~ 4시), B(2시 ~ 8시), C(3시 ~ 12시), D(4시 ~ 8시) 이라면 배열의 값은 [0,1,1,1,0,0,0,0,-2,0,0,-1] 이 된다.배열은 만든 후 배열크기만큼 반복문을 돌리면 효율성 있게 답을 구할 수 있다.

 

imos = [0,1,1,1,0,0,0,0,-2,0,0,-1]
now = 0
for i in range(12):
   now += imos[i]
   imos[i] = now

 

2차원에서의 구현 방법(효율성 매우 좋음)

 

효율성을 생각하지 않는다면, 매 입력이 들어올 때마다 해당 사각형 영역에 1씩 직접 다 더해주고, 마지막에 출력만 해 주는 로직을 떠올려보자. 쿼리당 O(HW)만큼 걸리고, 총 시간복잡도는 O(QHW)이다. (H×W 크기의 격자 보드, Q개의 입력)

 

2차원 배열의 경우는 명령이 2차원 배열로 들어오기 때문에 사각형 모양에서의 각 꼭지점을 시작과 끝으로 생각해서 구현할 수 있다

 

1. 사각형이 시작하는 부분 (왼쪽 위 점) : +1
2. 시작 부분에서 가로, 세로로 나아갔을 때 범위가 끝나는 부분 (빨간색 표시 지점) : -1
3. 사각형이 끝난 부분 (구간 밖 오른쪽 아래 점) -1 해준 걸 상쇄하기 위해 다시 : +1

이런 방식으로 배열을 생성해주고 다시 값을 계산해줄 때에는 가로와 세로를 나눠서 두 번 반복문을 돌려준다.(마지막에!)

사각형으로 바뀌어도 기본적인 아이디어는 같다. "시작과 끝만 기록한다" 단 2차원에서는 차원이 늘어난 만큼, 가로 방향으로 시작과 끝, 세로 방향으로 시작과 끝 두 번 기록하고, 시뮬레이팅할 때도 가로로 한번, 세로로 한번 휩쓸면 된다.

 

먼저 가로로 반복문을 돌리면

 

세로로 반복문을 돌리면

for i in range(len(imos)):
        now = 0
        for j in range(len(imos[0])):
            now += imos[i][j]
            imos[i][j] = now

for i in range(len(imos[0])):
     now = 0
     for j in range(len(imos)):
         now += imos[j][i]
         imos[j][i] = now

 

2차원에서의 삼각형 구현 방법(특수좌표계)

imos법의 강력함은 영역을 '영역의 시작과 끝'으로만 일단 나타내고, 나중에 한번에 쓸어내면서 원래 값을 복원할 수 있다는 것이다.

 

 

삼각형은 6개의 점이 필요하고 세번 휩쓸어야 한다.

 

 

 

참고: https://velog.io/@nkrang/알고리즘-imos-법 , https://driip.me/65d9b58c-bf02-44bf-8fba-54d394ed21e0

'Computer Science > 알고리즘' 카테고리의 다른 글

투포인터  (0) 2023.05.02
최단경로(다익스트라,플로이드워셜)  (1) 2023.01.19
다이나믹 프로그래밍  (0) 2023.01.12
이진 탐색  (0) 2023.01.09
정렬  (0) 2023.01.04
  1. IMOS (いもす法, imos法)
  2. 정의
  3. 1차원에서의 구현 방법
  4. 2차원에서의 구현 방법(효율성 매우 좋음)
  5. 2차원에서의 삼각형 구현 방법(특수좌표계)
  6.  
'Computer Science/알고리즘' 카테고리의 다른 글
  • 투포인터
  • 최단경로(다익스트라,플로이드워셜)
  • 다이나믹 프로그래밍
  • 이진 탐색
윤재에요
윤재에요
윤재에요
yunzae.log
윤재에요
전체
오늘
어제
  • 분류 전체보기 (438)
    • Computer Science (115)
      • 데이터베이스 (50)
      • 네트워크 (18)
      • 소프트웨어 공학 (1)
      • 알고리즘 (10)
      • 자료구조 (9)
      • 컴퓨터구조 (0)
      • 운영체제 (0)
      • 데이터 통신 (16)
      • 프로그래밍언어론 (11)
    • Project (20)
      • 후크(Flutter) (1)
      • BDSR로그북(App,BackEnd) (2)
      • 나만의 주점(STM32,Arduino,androi.. (9)
      • 공다(App,BackEnd) (2)
      • 카카오쇼핑 클론코딩 (4)
      • 암호화폐자동매매 (2)
    • Problem Solving (208)
      • 자바 문법 (20)
      • 파이썬 문법,함수 (6)
      • 그리디 (5)
      • 구현 (43)
      • DFS (3)
      • BFS (17)
      • 정렬 (15)
      • 이진 탐색 (16)
      • 다이나믹 프로그래밍 (6)
      • 최단 경로 (5)
      • 그래프 (1)
      • 자료구조 (5)
      • 투포인터 (15)
      • SQL (44)
      • 구간합 (7)
    • I leaned (78)
      • 스프링,스프링부트 (31)
      • Git (6)
      • JAVA (5)
      • Etc (30)
    • 취업 (15)
      • PT면접 (6)
      • 기술면접 (9)
      • 인성면접 (0)
    • log (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 다이어그램
  • Relationship model
  • 파이썬
  • 기수정렬
  • 다이나믹
  • 이것이코딩테스트다
  • E-R Model
  • 효율적인화폐구성
  • 재시도
  • 힙큐
  • 개미전사
  • 최단 거리
  • 데이터베이스
  • 최단거리
  • 부품찾기
  • DP
  • 다이나믹프로그래밍
  • 다익스트라
  • 이것이 코딩테스트다
  • 교환정렬
  • 참조 무결성
  • 플로이드 워셜
  • weak entity
  • 이것이 코딩테스트다.
  • 계수정렬
  • 카카오테크캠퍼스
  • UML
  • 그리디
  • 제약 사항
  • 먀

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
윤재에요
Imos알고리즘 (누적합)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.