핍 이해하기

마지막 업데이트: 2022년 6월 17일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
firenews 2021.07.11 23:58 신고 더보기

칸아카데미는 해당 브라우저를 지원하지 않습니다. [닫기]

If you're seeing this message, it means we're having trouble loading external resources on our website.

웹 필터가 올바르게 작동하지 않으면 도메인 *. kastatic.org*.kasandbox.org이 차단되어 있는지 확인하세요.

소수 (중등1학년)

소수와 합성수 이해하기

소수 (중등1학년)

동영상 대본

다음 수가 소수인지 합성수인지 아니면 둘 다 아닌지 분류해 보세요 복습해 보자면 소수는 자연수이며 1, 2, 3, 4, 5, 6과 같은 수 중에서 약수가 두 개만 있는 수입니다 소수의 약수는 1과 자기 자신입니다 소수의 예로 3이 있습니다 3을 나눌 수 있는 자연수는 1과 3 두 개밖에 없습니다 이를 다르게 생각하면 두 개의 자연수를 곱해서 3이 되는 수는 1 × 3뿐입니다 따라서 소수는 1과 자기 자신만을 약수로 가집니다 합성수는 1과 자신 외에 다른 수를 약수로 가지는 자연수를 말합니다 이제 합성수와 소수도 합성수도 아닌 수를 살펴봅시다 먼저 24를 볼까요? 모든 자연수를 생각해 봅시다 또는 0을 포함하는 정수를 생각해 봅시다 24를 나머지 없이 나눌 수 있는 수는 무엇이 있을까요? 어떤 수를 나머지 없이 나눌 수 있는 수를 약수라고 합니다 24는 당연히 1과 24로 나누어지겠죠 1 × 24 = 24 하지만 24는 2로도 나눌 수 있습니다 2 × 12 = 24이므로 12로도 나누어집니다 24는 3으로도 나누어집니다 3 × 8 = 24 24는 소수가 아니므로 약수를 더 찾을 필요가 없어요 24는 1과 자기 자신 외에도 약수를 더 가지고 있습니다 24는 확실히 합성수입니다 이제 남은 약수들을 구해 봅시다 24는 4로도 나누어집니다 4 × 6 = 24 이는 모두 24의 약수들이며 1과 24 이외에도 약수가 더 있습니다 이제 2에 대해 생각해 봅시다 2로 나누어지는 0이 아닌 수를 생각해 봅시다 1 × 2 = 2이므로 1과 2는 약수이지만 이외에 다른 약수는 없습니다 즉, 1과 자기 자신 이렇게 두 개의 약수만 가집니다 이것이 소수의 정의예요 따라서 2는 소수입니다 2는 소수 중에서 유일하게 짝수입니다 짝수는 2로 나누어지는 수죠? 2는 2로 나누어지므로 짝수인 동시에 1과 2 두 수로만 나눌 수 있으므로 소수입니다 하지만 다른 짝수들은 1과 자기 자신으로 나눠지며 2로도 나눠집니다 그러므로 2를 제외한 짝수는 1과 자기 자신과 다른 약수를 가지므로 합성수입니다 2는 소수이지만 2를 제외한 모든 짝수는 합성수입니다 1은 조금 특이한 경우입니다 1은 오직 1로만 나누어집니다 그러므로 1은 소수가 아니에요 1은 약수로 1만 가지고 있기 때문이죠 1의 약수는 약수는 1 한 개뿐이에요 소수가 되려면 두 개의 약수를 가져야 하지만 1의 약수는 한 개뿐입니다 합성수가 되려면 두 개보다 많은 약수를 가져야 합니다 1과 자기 자신과 다른 수를 가져야하죠 1은 합성수도 아닙니다 따라서 1은 소수도 합성수도 아닌 수입니다 마지막으로 17을 봅시다 17은 1과 17로 나누어집니다 하지만 1, 2, 3, 4, 5, 6, 7, 8 9, 10, 11, 12, 13, 14, 15, 16과 같은 다른 수로는 나누어지지 않습니다 따라서 17의 약수는 두 개입니다 1과 자기 자신인 17이죠 따라서 17은 소수입니다

상대방의 말 이해하기, 귀 기울이는 습관

상대방과 대화를 할 때 가장 중요한 것은 상대에게 시선을 맞추고 상대방의 말에 귀를 기울여야 한다.

좋은 관계 형성은 화려한 말 기술보다 상대방의 말을 경청하면서 적절한 질문을 던져 상대방이 하고 싶은 이야기를 더 잘할 수 있게 도와주는 것이 핵심 포인트다. 경청의 중요성은 상대와 높은 친밀감으로 보다 더 좋은 관계를 형성하는데 많은 도움을 주게 된다.

