상세 컨텐츠

본문 제목

솔리디티 강좌 24강 반복문3 - linear search

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 23. 21:26

본문


유튜브를 통해, 쉽고 간편하게 이해 해보아요!

https://youtu.be/NJVVmHfm2mg

 

- YouTube

 

www.youtube.com

구독/좋아요 해주셔서 감사합니다 :) !!


 

 

안녕하세요 

 

오늘은 for loop을 간단히 응용해서,

linear search를 만들어 보려고 합니다. 

 

linear search 는 배열의 값을 검색할때 써요.

 

 

라는 간단한 배열이 있습니다. 

 

여기서 저희가 search를 해야하니까, 특정한 값을 입력 받아 이 배열안에 있는가를 검색하게 될 것 입니다.

 

예를들어, 저희는 search 값으로 3을 입력 받고, 3인 어떤 인덱스 값인지 리턴하는 linear search를 만들었다고 가정 하였을때, for loop은 인덱스 0 부터 시작하여 인덱스 2번째 값인 3이 나올때 까지 하나하나 일일히 비교를 하게 된답니다. 

 

그러나 만약에 search 값으로 10 을 입력 받고, 찾게된다면 현재 저 배열에는 10 이 없으니 인덱스 값이 안나오겠죠 

그럴경우 해당 값이 없다고 리턴을 하게 됩니다. 

 

자 쉽게 예제로 볼게요. 

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;


contract lec24{
    string[] private countryList = ["South Korea","North Korea","USA","China","Japan"];
    
    function linearSearch(string memory _search) public view returns(int256,string memory){
        
        for(uint256 i=0; i<countryList.length; i++){
            if(keccak256(bytes(countryList[i])) == keccak256(bytes(_search))){
                return (i,countryList[i]);
            }
        }
        
        return(99,"Nothing");
        
    }

}

countryList 는 ["South Korea","North Korea","USA","China","Japan"] 라는 배열입니다.

저희는 이 배열의 값들 하나하나 돌면서, linearSearch 함수의 파라미터 값 _search를 같은지? 아닌지? 비교할거예요.

 

기존의 for loop 과 같음을 알 수가있습니다.

여기서 주목해야할 점은 if 문입니다.

  if(keccak256(bytes(countryList[i])) == keccak256(bytes(_search)))

사실 솔리디티 내에서는 string을 직접적으로 비교가 불가능하고, 위와 같은식으로 해줘야한답니다. 

string을 bytes 화 해주고, keccak256를 이용해 다시 해시화 하여 비교를 해줘야합니다.

 

그래서, 입력받은 _search 가 USA 라면, if문 안에있는 내용이 실행이 되겠죠. 

return 으로 USA의 인덱스 2 와 USA가 출력되는걸 알 수가 있습니다.

 

그와 반대로, 

저 배열값에없는 값이 입력이 된다면, 이 함수는, 마지막 인덱스인 Japan까지 비교하고, 

return(99,"Nothing") 이 실행이 될것입니다.

 

 

영상으로 참고 하시면 더 이해가 잘갈거예요

관련글 더보기