[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
중복된 모든 요소가 배열에서 삭제되었다.
기존의 인터넷 상의 코드는 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
중복된 모든 요소가 배열에서 삭제되었다.
댓글
댓글 쓰기