우리가 놓치고 있는 것은 대화의 분위기를 본인이 리드한다는 오만과 착각에 빠져 있다는 것이다. '삼척동자'가 된다면 당신은 사람들과 멀어지게 될 것이다. 잘난 척! 있는 척! 아는 척! 하지 말자.

사람들과 좋은 관계를 유지하기 위해선 나 핍 이해하기 자신이 하고 싶은 이야기는 접어두고, 먼저 상대방의 말에 귀 기울여 듣는 습관을 길러야 한다.

수동적으로 듣기보다는 능동적으로 듣기!

수동적으로 듣는 것은 단순하게 상대의 말에 응답하기 위한 방편에 지나지 않는다. 수동적이 아닌, 능동적으로 듣는 것은 은 상대의 입장을 이해하기 위해 듣게 되는 것이기 때문에 진정성 있는 대화를 할 수 있게 된다.

질문을 통해 관찰하고 이해하기!

나 자신이 말이 너무 많거나 반대로 말이 너무 없다면 대화는 단절되고 분위기는 냉각되기 쉽다. 이럴 때 필요한 것은 ' 관찰하기 기법'이다.

나 자신이 하고 싶은 말을 하기보다는 상대가 관심 있어하는 대상이나 궁금한 이야기 위주로 분위기를 이어가야 한다.

상대방의 관심 대상은 무엇일까? 어떻게 하면 알 수 있을까?

그것은 바로 '질문' 이다. 질문을 통해서 상대방의 정보를 파악하는 것만큼 좋은 방법은 없다. 질문을 통해서 관찰하고 상대가 말하는 바가 무엇인지를 이해할 수 있게 된다.

가상 화폐 쉽게 이해하기 - 비트코인과 암호화폐

블록체인, 하드포크, 탈중앙화 같은
용어들에 대해 이해를 해야만 비트코인을
이해할 수 있는 것은 아닙니다.

그냥 금과 같은 개념으로 보시면 되겠습니다.

지구에 산재해 있는 금의 양은 제한적입니다.

그렇기 때문에 금의 희소성 때문에 금값이 계속 오르고 있는 것이죠.

비트코인도 동일합니다. 컴퓨터를 통해 채굴이라는 작업(암호해독)핍 이해하기 을 통해
비트코인을 획득할 수 있습니다.

언뜻 들으면 암호해독을 잘 하면 빨리 얻을 수 있는 것 아니냐. 라고 생각하실 수 있겠지만,

암호해독을 위해서는 컴퓨터의 빠른 연산이 필요하며, 빠른 연산을 위해서는
컴퓨터의 사양이 좋아야 합니다.

결론적으로 말씀드리면 시간과, 전력, 그리고 고사양의 컴퓨터로 채굴을 진행하게되면, 우연히 더 캐낼수 있거나 복권처럼 당첨될 수 있는 그런 것이 아니라 투자한 만큼
채굴이 가능한 것으로 이해하시면 되겠습니다.

더 자세하고 복잡한 설명으로 들어가면
공평하지 않게 들릴지도 모르겠지만

이 정도면 비트코인에 대한 개념은
이해하실 수 있을 것 같습니다.

그렇다면 보이지 않는 가상의 화폐를
누가 인정해주며 왜 현실에서 거래가 되는가?

서두에 언급한 바와 같이, 우리가 사용하고 있는 신용카드 포인트나 적립금의 개념으로
이해하시면 되겠습니다.

사실 핍 이해하기 아무도 비트코인을 인정해주지 않는다면
분명 가치가 없을 것입니다.

그러나 어느 시점에서 비트코인을 가진 사람들이 비트코인으로 현물을 거래한다면
얘기는 달라집니다.

제가 어릴적 딱지치기를 많이 했었는데,
다 쓴 공책을 찢어서 여러가지 딱지를 접어서
친구들과 딱지치기를 하다보니

책가방에 핍 이해하기 딱지가 가득해지고
점점 더 양은 불어가게 되었습니다.

이후 언제부턴가 구슬놀이가 유행이되면서 아이들 사이에서는 구슬을 딱지와 교환하기도 하고, 딱지 10장을 주고 아이스크림 하나를 친구에게 얻어먹기도 하는 상황이 됩니다.

어른들에게는 아무 쓸모가 없는 딱지가 아이들 사이에서는 엄청난 가치를 지니고 있는 것이죠.

글을 읽는 분께서 지금까지 비트코인이나 가상화폐에 관심이 없으셨다가, 이 글을 읽고 계신 것이라면바로 그 아이들의 딱지치기 세계에 입문하게 되셨다고 보시면 되겠습니다.

2010년 5월 22일에 10000만 비트코인으로 피자 2판을 거래하게 된 것이 최초의 비트코인 거래이며, 지금도 5월 22일은 '피자데이'로 불리우고 있습니다. 피자데이에 대한 내용은 추후에 포스팅을 통해서 자세히 설명드리겠습니다.

