[Software] Fortran: 배열에서 중복 요소 제거하기

Fortran에서 배열(array)에서 중복되는 요소를 제거하는 루틴을 작성했다.

기존의 인터넷 상의 코드는 2개 이상의 중복되는 요소들에서 중복되는 것만 제거하는 방식이다.

기존 Fortran 코드: Remove duplicate elements

program remove_dups
  implicit none
  integer :: example(12)         ! The input
  integer :: res(size(example))  ! The output
  integer :: k                   ! The number of unique elements
  integer :: i, j

  example = [1, 2, 3, 2, 2, 4, 5, 5, 4, 6, 6, 5]
  k = 1
  res(1) = example(1)
  outer: do i=2,size(example)
     do j=1,k
        if (res(j) == example(i)) then
           ! Found a match so start looking again
           cycle outer
        end if
     end do
     ! No match found so add it to the output
     k = k + 1
     res(k) = example(i)
  end do outer
  write(*,advance='no',fmt='(a,i0,a)') 'Unique list has ',k,' elements: '
  write(*,*) res(1:k)
end program remove_dups

위 코드의 실행 결과: Unique list has 6 elements:            1           2           3           4           5           6

2개 3번 반복되지만 2는 최종 결과에 남아있다.

아래와 같이 수정할 경우 중복된 모든 요소를 제가하게 된다.

program remove_dups
  implicit none
  integer :: example(7)         ! The input
  integer :: res(size(example))  ! The output
  integer :: k                   ! The number of unique elements
  integer :: i, j,icount

  example = [1, 2, 2, 3, 3, 4, 5]
  k = 0
  !res(1) = example(1)
  outer: do i=1,size(example)
     icount = 0
     do j=1,size(example)
        if (example(j) == example(i)) then
           ! Found a match so start looking again
           icount = icount + 1
           !cycle outer
        end if
        if(icount == 2) cycle outer
     end do
     ! No match found so add it to the output
     k = k + 1
     res(k) = example(i)
  end do outer
  write(*,advance='no',fmt='(a,i0,a)') 'Unique list has ',k,' elements: '
  write(*,*) res(1:k)
end program remove_dups

위 코드의 실행 결과: Unique list has 3 elements:            1           4           5

중복된 모든 요소가 배열에서 삭제되었다.

댓글

이 블로그의 인기 게시물

[Software] Python으로 Google 검색결과 크롤링(crawling)하기

[Software] Dakota: Install Dakota 6.4 on Ubuntu 16.04 LTS