[PERL] 동일 열의 연속값의 누적합과, 그 열의 누적값중에서의 최대값 산출하기
안녕하세요. 기상자료를 분석하는데 조금 안 풀리는 부분이 있어서 질의드립니다.
365일 동안 연속적으로 비가 안오는 날의 최대값을 산출하는 문제를 해결하고자 아래와 같은 코드를 작성했습니다.
먼저 비가 안오는 날은 1, 비가 오는 날은 0으로 해서 해당일이 비가 오면 앞날의 값에 1을 더하고,
비가 오지 않으면 그 값을 0으로 처리하여 값이 누적되게 1번째 코드를 작성하였습니다.
그 이후에 같은 열을 비교하여 가장 값이 큰 값을 산출하도록 2번째 코드를 작성하였습니다.
문제는 제가 최대값만을 최종생산물로 원하고 누적값은 중간생성물파일로 저장하지 않고 메모리에서 한번에 처리하고자 하는데
하나로 묶는데서 해결이 되지 않아 도움을 요청합니다. 해안을 부탁드립니다.
예시 데이터는 아래와 같습니다.
(원본 데이터)
1 1 2 0 0 1 0 1
1 1 2 0 0 1 1 0
2 1 2 0 1 2 0 1
1 1 0 1 0 1 0 1
(누적값 도출)
0 0 0 1 1 0 1 0
0 0 0 2 2 0 0 1
0 0 0 3 0 0 1 0
0 0 1 0 1 0 2 0
(최대값)
0 0 1 3 2 0 2 1
# 첫번째 코드
#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;
my (@buf,$sum,%sum,@sum);
while(<>){
@buf = map { ($_== 0)?1:0 } split;
for (my $j=0; $j<=$#buf; $j++){
if ($buf[$j] == 1) {$sum{$j} += 1;}
elsif ($buf[$j] == 0) {$sum{$j} = 0;}
print (($sum{$j})," ");
}
print "\n";
}
# 두번째 코드
use 5.010;
use strict;
use warnings;
my (@arr, %arr, $row);
while(<>){
@arr=split;
for (my $i=0; $i<=$#arr; $i++){
$arr{$i} = $arr[$i] if ($arr[$i] >= $arr{$i});
}
$row++;
}
print (($arr{$_})," ") for (sort {$a <=> $b} keys (%arr));
print "\n";
이것을 참고해 보세요.
저도 모르지만... 나름 2 시간정도 찾아서 만든겁니다. ㅡ_ㅡ;;
해답은 아니지만. 잘 실행 됩니다.
입력을 2 개만 가능하게 되어 있는데. 중요한건 저런 방식으로 구현이 가능하다는거니까요.
실행 되는 기능을. 참고만 해보시기 바랍니다.
감사합니다.
많은 시간 저를 위해 투자해 주셔서 감사합니다. 차근차근 해석해가며 적용해 보겠습니다.
ㅡ_ㅡ;; 저에게 투자하는 겁니다.
ㅡ_ㅡ;; 저도 필요한 내용일 수 있거든요...
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
먼저 비가오는 날에 대한 raw파일을 아래와 같은
먼저 비가오는 날에 대한 raw파일을 아래와 같은 형태로 만들고,
여기서 연속된 1의 개수를 count하는 방법으로 할 듯..
예를 들어 아래처럼
최대값 하나만 찾고 싶다면
데이터 특성이 다음과 같아서 하나만 출력하는 것은 의미가 없습니다.
(원본 데이터)
서울 대구 부산 .....
1일 1 1 2 0 0 1 0 1
2일 1 1 2 0 0 1 1 0
3일 2 1 2 0 1 2 0 1
4일 1 1 0 1 0 1 0 1
(누적값 도출)
서울 대구 부산 .....
1일 0 0 0 1 1 0 1 0
2일 0 0 0 2 2 0 0 1
3일 0 0 0 3 0 0 1 0
4일 0 0 1 0 1 0 2 0
(최대값)
서울 대구 부산 .....
연속최대일 0 0 1 3 2 0 2 1
컬럼이 지역별이었군요.. 그럼 지역별로loop돌면서
컬럼이 지역별이었군요..
그럼 지역별로loop돌면서 컬럼별로 연속된 0의 개수를 카운트하는 문제겠네요..
넵.. 감사합니다.~~~ 다른 질문이 있습니다
님 아이디어를 바탕으로 다음과 같이 코드를 작성하였습니다. 한줄코드는 제가 이해를 잘 못해서.. 다시 작성했습니다.
나름대로 짜본거..
로긴해서 적으려니 KLDP로그인이 안되네요? 제 계정은 aero 인데 없는계정이라고 나옴
결과
codepad 링크
http://codepad.org/AsThIyiJ
감사합니다. aero님 역시 좋은 솔루션 같습니다..
감사합니다
댓글 달기