현재 이 비트코인이라는 딱지는.. 이제 관심을 두지 않을 수 없을 만큼의 가치가 되어 1 비트코인이 8000만원을 육박하기에 이르렀습니다.

1비트코인이 7000만원이라면 최소 7000만원이 있어야 하는 것이 아닌가 생각하시겠지만, 소수점 이하로 쪼개서 거래가 가능하기 때문에, 만원으로도 비트코인을 구매할 수 있습니다.

비트코인 거래가 투기인가 투자인가에 대해 말이 많지만, 투기성 자산이든 사이버 머니이든 간에, 한 가지 분명한 것은 가상화폐라는 존재를 이제는 우리가 인정해야 하며 관련 정보를 알고 있어야 한다는 것입니다.

이미 우리주변에 도입되어 있는 신용카드 포인트, 멤버쉽 포인트를 생각하면 우리는 이미 가상화폐의 시대에 살고 있는 것임을 깨달으실 겁니다. 그렇기 때문에 더더욱 우리는 가상화폐에 대해 배울 수 밖에 없는 입장이라 생각합니다.

그럼 이제 가상화폐의 세계로 들어가보겠습니다. ^^

'비트코인 이야기' 카테고리의 다른 글

김프(김치프리미엄)과 역프는 왜 생기는가?( 김프가 활용하기, 리플로 재정거래하기 , Kimp.ga) (2) 2021.06.02
도지 코인의 정체 그리고 일론 머스크와의 관계(도지코인 급등 이유) (2) 2021.05.05
가상화폐와 주식의 차이점 (6) 2021.05.03
가상 화폐 쉽게 이해하기 - 비트코인과 암호화폐 (5) 2021.04.21

firenews 2021.05.11 21:56 더보기

이용약관위배로 관리자 삭제된 댓글입니다.
답글

firenews 2021.05.28 20:50 더보기

이용약관위배로 관리자 삭제된 댓글입니다.
답글

firenews 2021.07.11 23:58 신고 더보기

제2의 비트코인 꼭보세요!! (이제 올라갈듯 )

2008년에 비트코인을 매일 50코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 가치가 없다고 느꼈습니다. 지금 비트코인(Bitcoin)은 1코인당 6000만원 상당의 가치가 있습니다.

2011년에 라이트코인이 선보였고, 매일 100코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 이것이 여전히 가치가 없다고 생각했습니다. 라이트코인(Lite coin)은 현재 1코인에 30만원입니다.

이더리움이 2015년에 나왔습니다. 매일 30코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 여전히 그것을 믿지 않았습니다. 이제 이더이움(Ethereum)은 1코인당 300만원 상당의 가치가 있습니다.

현재 전 세계적으로 돌풍을 일으키고 있는 상장을 준비중인 최고의 가치를 내재하고 있는 코인을 알려드립니다.

파이코인은 2019년에 태어났고 몇 번의 반감기를 거쳐 지금 하루에 6코인정도를 무료로 채굴할 수 있습니다.

다음 반감기 오기전 혹은 무료채굴 종료 전에 서두르셔야 합니다.

비트코인의 단점을 보완하여 스마트폰으로 채굴 할수 있는 파이코인.

스마트폰의 성능에 전혀 지장이 없으며, 하루 1번의 스위칭으로 24시간(1세션)동안 무료 채굴 합니다.

이 황금같은 기회를 놓치지 마세요.

파이(PI)는 스탠퍼드 박사들이 개발한 새로운 디지털 화폐이며 전 세계적으로 1800만 명 이상의 사용자가 존재합니다.
파이를 받으시려면 앱스토어에 파이네트워크(pi network) 검색 설치 후 가입 시 저의 사용자 이름 firenews 누르시면 가입됩니다.

파이코인 이외에 2번째로 관심있는 코인인 비(bee)코인은 현재 1200만명이 넘고 올해 상장합니다.
앱스토어에서 bee network 치고 다운로드받아 추천인 firenews1004 입니다.

영국에서 나온 올해 9월 상장예정인 유망한 이글코인은 앱스토어에서 이글코인 치시고 다운받으셔서 추천인 firenews 입니다.

싱가폴에서 나온 올해 상장예정인 전망 높은 ANT코인은 앱스토어에서 ANT NETWORK 치시고 다운 받아 추천인 firenews1004 입니다.

발키리스왑은 이미 상장된 코인인데 전체 수량이 800만여 주 밖에 안돼 전망이 매우 높은 코인입니다. 아직 채굴 가능합니다. 밑에
http://app.vswap.cc/#register?invitecode=804274 로 채굴 가능합니다.
답글

익명 2021.07.11 23:59 더보기

