본문 바로가기
기타

Karel(카렐)로 프로그래밍 맛보기!

by 디디 ( DD ) 2022. 10. 28.

 

 

 코딩 입문자용 강의를 찾다가 Karel이라는 것에 대해 알게 되었다.

Karel이란 스탠퍼드 대학에서 만든 일종의 교육용 프로그래밍 게임이다.

초보자로서 프로그래밍을 접하기에 괜찮을 것 같아 한번 해보기로 했다.

 

https://stanford.edu/~cpiech/karel/learn.html

 

Learn to Program

 

stanford.edu

 

 

사이트에 접속하면 이런 화면이 뜬다.

중간의 Start버튼을 눌러 시작하면 된다.

밑의 회색 사각형들은 각 Unit을 의미한다.

 

 

사이트가 전부 영어로 되어 있지만 대부분 쉬운 단어로 이루어져 있고, 진행 방식이 직관적이라 큰 어려움은 없었다.

Karel이라는 로봇을 주어진 상황에 맞게 움직이면 되는데, 어 이거 어딘가 익숙하다 싶었다.

내가 처음으로 접했던 프로그래밍 강의인 부스트코스의 <처음 배우는 프로그래밍 (w.python)>에서 휴보라는 로봇을 움직여봤던 기억이 떠올라 반가웠다.

 

 

참고로 아래의 캡처본은 Karel 에서 사용하게 되는 Reference들이다.

 

 

 

그렇게 Unit 7 까지는 금방 넘어갈 수 있었다.

처음으로 막히게 된 부분은 Unit 8의 Lesson 3 부분이었다.

풀고 보니 별거 아니었다. 처음에 putBeeper(); 만 추가해 주면 된다.

 

 

 

정말 어려웠던 건 Unit 8 Lesson 5였다. 꽤 오랫동안 붙잡고 있었다.

While을 사용하여 심플한 코드를 만들고 싶었는데 자꾸만 무한 반복을 하거나 벽에 부딪혀 에러가 났다.

결국 포기하고 일일이 움직여 보기로 했다. 최대한 코드 길이를 줄여서..

Unit 8 Lesson 5 오답

모양새는 얼추 맞게 나왔는데 게임에서 원하는 답은 이게 아니었는지 왼쪽 Goal은 틀렸고, 오른쪽 Goal은 맞았다는 결과가 나왔다.

이때쯤 답을 구글링해 볼까 싶었지만 어설프게라도 내 답을 내서 정답과 비교해 봐야 더 의미가 있을 것 같아 좀 더 고민해 보기로 했다.

그렇게 다양한 시도 끝에 내가 낸 정답!

검색해 보니 많은 사람들이 어려워하는 문제인 것 같았다.

다른 사람들의 답을 보며 이렇게 코드를 정리할 수도 있구나 비교해 볼 수 있었다.

leftIsClear 사용하기, 짝수 칸이므로 한 줄씩 세팅하기가 힌트가 될 수 있을 것 같다.

 

 

 

다음으로 막힌 부분은 Unit 9 Lesson 2.

Unit 9 Lesson 2 문제

if를 이용하여 beeper가 있는 상황에서 위로 한 줄씩 만들 수 있게 움직이려 했는데, 마지막 자리에 beeper를 놓는 순간 코드가 꼬여버린다. 

그렇게 내가 낸 답은 이렇다. Unit 8 Lesson 5보다 시간은 덜 걸렸지만 좀 얼떨결에 풀었다는 느낌이 들었다.

if를 사용할 땐 범위를 잘 설정해야 의도와 다른 엉뚱한 결과가 나오지 않는다. 이 점이 이 문제 풀이의 포인트인 것 같다.

 

 

 

Unit 10, 11은 에러가 뜨며 진행이 되지 않았다. 찾아보니 사이트 자체에 문제가 있는 것 같았다.

그대로 패스하고 대망의 Unit 12 Lesson 1.

어렵다는 이야기를 많이 봐서 좀 겁이 났지만 도전!

중간에 beeper를 놓고 가라는 것 같은데, 5×5에서도 7×7에서도 중심을 찾을 수 있는 방법을 찾아야 했다.

달팽이 모양으로 움직여 볼까 홀수 짝수를 이용해볼까 고민을 하다가 양옆을 반복해서 움직이며 beeper를 놓아 먼저 중심을 찾은 뒤 되돌아가 Goal의 모양을 만들어 보기로 했다.

Unit 12 Lesson 1 정답

여러 시행착오 끝에 내가 낸 답은 이렇다. 생각보다 오래 걸리진 않았지만 확실히 생각할 게 많은 문제였다.

중간에 코드를 한번 날려서 그 이후로는 실행할 때마다 메모장에  옮겨 놓았다. 

 

function main(){
   putBeeper();
   while(frontIsClear()){
      move();
   }
   putBeeper();
   setting();
   go(); //초기세팅
   while(noBeepersPresent()){
      putBeeper();
      move();
      go();
   }
   pickBeeper();  //중심찾기
   while(frontIsClear()){
      move();
   }
   turnAround();
   pickBeeper();
   while(frontIsClear()){
      move();
         if (beepersPresent()){
            pickBeeper();
         }else{
            putBeeper();
      }
   }
}

function setting(){
   turnAround();
   move();
}
   
function go(){
    while(noBeepersPresent()){
      move();
   }
   setting();
}

 

다른 사람들의 답을 찾아보니 정말 다양한 방법, 신박한 방법들이 있었다.

나랑 비슷한 느낌으로 푼 사람도 있었고, 내가 처음 생각했던 것처럼 달팽이 모양으로 중심을 찾은 사람, 대각선을 사용하여 중심을 찾은 사람도 있었다. 홀수×홀수 정사각형 상황임을 이용하여 2:1비율로 중심을 찾는 풀이를 봤을 땐 나도 모르게 입 밖으로 우와 소리가 나왔다. 이런 방법이 있었다니.

 

모든 Unit을 진행하는 데에 꼬박 하루가 걸렸다. 하지만 어려운 문제의 답을 찾을 때마다 정말 뿌듯했고, 다른 사람들의 답과 비교해 보는 것도 재미있었다. 

 

 

 

+ 더 많은 문제를 풀어볼 수 있는 곳이 있대서 아래 주소로 들어가봤다.

http://telnicky.github.io/kareljs/

 

http://telnicky.github.io/kareljs/

Welcome, I am Karl the robot. My world contains green beepers and I need your help to organize them. On the screen you have a text editor, the code you write in the text editor will help me navigate through my world. Remember karl understands javascript, s

telnicky.github.io

두 문제를 풀어봤는데 이게 맞는 답인지 확인할 방법이 딱히 없어 재미로 참고만 해야 할 것 같다.

뒤쪽 레벨 문제들은 꽤 어려워 보였는데, 시간이 날 때 마저 해봐야겠다.

 

 

 

 

 

댓글