불의남자 2021.10.15 15:48 더보기

제2의 비트코인 꼭보세요!! (이제 올라갈듯 ㅋ)

2008년에 비트코인을 매일 50코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 가치가 없다고 느꼈습니다. 지금 핍 이해하기 비트코인(Bitcoin)은 1코인당 6000만원 상당의 가치가 있습니다.

2011년에 라이트코인이 선보였고, 매일 100코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 이것이 여전히 가치가 없다고 생각했습니다. 라이트코인(Lite coin)은 현재 1코인에 30만원입니다.

이더리움이 2015년에 나왔습니다. 매일 30코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 여전히 그것을 믿지 않았습니다. 이제 이더이움(Ethereum)은 1코인당 300만원 상당의 가치가 있습니다.

현재 전 세계적으로 돌풍을 일으키고 있는 상장을 준비중인 최고의 가치를 내재하고 있는 코인을 알려드립니다.

파이코인은 2019년에 태어났고 몇 번의 반감기를 거쳐 지금 하루에 6코인정도를 무료로 채굴할 수 있습니다.

다음 반감기 오기전 혹은 무료채굴 종료 전에 서두르셔야 합니다.

비트코인의 단점을 보완하여 스마트폰으로 채굴 할수 있는 파이코인.

스마트폰의 성능에 전혀 지장이 없으며, 하루 1번의 스위칭으로 24시간(1세션)동안 무료 채굴 합니다.

이 황금같은 기회를 놓치지 마세요.

파이(PI)는 스탠퍼드 박사들이 개발한 새로운 디지털 화폐이며 전 세계적으로 2500만 명 이상의 사용자가 존재합니다.
파이를 받으시려면 앱스토어에 파이네트워크(pi network) 검색 설치 후 가입 시 저의 사용자 이름 firenews 누르시면 가입됩니다.

파이코인 이외에 2번째로 관심있는 코인인 비(bee)코인은 현재 1500만명이 넘고 올해 상장합니다.
앱스토어에서 bee network 치고 다운로드받아 추천인 firenews1004 입니다.

영국에서 나온 올해 상장예정인 유망한 이글코인은 앱스토어에서 이글코인 치시고 다운받으셔서 추천인 firenews 입니다.

싱가폴에서 나온 올해 상장예정인 전망 높은 ANT코인은 앱스토어에서 ANT NETWORK 치시고 다운 받아 추천인 firenews1004 입니다.

핍 이해하기

광역시 등

맨위로

이 책을 읽고 싶은 사람

반도체 제대로 이해하기 - 교양으로 읽는 반도체 이야기

반도체 제대로 이해하기

세일즈 포인트

  • SalesPoint는 판매량과 판매기간에 근거하여 해당 상품의 판매도를 산출한 알라딘만의 판매지수법입니다.
  • 최근 판매분에 가중치를 준 판매점수. 팔릴수록 올라가고 덜 팔리면 내려갑니다.
  • 그래서 최근 베스트셀러는 높은 점수이며, 꾸준히 팔리는 스테디셀러들도 어느 정도 포인트를 유지합니다.
  • `SalesPoint`는 매일매일 업데이트됩니다.

무이자 할부 안내

  • * 2~4개월 무이자 : 롯데
    * 2~6개월 무이자 : 삼성
    * 2~7개월 무이자 : 우리(BC아님), 국민, 비씨, 신한, 현대
    * 2~8개월 무이자 : 하나, 농협

    - 교양으로 읽는 반도체 이야기
  • 15,750 원 (10%, 1,750원 할인)

상품을 장바구니에 담았습니다.

    상품을 장바구니에 담았습니다.
    주문과정의 배송옵션에서 '영풍문고
    Now드림 방문 픽업'
    을 선택해주세요.

품절도서센터 장바구니에 담았습니다.

보관함에 상품 담기

선물하기 안내

  • 선물받으실 분의 핸드폰번호, 이메일 주소, 카카오톡 , 서재 주소 중 하나를 입력하시면 선물이 전송됩니다.
  • 무엇을 선물할지 망설여진다면 알라딘 상품권을 선물해보세요.

1:1 문의하기

  • 264쪽
  • 152*223mm (A5신)
  • 370g
  • ISBN : 9788978891240

회사소개 핍 이해하기 l 이용약관 l 개인정보처리방침 l 청소년 보호정책 l l --> 중고매장 l 제휴/마케팅 안내 l 판매자 매니저 l 출판사/공급사 안내 l 광고 안내 l 학교/기업/기관 대량구매

(주)알라딘커뮤니케이션

  • 대표이사 : 최우경
  • 고객정보보호 책임자 : 최우경
  • 사업자등록 : 201-81-23094
  • E-mail : [email protected]
  • 통신판매업신고 : 중구01520호
  • 호스팅 제공자 : 알라딘커뮤니케이션
  • (본사) 서울시 중구 서소문로 89-31 약도 ㅣ (중고매장) 자세히보기
  • (고객센터) 서울시 마포구 백범로 71 숨도빌딩 7층, Fax 02-6926-2600

에스크로

구매안전 에스크로
서비스 가입 확인

ISMS

정보보호 관리체계
ISMS 인증획득

'하노이의 탑' 이해하기

오늘 다룰 포스트는 ‘하노이의 탑’ 알고리즘이다. 개인적으로 재귀 를 사용한 프로그래밍을 매우 좋아하는데, ‘하노이의 탑’은 재귀를 연습하기에 매우 좋은 연습문제다. 아마 학교에서도 알고리즘 초급 수업에서 재귀 입문으로 이 문제를 많이 다루는 것으로 아는데 이에 대한 내 이해를 공유하면 좋을 것 같다.

언제나 그렇듯 나는 단순히 정답 코드를 찍 적고 휑하니 끝내는 것을 좋아하지 않는다. 코드 자체보다 코드에 이르는 과정이 더 중요한데, 먼저 이 문제를 우리가 원하는 방식으로 정의한다. 그 다음 이 문제를 풀기 위한 핵심 아이디어를 살펴본다. 이후 이 통찰력을 사용해 코드를 곧바로 유도한다.

코드를 살펴본 후 바로 마치지 않고, 탑의 개수에 따른 총 이동횟수 자체를 구해본다. 이때 단순히 재귀식이 아닌, 일반항을 유도해보자.

2. 하노이의 탑

먼저 문제를 이해해보자. 이 문제가 무엇을 요구하는지 확인하고, 우리는 그중 어떤 출력을 선택할 것인지 정한다. 어떤 출력을 선택하는지에 따라 코드 형태가 달리지기 때문에 확실히 하고 간다.

2.1. 문제 소개

‘하노이의 탑’(Tower 핍 이해하기 of Hanoi)은 프랑스의 수학자 에두아르 뤼카가 1883년 소개한 유명한 문제로, 다음과 같은 그림으로 표현할 수 있다.

Intro image of hanoi tower

3개의 막대가 있고, 첫 번째 막대(여기서는 ‘A’)에 5개의 원반이 쌓여 있다. 각 원반의 크기는 모두 다르고, 아래에서부터 위로 갈수록 점점 작아진다.

우리의 목표는 막대 ‘A’에 쌓여 있는 원반들을 그 순서를 지키면서 그대로 ‘C’로 옮기는 것이다.(‘B’도 상관 없다.)

Our goal in Hanoi tower problem

이때 원반을 옮기는 몇 가지 조건이 따른다.

  • 한 번에 움직일 수 있는 원반은 핍 이해하기 기둥 위에 놓인 원반 하나뿐이다.
  • 어떤 원반 위에 그보다 더 큰 원반을 쌓을 수 없다.

이 조건 하에서 ‘최소의 이동횟수로 옮기는 가짓수’를 구하거나, ‘최소의 이동횟수로 옮길 때 각 원반을 옮기는 순서’ 등을 구하는 것이 하노이의 탑 문제가 된다.

2.2. 문제 정의

이제 문제 자체는 알았으니 문제를 보다 체계적으로 정의하자. 내가 말하는 체계적 이라함은 문제의 입력과 출력을 보다 함수에 가깝게 정의하자는 것이다. 앞서 하노이의 탑과 관련된 여러 문제를 만들 수 있다고 했는데 우리는 원반의 이동횟수를 최소화하고자 할 때, 각 원반을 옮기는 모든 순서를 출력하는 것으로 한다. 이때 각 이동의 출력은 ‘3번 원반을 A에서 C’와 같이로 정하며, 입력은 원반의 개수로 받는다.

이를 구현하는 함수 hanoi 를 대략적으로 정의하면 다음과 같다.

hanoi(N): 원반의 개수 N을 입력 받아 모든 원반을 'C' 막대에 옮기는 각 움직임을 출력한다.

3. 아이디어 얻기

위에서 문제를 대략적으로, 사실 매우 러프하게 정의했다. 우리는 여기서 시작해서 각 원반을 어디에서 어디로 옮기는지를 모두 출력해야 하며 그를 위해서는 실제 움직임을 추적하고 문제해결을 위한 핵심 아이디어를 포착해야 한다.

어떻게 아이디어를 포착할까? 어떤 알고리즘 문제든 감각적으로 아이디어가 안 떠오를 때 가장 해볼법한 것은 실제로 원반을 하나씩 옮겨보는 것이다. 우리도 그렇게 해보자. 그리고 중요한 것은 언제나 문제를 작게 만들어 해결하고 이후 확대하는 것이다. 그런 의미에서 원반을 3개에서 시작해보자. 이렇게 그려본 후, 문제 해결을 위해 내가 선택한 세 가지 통찰을 확인한다.

Hanoi tower process of each move

와… 이거 그리는 거 힘들었다. 원반의 개수가 3개일 때, 각 움직임을 표현하고 있다. 이동횟수를 최소로 할 때 총 7번을 이동해야 하며 정해진 규칙을 지키면서 최종적으로 ‘C’ 막대에 모든 원반이 위치하게 된다. 각 움직임을 눈으로 쫓기 바란다. 원반이 2개, 4개일 때 직접 그려보는 것도 매우 도움이 된다.

이때 우리는 각 움직임을 한 문장씩 출력한다고 했다. 우리가 원하는 함수(\(hanoi(3)\))의 실행결과는 다음과 같을 것이다.

자, 이제 우리가 할 것은 작은 입력을 통해 문제를 직접 풀어본 뒤 이를 통해 문제 해결을 위한 통찰, 즉 핵심 아이디어를 얻는 것이다. 그를 바탕으로 문제를 프로그래밍 가능하게 보다 구체적으로 재정의할 것이다.

3.1. 재귀

앞서 여러 번 언급했지만 재귀는 이 문제의 성패를 가르는 통찰이다. 재귀(recursion)란 같은 형태의 보다 작은 입력을 지닌 자기 자신을 호출하는 것이고, 이렇게 재귀적인 호출을 사용하는 함수를 재귀함수라고 한다. 재귀함수의 활용은 내 알고리즘 포스트에서 많이 사용됐기 때문에 이쯤 넘어가도록 하자.

이 문제 어디에서 재귀의 여지가 있을까? 일단 우리가 정의한 함수의 명세를 다시 보자.

  • hanoi(N): N개의 원반을 어쩌고 저쩌고 해서 다른 곳으로 옮겨라.

이때 위의 7번의 움직임은 모두 hanoi(N) 의 과정이다. 그러면 hanoi(N-1) 은 뭘까? 정의에 따라 다음과 같을 것이다:

  • hanoi(N-1): (N-1)개의 원반을 어쩌고 저쩌고 해서 다른 곳으로 옮겨라.

뭐 충분히 가능한 해석이다. 원반을 100개를 옮길 수도 있고, 그보다 1개 작은 99개 옮기는 것도 얼마든지 핍 이해하기 가능할테니까. 내가 원하는 것은 hanoi(N) 에서 hanoi(N-1) 가 발견되냐는 것이다. 이를 현재 문제에 적용하면 hanoi(3) 이니 hanoi(2) 가 발견되는지가 될 것이다.

이 조건을 충족할 때 재귀를 전략적으로 사용할 수 있다. 위 그림에서 찾아보자.

단서는 start와 4번째 움직임 후. 먼저 맨 처음을 보자. 규칙에 따라 3번째 원반을 ‘A’에서 ‘C’로 옮기려면 위의 두 원반은 ‘B’ 원반에 이미 꽂혀 있어야 한다. 즉 여기서 hanoi(핍 이해하기 2) 가 보인다.

또 4번째 그림. 2개의 원반을 ‘B’에 꽂은 후 3번째 원반을 ‘C’로 옮겼다. 이제 2개의 원반을 다시 ‘B’에서 ‘C’로 옮겨야 한다. 여기서도 hanoi(2) 가 쓰이고 있다.

여기서 알 수 있는 핍 이해하기 것은 hanoi(N) 은 두 번의 hanoi(N-1) 재귀 과정을 수반한다는 것이다. 한 번의 재귀 후 가장 큰 원반(N번째 원반)을 목적지로 옮기고, 다시 마지막 재귀를 통해 나머지 N-1개의 원반을 목적지에 옮긴다. 즉, hanoi(N)은 세 번의 과정으로 나눌 수 있다.

3.2. 출발점, 도착점, 경유점

좋아, 재귀의 가능성을 찾은 것은 큰 성과다. hanoi(N) 함수를 어떻게든 hanoi(N-1) 를 활용한 형태로 표현가능할 것이라는 단서를 찾았다. 근데 여기서 다가 아니고 추가적인 정보가 필요하다.

앞서 N개의 원반을 옮기는 작업에는 두 번의 재귀 과정이 있다고 했다. 이때 각 재귀 과정이 의도하는 바가 조금씩 다르다. 위의 그림을 참고하면 다음과 같이 구분할 수 있다.

  • 첫 번째 재귀: N-1 개의 원반을 ‘A’에서 ‘B’로 옮긴다.(start)
  • 두 번째 재귀: N-1 개의 원반을 ‘B’에서 ‘C’로 옮긴다.(4번)

두 재귀는 옮기는 원반의 개수는 같지만 원반을 움직이는 출발지와 목적지가 다르다. 핍 이해하기 그리고 이 정보는 현재 러프하게 정의한 hanoi 함수에서 추적하지 않고 있는 정보이기도 하다. 우리의 문제 정의에서 출력은 각 움직임의 출발지와 목적지도 같이 기술해야 하기 때문에 함수에서 이 두 정보를 같이 추적해줘야 한다. 따라서 원 함수의 입력이 원반의 개수만 받았다면 이제는 최소 출발지, 도착지의 변수까지 추가로 받아야 한다.

여기에 더해 경유점 이라는 개념도 사용하자. 만약 ‘A’에서 ‘C’로 3개의 원반을 이동할 때 ‘B’ 막대도 결국 사용해야 한다. 이렇게 세 개의 입력을 같이 입력해줘야 원반을 하나씩 이동할 때 경유점을 지날 때도 문제없이 출력할 수 있다.

3.2. 문제 분해

이제 문제 해결과 관련된 핵심 재귀식을 만들어보자. 앞선 그림에서 순차적으로 얻을 수 있다. 먼저 보다 구체화된 문제를 다시 한 번 정의해보자.

hanoi(N, start, to, via): start에서 to로 via를 거쳐 총 N개의 원반을 운반할 때 각 이동 과정을 출력하라

앞선 문제보다 훨씬 구체화됐다. 그러면 위의 3개의 원반을 옮기는 과정은 다음 함수로 표현할 수 있다.

그리고 hanoi 함수는 두 번의 재귀와 한 번의 가장 큰 원반을 옮기는 과정이 필요하다고 했다. 즉, 전체 과정을 세 과정의 연속으로 분해가능한 것이다. 이때 각 과정은 순차적으로 이루어지는데 그 순서는 다음과 같다. 이 과정은 그림과 같이 확인하라.

  1. hanoi(2, ‘A’, ‘B’, ‘C’) : start에서 3번까지
    • 3번 원반을 ‘C’로 옮기기 위해서는 먼저 위의 두 원반을 ‘B’로 옮겨야 한다.
  2. 이후 3번 원반을 ‘C’로 옮긴다 : 4번
  3. hanoi(2, ‘B’, ‘C’, ‘A’) : 5번 ~
    • 3번을 ‘C’로 옮긴 후 ‘B’에 있는 두 개의 원반을 ‘C’로 옮긴다. 이때 ‘A’를 경유한다.

원반의 개수(\(N\))가 몇 개가 되든 결국 이 과정을 거친다. 한 번의 재귀, 가장 큰 원반 옮기기 이후 다시 한 번의 재귀. 물론 이때 예외가 있다. \(N\)이 1일 때는 자신의 위에 원반이 없기 때문에 재귀가 필요없고 바로 원반을 옮기고 종료한다. 이것이 곧 재귀함수의 탈출 조건, 또는 기저 사례(base case)가 된다. 이제 이 식을 실제 수식으로 표현해보자.

\[ \text(N, start, to, via) = \displaylines < \beginmove(1, start, to) & \quad \text, \\ hanoi(N-1, start, via, to) + move(N, start, to) + hanoi(N-1, via, to, start) & \quad \text \end > \]

각 재귀함수에서 인자의 순서가 헷갈리기 쉽다. 헷갈리지 말자.

  1. 첫 번째 재귀에서는 맨 밑의 N번째 원반을 목적지로 옮기기 위해 위의 N-1 개의 원반을 경유지로 옮긴다.
  2. 그 다음 N 번째 원반을 목적지로 옮긴다.
  3. 경유지에 있는 N-1 개의 원반을 to로 옮긴다.

이게 핵심이다. 그러면 이제 할 수 있는 질문은 ‘이러면 진짜 풀려??’ 일 수 있는데, 코드를 짜고 실행시켜 보면 알 수 있겠다.

4. 실제 코드

재귀함수는 많은 경우 재귀식을 표현만 할 수 있으면 그대로 풀린다. 위에서 정의한 함수 그대로 코드를 작성해보자.

먼저 실제로 원반을 옮기는 move 함수를 정의한다. 메시지 형식은 위에서 정의한 그대로 사용한다. 이때 기억하자. 실제 데이터와 데이터를 표현하는 형식은 별개의 것이므로, 이 둘을 분리하면 좋다. MSG_FORMAT 은 형식에 불과하고, 실제 데이터는 N, start, to 다. 이렇게 역할에 맞게 분리하는 습관은 결국 정답이다.

정말 위에서 정의한 재귀식 그대로 함수를 만들었다. 기억하자. 설계가 코딩에 앞선다는 것. 설계 없는 코딩은 전기와 노동력, 시간을 잡아먹는 바보 같은 짓이다.

이제 함수가 돌아가는지 실행해볼까?

따라가 보라. 정말 기가 막히게, 핍 이해하기 다시 말해 이 문제의 조건을 어기지 않으며 원반을 옮긴다. 시간과 용기가 허락한다면 \(N\)을 4, 5로 키워서 실행해보라. 문제없이 동작할 것이다.

이렇게 원반을 옮기는 각 과정을 추적하는 형태의 하노이의 탑 문제는 해결이 됐다.

5. 번외: 원반의 개수에 따른 총 이동횟수 구하기

앞선 ‘문제 정의’ 절에서 우리는 원반을 움직이는 각 이동의 과정을 출력하도록 하노이의 탑 문제를 정의했다. 하지만 이번에는 조금 다른, 상대적으로 수학적인 하노이의 탑 문제를 풀어보려고 한다. 원반의 개수가 N일 때, 원반을 모두 옮기는 데 드는 이동 횟수는 몇 번일까?

확실히 앞선 문제와는 궤를 달리 한다. 앞서 작성한 함수는 원반의 개수가 3일 때 7번의 print 문이 실행되는데 이번 문제에서는 이렇게 7을 구하면 된다. 즉, 이번 문제는 원반의 개수 N에 따른 하노이의 탑 이동횟수에 대한 일반식을 구할 수 있을까?이고, 확실히 앞선 문제에 비해 수학적이다.

천천히 접근해서 먼저 함수를 정의하고 시작하자. 앞선 함수는 원반의 개수(N)뿐 아니라 출발지와 목적지에 대한 정보도 필요했다. 어디에서 어디로 옮기는지를 모두 출력해야 했기에 당연하다. 하지만 이 문제에서는 구체적인 출발지와 목적지에 대한 정보는 필요없다. 단순히 총 이동횟수만 구하면 되기 때문이고 따라서 이번 함수에서는 이 정보들을 무시한다. 결국 함수를 정의하면 다음과 같다.핍 이해하기 핍 이해하기

hanoi(N): N개의 원반을 옮기는 하노이의 탑 문제의 총 이동 횟수를 구하라

이때 각 함수는 마찬가지로 재귀식으로 짤 수 있다.

\[ \text(N) = \displaylines < \begin1 & \quad \text, \\ 2 \times hanoi(N-1) + 1 & \quad \text \end > \]

앞선 함수와 핵심 재귀 논리는 동일하다. 원반의 개수가 1개일 때는 눈치보지 않고 바로 옮기면 되고, 아니면 위의 원반을 옮기고 자신을 옮긴 뒤 다시 남은 원반을 목적지로 옮긴다.

이제 문제는 이 재귀식에서 일반항을 어떻게 도출할 수 있는가이다. 그 과정이 결코 어렵지 않으니 따라가보자.

\[ \displaylines < hanoi_n = hanoi_\times 2 + 1 \\ \text \\ hanoi_n + 1 = 2 \times (hanoi_ + 1) \\ hanoi_ + 1 = 2 \times (hanoi_ + 1) \\ hanoi_ + 1 = 2 \times (hanoi_ + 1) \\ \vdots \\ hanoi_2 + 1 = 2 \times (hanoi_1 + 1) > \]

\[ \displaylines < \text\\ (hanoi_n + 1)(hanoi_ + 1) \cdots (hanoi_2 + 1) = 2^(hanoi_ + 1) \cdots (hanoi_1 + 1) \\ \text \\ (hanoi_n + 1) = 2^ \times (hanoi_1 + 1) \\ hanoi_1 \text \\ (hanoi_n + 1) = 2^n > \]

이렇게 N개의 원반을 옮기는 하노이의 탑 문제의 이동횟수의 일반항을 구할 수 있었다. 결국 2의 지수식이 나오는데 각 함수가 두 번의 재귀식을 실행시킨다는 것을 알면 감각적인 사람들은 대충이라도 유추할 수도 있었을 것이다. 나는 못했다. ㅋㅋ

6. 마치며

오늘은 그 유명한 하노이의 탑 문제를 풀어봤다. 이 문제는 병합정렬과 마찬가지로 재귀 를 연습하는 데 정말 좋은 문제로 재귀가 익숙하지 않은 분들은 꼭 복기하시면 좋겠다. 우리는 이 문제를 해결하기 위한

이상 세 개의 통찰을 발견할 수 있었고 이를 통해 각 움직임을 포착하는 함수를 작성할 수 있었다.

번외로 각 움직임을 포착하는 것이 아닌, 총 이동횟수를 구하는 일반항까지 구할 수 있었다. 문제는 정하기 나름이라는 것, ‘주제’와 ‘문제’는 구분할 필요가 있다는 것을 기억하자.


0 개 댓글

답장을 남겨주세요