728x90
반응형
SMALL

 

문제 설명

 

게임개발자인 "죠르디"는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
"죠르디"는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.

 

게임 화면은"1 x 1"크기의 칸들로 이루어진"N x N"크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1, 5, 3] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.

 

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형두 개가 없어집니다.

 

크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

[제한사항]

board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.

board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.

0은 빈 칸을 나타냅니다.

1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.

moves 배열의 크기는 1 이상 1,000 이하입니다.

moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

입출력 예

board moves result
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

입출력 예에 대한 설명

입출력 예 #1

인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.

 

================================================================================

문제풀이

- 먼저 인형을 담을 공간 리스트 변수(temp로 선언)를 선언하고 moves 변수의 값을 이용하여 board 로 부터 인형을 하나씩 옮겨 담는다. 이때 인덱스 를 1씩 증가 시키면서 0이 아닌 수를 찾는다. 만약 찾으면 그 칸은 0 으로 저장하고 찾은 수(인형)은 temp에 append 시킨다.

- moves 에 저장된 값들이 실행이 되고 temp 리스트 끝에서 처음으로 이동하면서 2개씩 연속된 숫자들이 있는지 찾는다. 이때 있으면 제거하고 다시 temp의 끝에서 처음으로 이동한다. 이동 index 가 0보다 클때까지 반복한다.

def solution(board, moves):
    
    answer = 0
    temp = []
    
    # 옮기는 코드
    for i in moves:
        for j in range(len(board)):
            if board[j][i-1]!=0:
                temp.append(board[j][i-1])    
                board[j][i-1] = 0
                break
    
    #연속된 인형(수) 있는지 찾는 코드
    i = len(temp)-1
    while i>0:
        if (temp[i] == temp[i-1]):
            del temp[i-1:i+1]
            i = len(temp)-1
            answer += 2
            
        else:
            i -= 1
            
    return answer

 

728x90
반응형
LIST
728x90
반응형
SMALL

tkinter 를 이용한 마우스 이벤트는

window에 bind 함수를 이용하여 마우스 이벤트를 각각 연결시킨다.

 

이때 bind() 함수는 다음과 같이 두 개의 이자를 가져야 한다.

 - bind("이벤트명",연결함수) #이벤트 연결을 위한 가장 중요한 함수!!!!!

 

이벤트 종류는 다음과 같다.

<Button-1> : 마우스 왼쪽 버튼 클릭
<Button-2> : 마우스 중간 버튼 클릭
<Button-3> : 마우스 오른쪽 버튼 클릭
<Button-4> : 마우스 휠을 스크롤바에서 위로 올릴 때(scroll up event)
<Button-5> : 마우스 휠을 스크롤바에서 아래로 내릴 때(scroll down event)
<ButtonPress> : 아무 마우스 버튼이라도 눌리면 호출 된다. 휠까지도
<Double-Button-1> : 마우스 왼쪽 버튼 더블 클릭
<Double-Button-2> : 마우스 중간 버튼 더블 클릭
<Double-Button-3> : 마우스 오른쪽 버튼 더블 클릭
<Return> : 엔터가 눌러짐
<Key> : 키가 눌러짐
<Enter> : 마우스 포인터가 위젯에 들어올 때
<Leave> : 마우스 포인터가 위젯을 떠날때
<Configure> : 위젯 사이즈에 변화가 있을때

 

이중에서 마우스와 관련 된 이벤트를 적용한 코드 예제는 아래와 같다.

from tkinter import *

class MouseEvent:
    def __init__(self):
        window = Tk()
        window.title("마우스 이벤트")
        window.geometry("640x480")
        
        self.canvas=Canvas(window, bg ="white")
        self.canvas.pack(expand=True, fill=BOTH)
        window.bind("<Button-1>",self.MouseClickEvent)
        window.bind('<Double-1>', self.MouseDoubleClickEvent)
        window.bind('<B1-Motion>', self.MouseMotionEvent) 

        self.mousestr = "Mouse: "
        self.mouse_id = self.canvas.create_text(320,240,font="Times 15 italic bold",text=self.mousestr)    
        self.canvas.create_text(320,360,font="Times 15 italic bold",text="Mouse Event Example")
        
        while True:
            #
            self.canvas.itemconfigure(self.mouse_id, text=self.mousestr)
            #
            window.after(33)
            window.update()

    def MouseClickEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 클릭 이벤트 발생"
        

    def MouseDoubleClickEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 더블 클릭 이벤트 발생"

    def MouseMotionEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 모션 이벤트 발생"


MouseEvent()
728x90
반응형
LIST
728x90
반응형
SMALL

문제 설명
두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항
3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
X, Y는 0으로 시작하지 않습니다.
X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

 

입출력 예

X Y result
"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

-------------------------------------------------------------------------------------------

문제 풀이

 

(다양한 방법의 풀이가 있으나) 여기서는 dictionary 타입으로 각 문자의수를 저장하고, 유일한 키값 해시를 이용하여 문자의 수를 하나씩 차감함으로써 문제를 해결한다.

각 테스트 데이터에 대한 H 는 다음과 같다.

 

- 테스트 데이터 1: H = {'2': 1, '3': 1, '4': 1, '5': 1}

-  테스트 데이터 2: H = {'2': 1, '0': 2, '3': 1, '4': 1, '5': 1}

-  테스트 데이터 3: H = {'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '0': 1}

-  테스트 데이터 4: H = {'4': 1, '2': 1, '5': 1, '3': 1, '1': 1}

-  테스트 데이터 5: H = {'1': 1, '2': 1, '5': 2}

 

def solution(X, Y):
    answer = ''
    H = {}
    
    for i in Y:
        if i not in H:
            H[i] = Y.count(i)
    
    for i in X:
        if i in H and H[i] > 0:
            answer += i
            H[i] -= 1
            
    answer = "".join(sorted(list(answer),reverse=True))
    
    if len(answer)==0: return "-1"
    elif len(answer)==answer.count("0"): return "0"
    
    return answer

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

 

VMWare 로 우분투 설치 또는 부팅시 검은 화면이 나타나거나 깜박일때, 부팅이 제대로 안될때 부팅이 멈출때 해결 방법

Virtual MAchine Settings 화면에서 Display 탭의 3D graphics 옵션을 아래와 같이 해제한다

이후 이상없이 동작하는 것을 확인함

Virtual Machine Settings

 

우분투 부팅 화면

 

 

우분투 시작화면

 

728x90
반응형
LIST
728x90
반응형
SMALL

***VMWare 우분투 설치 또는 부팅시 검은 화면이 나타나거나, 제대로 부팅이 안될 때(error) 부팅이 멈출때, 화면 깜박임 해결 방법 은아래 글에서 확인하세요....***

 

VMWare 우분투 설치 또는 부팅시 검은 화면이 나타나거나, 제대로 부팅이 안될 때(error) 부팅이 멈

VMWare 로 우분투 설치 또는 부팅시 검은 화면이 나타나거나 깜박일때, 부팅이 제대로 안될때 부팅이 멈출때 해결 방법Virtual MAchine Settings 화면에서 Display 탭의 3D graphics 옵션을 아래와 같이 해제한

ckang.tistory.com

 

***VMWare 무료 다운로드 우분투 설치방법***

 

1. https://www.vmware.com/ 접속해서 다운로드 받으려고 하면 다음과 같이 링크가 깨져 있다.

 

 

2. 다음 설치파일 경로로 바로 접속 하면 다운로드가 가능하다 (VMware-player-17.5.2-23775571.exe.tar 파일다운로드)

  https://softwareupdate.vmware.com/cds/vmw-desktop/player/17.5.2/23775571/windows/core/

 

CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop/player/17.5.2/23775571/windows/core

 

softwareupdate.vmware.com

 

3. 다운로드 후 압축을 풀고 설치 파일 클릭

 

4. 설치를 위한 setup 창이 나타나고 Next 버튼 클릭으로 진행하면 된다.

 

 

 

 

5. 설치가 끝나고 실행시키면 무료 또는 라이센스 입력 창이 나타난다.(난 상업용이 아니기 때문에 무료 사용 클릭후 Continue 클릭) 

6. 마지막으로 아래와 같이 창이 나타난다. Finish 버튼 누르면 설치 완료

 

 7. VMWare 실행 화면 은 다음과 같다.

 

8. Ubuntu 다운로드(https://ubuntu.com/ 접속)

우분투 홈페이지 접속

9. Get Ubuntu -> Download Ubuntu Desktop 클릭

10. Download 24.04 LTS 클릭 다운로드(ubuntu-24.04-desktop-amd64.iso 5.69GB)

 

11. 다운로드가 완료되면 VMware 에 우분투를 설치해 보자 VMWare 창에서 Create a New Virtual Machine 클릭

 

 

12. 방금 다운로드 받은 iso 파일 선택

13. Next 후 아래와 같이 Full name, User Name, password 설정

 

14. 설치될 가상머신(=우분투)의 경로, 할당될 하드디스크 용량 등을 설정하고 최종 하드웨어 스펙을 확인한다.

 

15. Finish를 누르면 아래와 같이 Ubuntu 설치 시작한다.

**설치시 아래와 같은 update 창이 뜨면 Download and Install 클릭

** 우분투 설치시 또는 설치후 설치시 검은화면이 뜨거나 화면 깜박임 발생시 해결방법: https://ckang.tistory.com/79

 

16. 언어 선택(한국어) -> Accessibility in Ubuntu 설정 -> 키보드레이아웃 선택 -> 네트워크 연결이 나타난다.

   *** 네트워크 연결화면에서 나중에 패키지 설치에 대한 번거로움을 피하려면 네트워크 연결 하자


 

 

 

 

17. 다음을 계속 누르면 다음과 같은 화면이 나타난다.

 우분투를 시스템에 설치할 것인가? 우분투 체험을 할 것인가? 묻는 화면이다. 그냥 설치하자. ㅎㅎ

 

 

 

18. 다음 화면은 우분투는 대화형 설치(Interactive Installation)와 자동화 설치(Automated Insatallation) 방식을 묻는 화면이다. 난 대화형 선택 후 다음 클

* 대화형 설치(Interactive Installation): 사용자가 우분투 24.04 설치 도우미와 상호작용하여 설치에 필요한 각종 설정 정보를 우분투 설치 프로그램에 제공하여 설치를 진행하는 방식

* 자동화 설치(Automated Installation): 고급 사용자가 이용하는 방식으로, 사용자는 우분투 설치에 필요한 각종 설정 및 설치 패키지 정보를 autoinstall.yaml 파일에 작성하고, 우분투 설치 도우미 프로그램이 해당 파일을 읽어 거기에 담긴 정보대로 우분투를 자동으로 설치케 하는 하는 방식

 

 

 

19. 다음은 기본 설치(Default selection)를 할것인가? 확장설치(Extended selection)을 할 것인가? 묻는다. 차이는 기본설치는 정말 기본 패키지만 설치되고 확장설치는 필요한 Utility가 함께 설치된다. 그래서 난 확장설치 선택 ^^

 

 

20. 다음으로 추가 필요한 프로그램들을 설치를 묻는다. 아래와 같이 두개 다 클릭해서 다음 선택

 

 

21. 일반적으로 디스크 지우고 Ubuntu 설치 선택 후 다음

 

22. 계정이름 암호설정

 

23. 모든 설치준비가 완료 되었으면 설치 버튼 클릭

 

 

24. 우분투 설치 중 화면

**설치시 오른쪽 아래 사각형 을 클릭하면 아래와 같은 설치 내용들을 확인할 수 있다.

 

 

25. 우분투 설치 완료

 

26. 설치완료후 ubuntu 시작 화면

728x90
반응형
LIST
728x90
반응형
SMALL

제1장: 운명의 만남

해가 서서히 지고, 붉은 노을이 산맥을 물들이기 시작했다. 고요한 산속에는 작은 마을이 하나 자리 잡고 있었는데, 그 이름은 청운촌이었다. 청운촌은 평화롭고 외부와의 교류가 적어 외부의 분란에 영향을 받지 않는 곳이었다. 하지만 이 평화로움도 오래가지 못할 운명이었다.

마을 입구에는 허름한 주막이 하나 있었고, 그 주막 앞에는 허름한 도복을 입은 청년이 앉아 있었다. 그의 이름은 강진이었다. 강진은 부모님을 잃고 이곳저곳을 떠돌던 고아였다. 오늘도 그는 배를 채우기 위해 주막에서 허드렛일을 하고 있었다.

“강진, 물 좀 더 가져다 줄 수 있겠니?” 주막 주인인 노인이 말했다.

“네, 지금 가져다드리겠습니다.” 강진은 미소를 지으며 재빨리 물을 길러 갔다.

그때, 주막 문이 요란하게 열리며 낯선 이가 들어왔다. 그는 날카로운 눈빛과 단단한 몸매를 가진 중년의 남자였다. 그의 이름은 무림의 고수로 알려진 천운검 이청이었다. 이청은 뭔가 급한 일이 있는 듯 얼굴에 긴장감이 역력했다.

“이곳에 물을 좀 부탁하오.” 이청이 말했다.

강진은 그에게 물을 건네주며 그를 유심히 바라보았다. 이청의 눈빛에서 무언가 특별한 것이 느껴졌기 때문이다. 이청은 물을 마시며 강진을 살짝 흘끗 보았다. 그 눈빛 속에는 무언가를 발견한 듯한 기색이 담겨 있었다.

“젊은이, 너의 이름은 무엇이냐?” 이청이 물었다.

“강진이라고 합니다.” 강진이 답했다.

“흠, 강진이라... 네가 이곳에서 무얼 하고 있느냐?”

“저는 그냥 이곳에서 일을 하며 지내고 있습니다.” 강진은 겸손하게 말했다.

이청은 잠시 생각에 잠기더니, 강진에게 다가가 조용히 말했다. “너는 평범한 사람이 아니로구나. 너의 눈빛에서 강한 의지를 보았다. 나와 함께 무공을 배우지 않겠느냐?”

강진은 놀랐다. 무공을 배운다는 것은 그의 꿈이었지만, 그는 자신이 그런 기회를 가질 것이라고는 상상도 하지 못했다. 하지만 이청의 진지한 눈빛에 강진은 마음이 움직였다.

“저... 정말 저 같은 사람이 무공을 배울 수 있을까요?” 강진이 물었다.

“그렇다. 네 안에는 특별한 재능이 있다. 내가 그것을 길러주마.” 이청이 말했다.

그렇게 강진은 이청과 함께 떠나기로 결심했다. 그의 새로운 여정은 이제 막 시작된 것이었다. 무공을 배우고, 자신의 운명을 찾아가는 길은 쉽지 않을 것이었지만, 강진은 결코 두려워하지 않았다. 그의 마음속에는 강한 의지와 결단력이 불타오르고 있었다.

 

=========================================================================================

제2장: 첫 번째 시험

이청은 강진을 데리고 깊은 산속의 은거지로 향했다. 그곳은 외부와 단절된 조용한 곳으로, 무공을 연마하기에 최적의 장소였다. 이청은 강진에게 기초부터 차근차근 가르치기 시작했다.

“무공을 배우려면 우선 마음을 다스리는 법을 배워야 한다. 마음이 흔들리면 무공도 흔들린다.” 이청이 말했다.

강진은 이청의 말을 따라 마음을 가라앉히고 집중하려 애썼다. 그의 첫 번째 시험은 마음의 평정을 찾는 것이었다. 며칠 동안 그는 깊은 산속에서 명상을 하며 마음을 다스리는 훈련을 받았다. 처음에는 어려웠지만, 점차 마음을 가라앉히는 법을 배우게 되었다.

어느 날, 이청은 강진에게 무공의 기초 동작을 가르치기 시작했다. “이제는 몸을 단련할 차례이다. 기초 동작을 반복하여 몸에 익혀야 한다.”

강진은 하루 종일 반복되는 훈련에 지치기도 했지만, 결코 포기하지 않았다. 그의 노력은 조금씩 성과를 보이기 시작했다. 몸은 점점 강해졌고, 동작은 점점 더 유연해졌다.

그러던 어느 날 밤, 강진은 꿈속에서 자신이 강력한 무공을 사용하는 모습을 보았다. 그 꿈은 마치 현실처럼 생생했다. 깨어난 강진은 그 꿈이 단순한 환상이 아니라고 느꼈다. 그것은 그가 반드시 이루어야 할 목표라는 것을 깨달았다.

“이청 사부님, 저에게 더 많은 것을 가르쳐 주세요. 저는 더 강해지고 싶습니다.” 강진이 말했다.

이청은 미소를 지으며 고개를 끄덕였다. “좋다, 네 의지가 강하니 내가 너를 가르치는 보람이 있구나. 하지만 기억하라, 진정한 강함은 마음에서 나오는 법이다.”

강진은 이청의 가르침을 가슴에 새기며 더욱 열심히 무공을 연마했다. 그의 앞에는 수많은 도전과 시련이 기다리고 있었지만, 그는 결코 포기하지 않을 것을 다짐했다. 그의 무협 여정은 이제 막 시작되었을 뿐이었다.

=================================================================================

제3장: 숨겨진 비밀

깊은 산속의 은거지에서 몇 달이 흐르고, 강진은 이청 사부와 함께 무공 수련에 매진했다. 그의 몸은 강해졌고, 마음은 한층 더 단단해졌다. 어느 날, 이청은 강진에게 새로운 과제를 제시했다.

“강진아, 이제 너에게 중요한 임무를 맡기려 한다. 이 산 깊은 곳에는 ‘천검’이라 불리는 전설의 검이 숨겨져 있다. 이 검을 찾아야만 너의 수련이 한 단계 더 나아갈 수 있다. 천검을 찾는 것은 결코 쉽지 않을 것이다. 수많은 시련이 너를 기다리고 있으니 마음을 단단히 먹어라.”

강진은 결심을 굳히고 산을 오르기 시작했다. 산속은 깊고 험준했으며, 길을 찾기가 어려웠다. 하지만 강진은 포기하지 않고 계속해서 앞으로 나아갔다. 그의 마음속에는 천검을 반드시 찾아야겠다는 결의가 불타오르고 있었다.

길을 가던 중, 강진은 우연히 작은 폭포 옆에 있는 동굴을 발견했다. 동굴 입구에는 낡은 비석 하나가 서 있었다. 비석에는 고대 문자가 새겨져 있었고, 강진은 그것을 읽기 위해 애썼다.

“여기서 진실한 마음을 가진 자만이 천검을 찾을 수 있으리라.” 강진은 비석의 글귀를 읽고 마음을 다잡았다. 그는 동굴 안으로 들어갔다.

동굴 안은 어둡고 습기가 가득했다. 강진은 조심스럽게 발걸음을 옮기며 앞으로 나아갔다. 그때, 갑자기 눈앞에 빛나는 무언가가 나타났다. 그것은 바로 천검이었다. 천검은 은은한 빛을 발하며 강진을 맞이하고 있었다.

강진은 천검에 다가가 손을 뻗었다. 하지만 순간, 강력한 힘이 그를 뒤로 밀쳐냈다. 천검을 얻기 위해서는 단순히 손을 뻗는 것만으로는 충분하지 않았다. 강진은 다시 일어나 천검을 바라보았다. 그의 마음속에는 다시 한번 강한 의지가 피어올랐다.

“천검이여, 나는 진정한 마음을 가지고 있다. 나를 시험하더라도 결코 물러서지 않겠다.” 강진은 다시 천검을 향해 손을 뻗었다. 이번에는 그의 마음이 천검과 하나가 된 듯한 느낌이 들었다. 천검은 서서히 빛을 발하며 그의 손에 들어왔다.

그 순간, 강진은 천검이 단순한 무기가 아니라는 것을 깨달았다. 그것은 무공의 정수를 담고 있는 신비한 검이었다. 천검을 손에 쥔 강진은 자신의 힘이 한층 더 강해짐을 느꼈다.

강진은 천검을 가지고 이청 사부에게 돌아갔다. 이청은 강진이 천검을 가지고 돌아온 것을 보고 미소를 지었다.

“잘했다, 강진아. 이제 너는 진정한 무림의 길로 들어섰구나. 하지만 기억하라, 천검의 힘은 너의 마음가짐에 달려 있다. 그 힘을 어떻게 사용하느냐가 너의 무공과 인생을 결정할 것이다.”

강진은 이청의 말을 가슴에 새기며 천검을 소중히 간직했다. 그의 앞에는 더 많은 도전과 시련이 기다리고 있었지만, 이제 그는 천검과 함께라면 무엇이든 해낼 수 있을 것만 같았다. 그의 무협 여정은 이제 막 새로운 장을 열기 시작했다.

===================================================================================

제4장: 무공의 시작

강진은 천검을 손에 쥔 채, 이청 사부와 함께 은거지를 떠났다. 그의 마음은 새로운 도전과 모험으로 가득 차 있었다. 천검을 가지고 무공의 길을 걷는 것은 그의 인생에서 새로운 장을 열었다.

“강진아, 이제부터는 네가 진정한 무공의 길에 들어서는 것이다. 네가 이룰 수 있는 것은 무한한 것이다. 하지만 그것을 위해서는 열심히 훈련하고 자기를 다스려야 한다.” 이청은 강진에게 말했다.

강진은 이청의 말에 깊이 공감하며 무공을 연마하기 시작했다. 그의 훈련은 더욱 엄격해졌고, 시련 또한 더욱 힘겨워졌다. 하지만 강진은 결코 포기하지 않았다. 그의 마음속에는 천검의 힘이 고무되어 있었고, 그것이 그를 무적의 무공사로 만들어 줄 것이라고 믿었다.

한편, 무공의 세계는 무한한 가능성으로 가득 차 있었다. 강진은 이청 사부와 함께 다양한 무공을 배우며 그의 기술을 향상시켰다. 그의 몸은 강해지고, 기술은 점점 완성도를 높여갔다. 하지만 그의 앞길에는 아직도 수많은 시련과 도전이 기다리고 있었다.

어느 날, 은거지에 한 소녀가 찾아왔다. 그녀의 이름은 미소였다. 미소는 강진을 보고 깜짝 놀랐다.

“네가 강진이 맞니?” 미소가 물었다.

“네, 나는 강진이야. 누구세요?” 강진이 물었다.

“나는 미소야. 나는 네가 무공을 배우고 있는 것을 듣고 여기에 왔어. 나도 무공을 배우고 싶어.” 미소가 말했다.

강진은 미소의 결연한 눈빛을 보고 고개를 끄덕였다. “좋아, 나와 함께 무공을 배우자. 하지만 기억해야 할 것이 있다. 무공은 결코 쉽지 않다. 시련과 희생이 따르게 될 것이다.”

미소는 강진의 말에 감사하며 함께 무공을 배우기로 결심했다. 그녀의 도전과 성장은 강진과 함께 무공의 세계를 더욱 풍성하게 만들어 갔다.

그리고 그들의 무공의 여정은 이제 막 시작되었다.

=========================================================================

제5장: 그림자의 속삭임

강진과 미소는 이청 사부와 함께 무공을 연마하는 동안 자신들의 기술을 향상시켰다. 그들은 함께 힘들고 힘든 훈련을 겪으며 서로를 격려하고 돕는 동료가 되었다. 그러나 그들 앞에는 여전히 많은 도전과 시련이 기다리고 있었다.

어느 날, 은거지에 새로운 손님이 찾아왔다. 이는 무림의 무공사이자 이청의 예전 제자인 그림자였다. 그림자는 어둠 속에서 미묘한 움직임과 냉소가 흘러나왔다. 그의 도래는 은거지에 당혹과 긴장을 불러일으켰다.

“이청아, 오랜만이다.” 그림자가 말했다. 그의 목소리는 어두운 그림자처럼 존재감을 느끼게 했다.

“그림자, 너는 여기서 무슨 일을 하는 거냐?” 이청이 물었다. 그의 목소리에는 경계와 의심이 담겨 있었다.

“나는 간만에 이곳을 방문해 보고 싶어서 왔다. 그리고 이곳에 있는 내 예전 제자를 만나보려 했는데...” 그림자는 강진과 미소를 향해 비꼬는 시선을 보냈다.

“그림자, 네 목적이 무엇이냐? 여기에 온 것은 우연인 것 같지 않아.” 이청이 엄연하게 물었다.

그림자는 씁쓸한 미소를 지으며 말했다. “나의 목적은 당신과 당신의 제자들을 도와주는 것이다. 이 세계는 어둠으로 가득 차 있고, 어둠을 이기기 위해선 나와 같은 무림의 전사들이 필요하다.”

이청은 그림자의 말에 의문을 품었지만, 그의 말에는 어떤 이면이 숨어 있을 것 같았다. 그는 강진과 미소에게 조심하라고 경고했지만, 그들은 그림자의 말에 믿음을 준다는 표현했다.

이제 은거지에는 강진과 미소를 비롯한 세 명의 무공사와 함께 그림자까지 있었다. 그들의 여정은 더욱 더 복잡하고 위험한 길로 향하게 되었다.

그리고 그림자의 속삭임은 점점 더 강해지고 있었다.

 

===========================================================================

 

제6장: 어둠의 시련

은거지에는 어느 날 강진과 미소를 비롯한 무공사들이 모여 열심히 훈련하는 모습이 보였다. 그들은 어둠의 시련을 극복하기 위해 서로에게 도움을 주고 받으며 더욱 강해지고 있었다. 이청 사부는 그들을 지켜보며 미소짓고 있었다.

"강진, 미소, 너희의 진전을 보니 정말 기쁘구나. 하지만 아직 우리 앞에는 많은 도전이 기다리고 있어." 이청이 말했다.

"그렇다, 사부님. 우리는 아직 끝이 아니에요. 더욱더 노력해서 어둠을 뚫고 나가야 해요." 강진이 대답했다.

그때 갑자기 은거지를 둘러싼 분위기가 변했다. 숲 속에서 이상한 소문이 퍼지고, 그림자의 존재가 감지되었다. 강진과 미소는 은거지를 보호하기 위해 준비하였고, 이청은 그림자를 주의 깊게 살펴보았다.

"그림자, 너의 목적이 무엇인가?" 이청이 물었다.

"나의 목적은 당신과 당신의 제자들을 도와주는 것이다. 이 세계는 어둠으로 가득 차 있고, 어둠을 이기기 위해선 나와 같은 무림의 전사들이 필요하다." 그림자가 말했다.

"그러면 왜 이렇게 갑자기 나타났느냐?" 이청이 물었다.

"나는 간만에 이곳을 방문해 보고 싶어서 왔다. 그리고 이곳에 있는 내 예전 제자를 만나보려 했는데..." 그림자는 강진과 미소를 향해 비꼬는 시선을 보냈다.

"그림자, 네 목적이 무엇이냐? 여기에 온 것은 우연인 것 같지 않아." 이청이 경계심을 갖고 물었다.

그림자는 씁쓸한 미소를 짓고 말했다. "나의 목적은 당신과 당신의 제자들을 도와주는 것이다. 이 세계는 어둠으로 가득 차 있고, 어둠을 이기기 위해선 나와 같은 무림의 전사들이 필요하다."

이청은 그림자의 말에 의문을 품었지만, 그의 말에는 어떤 이면이 숨어 있을 것 같았다. 그는 강진과 미소에게 조심하라고 경고했지만, 그들은 그림자의 말에 믿음을 준다는 표현했다.

은거지에는 강진과 미소를 비롯한 세 명의 무공사와 함께 그림자까지 있었다. 그들의 여정은 더욱 더 복잡하고 위험한 길로 향하게 되었다.

그리고 그림자의 속삭임은 점점 더 강해지고 있었다.

=========================================================================

 

제7장: 현혹된 심장

강진은 어둠의 시련을 극복한 후, 은거지에서의 생활이 무공의 여정을 더욱 복잡하게 만든다는 것을 깨달았다. 그의 내면에는 그림자의 존재와 그림자의 속삭임에 대한 두려움과 혼란이 깊이 자리잡고 있었다. 은거지는 긴장과 불신의 분위기에 갇혀 있었다.

한편, 그림자의 도착 이후, 이청과 미소는 더욱 엄격한 훈련을 시행했고, 강진과 미소는 이전보다도 더 많은 압력을 받았다. 그러나 강진은 자신의 내면의 어둠과의 싸움에서 얻은 깨달음을 바탕으로 자신의 의지를 굳게 다지고 있었다.

어느 날, 강진은 이청 사부와의 대화를 통해 그의 마음을 털어놓았다.

"사부님, 저는 어둠의 유혹에 시달리고 있습니다. 그림자의 속삭임이 제 마음을 흔들고 있어요."

이청은 강진을 끌어안으며 답했다.

"강진아, 너의 내면의 어둠과 싸우는 것은 어려운 일이지만, 너는 그것을 이길 수 있어. 내가 너와 함께 있을 테니 걱정하지 마세요."

이후, 강진은 은거지 주변의 자연을 통해 내면의 평화를 찾기 시작했다. 산속의 조용한 바람 소리와 강물의 흐름 소리는 그의 마음을 차분하게 만들었다. 저녁에는 미소와 함께 밤하늘을 바라보며 대화를 나누었다.

"우리는 서로를 믿고 응원해야 해요. 함께 싸워 이 어둠을 뚫어내야 해요." 미소가 말했다.

강진은 미소의 말에 고개를 끄덕였다. "네, 우리는 함께 이길 거야."

그렇게 강진은 자신의 내면의 어둠과 싸우는 데에 더욱 집중하며, 무공의 길을 걸어가기 위한 결의를 다졌다. 하지만 그의 내면의 싸움은 아직 끝나지 않았다. 어둠의 유혹은 여전히 그를 시험하고 있었다. 그러나 강진은 희망을 품고, 무공의 길을 걸어가기로 결심했다. 그의 마음은 강하고 결연하며, 앞으로의 여정에 대한 열정이 가득했다.

 

==============================================================================

제8장: 결투의 서막

은거지에서는 예기치 못한 사건이 벌어졌다. 강진과 미소를 비롯한 무공사들이 모여 있었지만, 분위기는 긴장과 불안으로 가득 차 있었다. 그림자의 도착 이후, 이청과 미소는 강진과 미소에게 더욱 엄격한 훈련을 시행했다. 그들은 어둠의 시련을 극복하고 은거지를 보호하기 위해 준비를 완료했다.

하지만 갑자기 은거지를 둘러싼 분위기가 변했다. 숲 속에서 이상한 소문이 퍼지고, 그림자의 존재가 감지되었다. 강진과 미소는 은거지를 보호하기 위해 준비하였고, 이청은 그림자를 주의 깊게 살펴보았다.

"그림자, 너의 목적이 무엇인가?" 이청이 물었다.

"나의 목적은 당신과 당신의 제자들을 도와주는 것이다. 이 세계는 어둠으로 가득 차 있고, 어둠을 이기기 위해선 나와 같은 무림의 전사들이 필요하다." 그림자가 말했다.

"그러면 왜 이렇게 갑자기 나타났느냐?" 이청이 물었다.

"나는 간만에 이곳을 방문해 보고 싶어서 왔다. 그리고 이곳에 있는 내 예전 제자를 만나보려 했는데..." 그림자는 강진과 미소를 향해 비꼬는 시선을 보냈다.

"그림자, 네 목적이 무엇이냐? 여기에 온 것은 우연인 것 같지 않아." 이청이 경계심을 갖고 물었다.

그림자는 씁쓸한 미소를 짓고 말했다. "나의 목적은 당신과 당신의 제자들을 도와주는 것이다. 이 세계는 어둠으로 가득 차 있고, 어둠을 이기기 위해선 나와 같은 무림의 전사들이 필요하다."

이청은 그림자의 말에 의문을 품었지만, 그의 말에는 어떤 이면이 숨어 있을 것 같았다. 그는 강진과 미소에게 조심하라고 경고했지만, 그들은 그림자의 말에 믿음을 준다는 표현했다.

은거지에는 강진과 미소를 비롯한 세 명의 무공사와 함께 그림자까지 있었다. 그들의 여정은 더욱 더 복잡하고 위험한 길로 향하게 되었다.

그리고 그림자의 속삭임은 점점 더 강해지고 있었다. 어느 날, 강진은 미소와 함께 은거지 주변을 탐험하던 중, 갑자기 그림자의 존재를 감지했다. 강진은 미소를 불러 다가가며 말했다.

"미소야, 우리가 이 그림자를 조사해 보아야 할 것 같아."

미소는 주변을 둘러보며 고개를 끄덕였다. "그래, 이 사태를 조사해 보는 것이 좋겠어. 우리는 은거지를 지키기 위해 무엇이든 해야 해."

강진과 미소는 결의를 다지고, 은거지를 보호하기 위해 함께 힘을 모으기로 했다. 그들은 그림자의 의도를 파악하고, 은거지를 위협하는 모든 위험을 제거하기 위해 준비를 시작했다.

한편, 이청은 그들의 결심에 동의하며 말했다. "강진, 미소, 너희가 함께 하니 나는 믿음이 생긴다. 함께 노력하며 은거지를 지킬 것이다."

그리고 그들은 다음으로 나아가기 위해 은거지를 떠났다. 강진과 미소는 함께 협력하여 어둠의 시련을 이겨내고, 은거지를 지키기 위한 새로운 모험에 나서기로 했다.

 

==================================================================================

제9장: 균형의 위협

은거지는 강진과 미소를 비롯한 무공사들이 함께 은거지를 보호하고 있는데, 그들은 이제 더욱더 경계심을 갖고 있었다. 그림자의 존재로부터 은거지를 지키기 위해 준비된 상황이었다. 하지만 강진과 미소는 여전히 그림자에게 믿음을 주고 있었다. 이청은 그들의 결심을 이해하지만, 여전히 의심스러워하고 있었다.

한편, 은거지 주변에서는 어둠의 영향력이 점점 더 강해지고 있었다. 강진과 미소는 함께 은거지 주변을 탐험하던 중, 갑자기 어둠의 에너지를 감지했다. 

"이건 무엇인가요?" 강진이 물었다.

"음, 이게 바로 그림자의 흔적이야." 미소가 대답했다. "우리가 이걸 조사해 보아야 해."

강진과 미소는 은거지를 위해 함께 모험을 떠나기로 결심했다. 그들은 어둠의 원천을 찾아가기로 했고, 그림자의 의도를 밝혀내기로 했다.

한편, 이청은 그들의 결심에 동의했다. "강진, 미소, 우리가 함께 하니 나는 믿음이 생긴다. 함께 노력하며 은거지를 지킬 것이다."

은거지를 위협하는 어둠의 영향력은 점점 커져가고 있었다. 강진과 미소는 함께 어둠의 속삭임을 탐구하고, 그들의 의도를 알아내기 위해 노력했다. 하지만 그림자의 의도는 여전히 알 수 없는 것으로 남아 있었다.

어느 날, 은거지 주변에서 의문의 움직임이 감지되었다. 강진과 미소는 즉시 은거지를 지키기 위해 나섰다. 그들은 은거지를 위해 싸움을 벌이고, 어둠의 영향력을 제거하기 위해 힘을 모았다.

그러나 그림자는 쉽게 굴하지 않았다. 강진과 미소는 그림자와의 치열한 전투를 벌이면서, 어둠과 빛의 대립을 보여주었다. 은거지는 그들의 용기와 힘에 대해 깊은 감사를 표했고, 그들은 계속해서 은거지를 보호하기 위해 싸움을 이어나갔다.

이청과 함께 은거지를 수호하기 위한 무공사들은 은거지를 위해 최선을 다하고 있었다. 그들은 함께 무엇이든 할 준비가 되어 있었고, 은거지를 지키기 위해 힘을 합쳐 노력했다.

그리고 그들의 힘으로, 어둠의 영향력은 조금씩 줄어들고 있었다. 은거지는 다시 안전한 곳으로 돌아올 수 있을 것인가? 함께 힘을 합친 무공사들의 용기와 결의가 이 세계를 구할 수 있는 열쇠일지도 모른다. 하지만 여전히 그들이 직면한 어둠은 크고 강력하며, 앞으로의 여정은 더욱 어려워질 것임을 알고 있었다. 그러나 그들은 희망을 품고, 결코 포기하지 않을 것이다. 함께라면 어떤 어려움도 이겨낼 수 있을 것이라고 믿고 있었다.

 

======================================================================

**제10장: 결의의 빛**

은거지는 강진과 미소를 비롯한 무공사들의 힘으로 안전을 찾아가고 있었다. 하지만 그들은 아직도 어둠의 영향력에 맞서 싸우고 있었다. 이제 은거지를 지키기 위한 최후의 전투가 시작되었다.

"이제 우리는 어둠의 최종 결전에 맞서야 합니다." 이청이 말했다. "우리의 결의가 시험을 받는 때입니다."

"그렇습니다. 우리는 은거지를 위해 싸워야 합니다." 강진이 말했다. "우리의 힘이 어둠을 뚫고 나갈 것입니다."

은거지의 주변은 어둠의 침입으로 가득 차 있었다. 그림자의 힘은 점점 강해지고 있었고, 은거지는 점점 위험에 빠져들고 있었다.

"우리는 함께 싸워 이 어둠을 뚫어내야 해요." 미소가 말했다. "우리가 모두 하나가 되면, 우리는 이겨낼 수 있을 거예요."

"네, 우리는 함께 있을 때 가장 강합니다." 강진이 대답했다. "우리는 은거지를 지키기 위해 싸워야 합니다."

그들은 결의를 다지고, 어둠의 영향력에 맞서기 위해 준비를 시작했다. 그림자와의 최종 결전이 다가오고 있었다.

은거지의 모든 무공사들은 함께 모여 은거지를 지키기 위해 힘을 모았다. 그들은 한 마음으로 은거지를 수호하기 위해 전투를 준비했다. 그들의 결의와 힘은 어둠의 침입을 막을 수 있는 유일한 희망이었다.

그리고 그들의 힘으로, 은거지는 어둠의 침입을 막을 수 있었다. 그림자의 힘을 뚫고, 은거지의 평화를 지키기 위해 힘을 합쳤다.

"우리의 결의가 어둠을 뚫고 나가는 빛이 될 것입니다." 이청이 말했다.

"네, 우리는 이 어둠을 이길 수 있습니다." 강진이 대답했다. "우리의 힘으로, 우리는 은거지를 지킬 수 있습니다."

은거지의 주변은 빛으로 가득 차 있었다. 그들의 결의와 힘으로, 은거지는 평화로운 곳으로 되돌아갈 수 있었다. 그리고 은거지는 그들의 용기와 희망으로 다시 한 번 빛나기 시작했다.

이제 그들은 함께 은거지를 수호하기 위해 무엇이든 할 준비가 되어 있었다. 그들은 은거지의 평화를 지키기 위해 영원히 싸울 것을 다짐했다. 함께라면 어떤 어려움도 이겨낼 수 있을 것이라고 믿고, 그들은 새로운 여정을 시작했다.

 

============================================

**제11장: 새로운 시작**

은거지는 어둠의 영향력으로부터 최종적으로 구해졌다. 강진과 미소, 그리고 다른 무공사들의 결의와 힘으로, 은거지는 다시 안전하고 평화로운 곳으로 변모했다. 그러나 이 모든 것이 끝이 아니었다. 새로운 시작이 시작되었다.

"우리는 은거지를 다시 건설해야 합니다." 강진이 말했다. "우리는 함께 노력하여 은거지를 다시 세우겠습니다."

"그렇습니다. 우리는 함께 은거지를 재건할 것입니다." 미소가 대답했다. "이제는 모두가 함께해야 합니다."

은거지의 재건은 무공사들의 결의와 힘으로 시작되었다. 그들은 함께 노력하여 은거지를 다시 세우기 위해 일했다. 그들은 모두가 하나가 되어 은거지를 다시 만들어 나갔다.

"이제 우리는 함께 은거지를 지키고 새로운 시대를 맞이해야 합니다." 이청이 말했다. "우리의 결의와 힘으로, 우리는 새로운 시작을 할 것입니다."

"그렇습니다. 우리는 함께 새로운 시대를 만들어 나갈 것입니다." 강진이 대답했다. "우리는 은거지를 다시 건설하고, 새로운 모험을 시작할 것입니다."

은거지의 재건은 무공사들의 힘과 결의로 성취되었다. 그들은 모두가 하나가 되어 은거지를 다시 세우기 위해 힘을 합쳤다. 그리고 은거지는 다시 한 번 빛나기 시작했다.

은거지는 새로운 시작을 위해 준비되어 있었다. 강진과 미소, 그리고 다른 무공사들은 함께 새로운 모험을 시작하기 위해 준비했다. 그들은 은거지를 지키고, 새로운 시대를 만들어 나갈 것이다.

"우리는 모두가 함께해야 합니다." 미소가 말했다. "우리의 힘으로, 우리는 새로운 시대를 만들어 나갈 수 있을 것입니다."

은거지의 새로운 시작은 모두가 함께하는 것으로 시작되었다. 그들은 은거지를 다시 세우고, 새로운 모험을 함께 떠날 준비가 되어 있었다.

"이제 우리는 함께 새로운 시대를 맞이하기 위해 준비되어 있습니다." 이청이 말했다. "우리는 은거지를 지키고, 함께 미래를 만들어 나갈 것입니다."

강진과 미소, 이청과 다른 무공사들은 은거지를 위해 함께 일하기로 결심했다. 그들은 새로운 시작을 향해 나아가며, 함께 은거지를 보호하고, 새로운 모험을 시작하기로 했다. 이제 은거지의 새로운 시대가 시작되었다. 함께 모험을 떠나기 위해 준비된 모두는 새로운 도전에 맞서기로 결심했다. 함께하는 모두가 함께라면, 어떤 어려움도 이겨낼 수 있을 것이다. 그들은 새로운 모험을 시작하기 위해 함께 나아갔다.

 

=========================================

**제12장: 새로운 모험의 시작**

은거지는 강진과 미소, 이청을 비롯한 무공사들의 노력으로 다시 평화롭고 안전한 곳으로 변모하였다. 그들은 은거지를 위해 함께 노력하며, 새로운 시작을 준비하기 위해 은거지 주변을 정비하고 있었다. 

"이제 우리는 새로운 모험을 시작해야 합니다." 강진이 말했다. "우리는 은거지를 다시 세우고, 새로운 세계를 만들어 나가야 합니다."

"그렇습니다. 우리는 새로운 모험을 시작할 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 모험을 떠나기 위해 준비됐습니다."

은거지의 재건은 무공사들의 힘과 결의로 이루어졌다. 그들은 은거지를 다시 세우고, 새로운 모험을 위해 준비를 완료했다.

"이제 우리는 새로운 모험을 위해 준비됐습니다." 이청이 말했다. "우리는 함께 모험을 떠나기 위해 준비된 상태입니다."

강진과 미소, 이청과 다른 무공사들은 함께 은거지를 보호하고, 새로운 모험을 시작하기 위해 준비를 완료했다.

"우리는 새로운 모험을 위해 모두 함께 떠나야 합니다." 미소가 말했다. "우리의 힘과 결의로, 우리는 새로운 모험을 시작할 수 있습니다."

은거지의 새로운 시작은 모두가 함께하는 것으로 시작되었다. 그들은 새로운 모험을 시작하고, 새로운 세계를 만들어 나갔다.

"이제 우리는 함께 새로운 모험을 시작할 준비가 되어 있습니다." 이청이 말했다. "우리는 은거지를 지키고, 함께 미래를 만들어 나갈 준비가 되어 있습니다."

강진과 미소, 이청과 다른 무공사들은 새로운 모험을 위해 함께 떠나기로 결심했다. 그들은 새로운 세계를 탐험하고, 새로운 모험을 시작하기로 했다.

"이제 우리는 함께 새로운 모험을 시작합니다." 강진이 대답했다. "우리의 힘과 결의로, 우리는 새로운 모험을 성공적으로 이끌어 나갈 것입니다."

은거지의 새로운 모험은 모두가 함께하는 것으로 시작되었다. 그들은 새로운 세계를 탐험하고, 함께 새로운 모험을 시작하기로 결심했다. 이제 새로운 모험을 향해 함께 나아가는 모험이 시작되었다. 함께하는 모두가 함께라면, 어떤 어려움도 이겨낼 수 있을 것이다. 함께 새로운 모험을 시작하기 위해 모두는 함께 나아갔다.

========================================

**제13장: 결실의 순간**

은거지의 새로운 모험이 시작되었다. 강진과 미소, 이청을 비롯한 무공사들은 함께 새로운 세계를 탐험하고, 새로운 모험을 시작하기로 결심했다. 그들은 함께 여행을 시작하며, 새로운 세계에서의 모험을 즐기기로 했다.

"우리는 이제 새로운 세계를 탐험할 준비가 되어 있습니다." 강진이 말했다. "우리의 모험이 성공적으로 진행될 것입니다."

"그렇습니다. 우리는 새로운 세계에서의 모험을 즐길 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 여행을 즐길 것입니다."

은거지의 모든 무공사들은 함께 새로운 모험을 시작하기로 결심했다. 그들은 새로운 세계를 탐험하고, 함께 여행을 즐기기로 했다.

"우리는 이제 함께 모험을 즐기며 새로운 세계를 탐험할 것입니다." 이청이 말했다. "우리의 모험이 성공적으로 진행될 것입니다."

"네, 우리는 함께 모험을 즐기며 새로운 세계를 탐험할 것입니다." 강진이 대답했다. "우리는 함께 모험을 즐기고, 새로운 경험을 만들어 나갈 것입니다."

은거지의 새로운 모험은 모두가 함께하는 것으로 시작되었다. 그들은 새로운 세계를 탐험하고, 함께 여행을 즐기며, 새로운 경험을 만들어 나갔다.

"이제 우리는 함께 모험을 즐길 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 모험을 즐기고, 새로운 세계에서의 경험을 만들어 나갈 것입니다."

은거지의 모든 무공사들은 함께 모험을 즐기며, 새로운 세계에서의 경험을 만들어 나갔다. 그들은 함께 여행을 즐기고, 새로운 모험을 만들어 나갔다.

"이제 우리는 함께 모험을 즐기며 새로운 세계에서의 경험을 만들어 나갈 것입니다." 이청이 말했다. "우리의 결실이 성취될 것입니다."

"네, 우리는 함께 모험을 즐기며 새로운 경험을 만들어 나갈 것입니다." 강진이 대답했다. "우리의 모험이 성공적으로 이뤄질 것입니다."

은거지의 새로운 모험은 모두가 함께하는 것으로 시작되었다. 그들은 함께 모험을 즐기며, 새로운 경험을 만들어 나갔다. 함께하는 모두가 함께라면, 어떤 어려움도 이겨낼 수 있을 것이다. 함께 모험을 즐기며, 새로운 세계에서의 경험을 만들어 나가는 모두는 새로운 모험의 결실을 맛보게 될 것이다. 함께 모험을 시작하기 위해 모두는 함께 나아갔다.

 

================================

**제14장: 결말의 서막**

은거지의 모험이 이제 막 끝나려고 했다. 강진과 미소, 이청을 비롯한 무공사들은 함께 새로운 세계를 탐험하고, 새로운 모험을 마무리하기로 결심했다. 그들은 함께 여행을 하며, 지금까지의 모험을 회상했다.

"우리는 이제 새로운 세계를 탐험하며, 모험을 마무리할 준비가 되어 있습니다." 강진이 말했다. "우리의 모험이 성공적으로 이뤄질 것입니다."

"그렇습니다. 우리는 새로운 세계에서의 모험을 마무리할 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 여행을 하고, 새로운 경험을 만들어 나갈 것입니다."

은거지의 모든 무공사들은 함께 새로운 모험을 마무리하기로 결심했다. 그들은 새로운 세계를 탐험하고, 함께 여행을 하며, 새로운 경험을 만들어 나갔다.

"우리는 이제 함께 모험을 마무리할 준비가 되어 있습니다." 이청이 말했다. "우리의 모험이 성공적으로 끝날 것입니다."

"네, 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 강진이 대답했다. "우리의 모험이 마무리될 때까지, 우리는 함께 하겠습니다."

은거지의 새로운 모험은 모두가 함께하는 것으로 시작되었다. 그들은 새로운 세계를 탐험하고, 함께 여행을 하며, 새로운 경험을 만들어 나갔다.

"이제 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 여행을 하고, 새로운 경험을 만들어 나갈 것입니다."

은거지의 모든 무공사들은 함께 모험을 마무리하고, 새로운 세계에서의 경험을 회상했다. 그들은 함께 모험을 마무리하고, 새로운 모험의 결말을 맛볼 준비가 되어 있었다.

"이제 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 이청이 말했다. "우리는 새로운 경험을 만들어 나갈 것입니다."

"네, 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 강진이 대답했다. "우리의 모험이 마무리될 때까지, 함께 하겠습니다."

은거지의 새로운 모험은 결말의 서막으로 접어들었다. 그들은 함께 모험을 마무리하고, 새로운 세계에서의 경험을 회상했다. 함께 모험을 마무리할 준비가 되어 있었고, 그들은 함께 이 모험의 결말을 맛볼 준비가 되어 있었다. 함께 모험을 마무리하고, 새로운 모험의 결말을 맛볼 준비가 되어 있었다.

==================================================

**제15장: 새로운 시작의 서막**

은거지의 새로운 모험이 결말을 향해 달려가고 있었다. 강진과 미소, 이청을 비롯한 무공사들은 새로운 세계를 탐험하고, 모험이 성공적으로 끝나기를 기대했다. 그들은 함께 여행을 하며, 이전의 모험을 회상하며 미래에 대해 이야기했다.

"우리는 이제 새로운 모험을 마무리할 준비가 되어 있습니다." 강진이 말했다. "우리의 모험이 성공적으로 끝날 것입니다."

"그렇습니다. 우리는 새로운 모험이 마무리될 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 여행을 하고, 새로운 경험을 만들어 나갈 것입니다."

은거지의 모든 무공사들은 함께 새로운 모험을 마무리하기로 결심했다. 그들은 새로운 세계를 탐험하고, 함께 여행을 하며, 새로운 경험을 만들어 나갔다.

"우리는 이제 함께 모험을 마무리할 준비가 되어 있습니다." 이청이 말했다. "우리의 모험이 성공적으로 끝날 것입니다."

"네, 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 강진이 대답했다. "우리의 모험이 마무리될 때까지, 우리는 함께 하겠습니다."

은거지의 새로운 모험은 모두가 함께하는 것으로 시작되었다. 그들은 새로운 세계를 탐험하고, 함께 여행을 하며, 새로운 경험을 만들어 나갔다.

"이제 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 미소가 말했다. "우리는 함께 여행을 하고, 새로운 경험을 만들어 나갈 것입니다."

은거지의 모든 무공사들은 함께 모험을 마무리하고, 새로운 세계에서의 경험을 회상했다. 그들은 함께 모험을 마무리하고, 새로운 모험의 결말을 맛볼 준비가 되어 있었다.

"이제 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 이청이 말했다. "우리는 새로운 경험을 만들어 나갈 것입니다."

"네, 우리는 함께 모험을 마무리할 준비가 되어 있습니다." 강진이 대답했다. "우리의 모험이 마무리될 때까지, 함께 하겠습니다."

은거지의 새로운 모험은 결말의 서막으로 접어들었다. 그들은 함께 모험을 마무리하고, 새로운 세계에서의 경험을 회상했다. 함께 모험을 마무리할 준비가 되어 있었고, 그들은 함께 이 모험의 결말을 맛볼 준비가 되어 있었다. 함께 모험을 마무리하고, 새로운 모험의 결말을 맛볼 준비가 되어 있었다. 이제 새로운 모험이 끝나고, 그들은 새로운 시작을 기대하며 함께 나아갈 준비를 하고 있었다. 함께 이 모험을 마무리하며, 새로운 모험을 위한 서막을 열어나갈 준비가 되어 있었다. 함께 이 모험을 마무리하고, 새로운 모험의 결말을 맛볼 준비가 되어 있었다. 함께 이 모험을 마무리하며, 새로운 시작을 함께 맞이하기 위한 서막을 열어나갔다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

아래 파일(Animated GIF Frame Extractor v1.1.exe)을 다운로드 받습니다.

(프로그램 실행시 컴퓨터에 따라 필요한 프로그램 설치과정이 나타날 수 있습니다. 시간이 좀 오래걸릴 수 있는데 기다리면 자동 설치 완료됩니다.^^)

 

Animated GIF Frame Extractor v1.1.exe
0.03MB

 

실행시 화면은 다음과 같다.

 

Open 버튼을 클릭 한다.

 

gif 파일을 선택한다.

 

위와 같이 왼쪽에는 프레임 순서 오른쪽에는 각 프레임을 선택하면 해당되는 이미지를 확인할 수 있다.

선택 프레임을 저장(Save current frame) 할 수 있고 모든 프레임(Save all fames) 저장할 수 있다.

 

모든 프레임 저장 버튼 클릭시 아래와 같이 설정 화면이 나타나고

 

폴더 설정 후 OK 를 누르면 아래와 같이 모든 이미지가 저장됨을 확인 할 수 있다.

728x90
반응형
LIST
728x90
반응형
SMALL

 

문제 설명

실패율

 

슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

실패율은 다음과 같이 정의한다.

스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

제한사항

스테이지의 개수 N1이상500이하의 자연수이다.

stages의 길이는1이상200,000이하이다.

stages에는1이상N + 1이하의 자연수가 담겨있다.

각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.

,N + 1은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.

만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.

스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은0으로 정의한다.

입출력 예

N stages result
5 [2, 1, 2, 6, 2, 4, 3, 3] [3,4,2,1,5]
4 [4,4,4,4,4] [4,1,2,3]

입출력 예 설명

입출력 예 #1
1번 스테이지에는 총 8명의 사용자가 도전했으며, 이 중 1명의 사용자가 아직 클리어하지 못했다. 따라서 1번 스테이지의 실패율은 다음과 같다.

1 번 스테이지 실패율 : 1/8

2번 스테이지에는 총 7명의 사용자가 도전했으며, 이 중 3명의 사용자가 아직 클리어하지 못했다. 따라서 2번 스테이지의 실패율은 다음과 같다.

2 번 스테이지 실패율 : 3/7

마찬가지로 나머지 스테이지의 실패율은 다음과 같다.

3 번 스테이지 실패율 : 2/4

4번 스테이지 실패율 : 1/2

5번 스테이지 실패율 : 0/1

각 스테이지의 번호를 실패율의 내림차순으로 정렬하면 다음과 같다.

[3,4,2,1,5]

입출력 예 #2

모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.

[4,1,2,3]

============================================================================================문제 풀이

코드는 간단하게 각 스페이지 별로 실패율을 계산한후 정렬을 수행하면 된다.

이때 시간초과로 인한 실패가 많은데 해결하기 위해서는 더이상 플레이어가 없을때(n==0)는 계산 없이 바로 실패율을 0으로 만든다.

def solution(N, stages):
    answer = []
    n = len(stages)
    
    for i in range(N):
        if n==0:#플레이어가 없을때 계산없이 0으로 추가함
            answer.append(0)    
        else:
            c = stages.count(i+1)
            answer.append(c/n)
            n -= c

    answer = sorted(range(1,N+1), key=lambda k: answer[k-1], reverse=True)
    
    
    return answer

 

실행결과

테스트 1 통과 (0.01ms, 9.99MB)
테스트 2 통과 (0.26ms, 10.1MB)
테스트 3 통과 (80.91ms, 10.2MB)
테스트 4 〉 통과 (434.18ms, 10.7MB)
테스트 5 〉 통과 (1687.00ms, 15.1MB)
테스트 6 통과 (0.83ms, 10.4MB)
테스트 7 통과 (11.96ms, 10.3MB)
테스트 8 〉 통과 (385.14ms, 10.8MB)
테스트 9 〉 통과 (1593.72ms, 14.9MB)
테스트 10 〉 통과 (149.76ms, 10.9MB)
테스트 11 〉 통과 (444.06ms, 10.8MB)
테스트 12 〉 통과 (450.53ms, 11.1MB)
테스트 13 〉 통과 (514.34ms, 11.3MB)
테스트 14 통과 (0.04ms, 10.1MB)
테스트 15 통과 (13.92ms, 10.7MB)
테스트 16 통과 (5.73ms, 10.4MB)
테스트 17 통과 (17.65ms, 10.5MB)
테스트 18 통과 (6.00ms, 10.3MB)
테스트 19 통과 (1.26ms, 10.2MB)
테스트 20 통과 (20.84ms, 10.4MB)
테스트 21 통과 (18.46ms, 10.8MB)
테스트 22 〉 통과 (1373.85ms, 18.3MB)
테스트 23 통과 (10.45ms, 11.6MB)
테스트 24 통과 (62.01ms, 11.6MB)
테스트 25 통과 (0.01ms, 10.2MB)
테스트 26 통과 (0.01ms, 10.1MB)
테스트 27 통과 (0.01ms, 10.1MB)

 

테스트 3, 4, 8, 9 등 몇몇 테스트의 경우 큰 시간이 필요하다. 그래서 좀 더 효율적으로 시간을 줄이기 위해서 아래와 같이 count() 함수를 사용하지 않고 미리 계산된 결과만 불러오도록 수정하였다.

def solution(N, stages):
    answer = []
    n = len(stages)
    
    temp =[0]*N #count 를 미리 계산
    
    for v in stages:
        if v<=N:
            temp[v-1] += 1
        
    for i in range(N):
        if n==0:
            answer.append(0)    
        else:
            c = temp[i] # count 값만 호출함
            answer.append(c/n)
            n -= c
            
    answer = sorted(range(1,N+1), key=lambda k: answer[k-1], reverse=True)#리스트 인덱스 정렬
    
    return answer

 

실행결과: 아래와 같이 시간이 많이 단축됨을 확인할 수 있다.

테스트 1 통과 (0.01ms, 10.1MB)
테스트 2 통과 (0.18ms, 10.1MB)
테스트 3 통과 (1.14ms, 10.3MB)
테스트 4 〉 통과 (9.74ms, 10.8MB)
테스트 5 〉 통과 (20.49ms, 14.8MB)
테스트 6 통과 (0.12ms, 10.3MB)
테스트 7 통과 (0.84ms, 10.3MB)
테스트 8 〉 통과 (9.54ms, 10.8MB)
테스트 9 〉 통과 (20.53ms, 15MB)
테스트 10 〉 통과 (10.58ms, 10.8MB)
테스트 11 〉 통과 (9.36ms, 10.9MB)
테스트 12 〉 통과 (14.67ms, 11.3MB)
테스트 13 〉 통과 (20.32ms, 11.3MB)
테스트 14 통과 (0.02ms, 10.2MB)
테스트 15 통과 (4.08ms, 10.5MB)
테스트 16 통과 (3.23ms, 10.3MB)
테스트 17 통과 (6.43ms, 10.4MB)
테스트 18 통과 (3.26ms, 10.4MB)
테스트 19 통과 (0.64ms, 10.2MB)
테스트 20 통과 (5.68ms, 10.3MB)
테스트 21 통과 (19.67ms, 10.8MB)
테스트 22 〉 통과 (21.01ms, 18.3MB)
테스트 23 통과 (19.02ms, 11.7MB)
테스트 24 통과 (18.49ms, 11.6MB)
테스트 25 통과 (0.01ms, 10.1MB)
테스트 26 통과 (0.01ms, 10.1MB)
테스트 27 통과 (0.01ms, 10.1MB)

 

dictionary가 list 보다 데이터 접근이 빠르다고 하여 아래와같이  answer 타입을 list 에서 dictionary 로 변경하여 속도를 확인하였다.

def solution(N, stages):
    answer = {}
    n = len(stages)
    
    temp =[0]*N
    
    for v in stages:
        if v<=N:
            temp[v-1] += 1
        
    for i in range(N):
        if n==0:
            answer[i+1]= 0
        else:
            c = temp[i]
            answer[i+1]= c/n
            n -= c
    
    answer = sorted(answer, key=lambda k: answer[k], reverse=True)
    
    return answer

 

실행결과: 처리 과정은 저장후 정렬이 대부분이며, 저장된 데이터를 찾는 경우가 작다.  그래서 아래와 같이 결과가 비슷하거나 데이터에 따라 약간 차이가 있음을 확인할 수 있다.

 

테스트 1 통과 (0.01ms, 10MB)
테스트 2 통과 (0.15ms, 10.1MB)
테스트 3 〉 통과 (1.15ms, 10.3MB)
테스트 4 〉 통과 (9.34ms, 10.6MB)
테스트 5 〉 통과 (19.32ms, 14.9MB)
테스트 6 통과 (0.12ms, 10MB)
테스트 7 통과 (0.84ms, 10.1MB)
테스트 8 〉 통과 (20.18ms, 10.8MB)
테스트 9 〉 통과 (26.80ms, 15MB)
테스트 10 〉 통과 (9.72ms, 10.8MB)
테스트 11 〉 통과 (9.18ms, 10.7MB)
테스트 12 〉 통과 (14.10ms, 11.2MB)
테스트 13 〉 통과 (14.87ms, 11.3MB)
테스트 14 통과 (0.02ms, 10.1MB)
테스트 15 통과 (4.09ms, 10.4MB)
테스트 16 통과 (3.32ms, 10.4MB)
테스트 17 통과 (6.58ms, 10.6MB)
테스트 18 통과 (3.43ms, 10.4MB)
테스트 19 통과 (0.64ms, 10.2MB)
테스트 20 통과 (4.54ms, 10.2MB)
테스트 21 통과 (9.27ms, 10.9MB)
테스트 22 〉 통과 (20.93ms, 18.2MB)
테스트 23 통과 (20.16ms, 11.6MB)
테스트 24 통과 (18.51ms, 11.5MB)
테스트 25 통과 (0.01ms, 10.2MB)
테스트 26 통과 (0.01ms, 10MB)
테스트 27 통과 (0.01ms, 10.1MB)

 

728x90
반응형
LIST
728x90
반응형
SMALL

1. 문제 설명

 

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.

nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

 

2. 입출력 예

nums result
[1,2,3,4] 1
[1,2,7,6,4] 4

입출력 예 설명

입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.

 

3. 문제 풀이

서로 다른 3개를 골라야 되기 때문에 3중 for 문을 쓰던 combinations를 import 시켜서 조합을 만들어내야된다.

작성된 코드 설명은 다음과 같다

(1) 코드는 단순하게 3중 for 문을 써서 조합을 만들다.

(2) 조합중 2,3 으로 나누어 떨어지는 수들을 먼저 제외시킨다.

(3) 나머지 수들 중 1을 제외한 홀수로 나누어 떨어짐을 검사해서 소수를 찾음

def solution(nums):
    
    answer = 0
    l = len(nums)
    
    for i in range(l-2):
        for j in range(i+1,l-1):
            for q in range(j+1,l):
                s = nums[i]+nums[j]+nums[q]
                if s%2==0 or s%3==0:
                    continue
                else:
                    prime = True
                    for r in range(3,int(s**0.5)+1,2):
                        if s%r==0:
                            prime = False
                            break
                    if prime:
                        answer += 1
    
    return answer
728x90
반응형
LIST
728x90
반응형
SMALL

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건

n2이상 1000000이하의 자연수입니다.

입출력 예

n result
10 4
5 3

입출력 예 설명

입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환

입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

 

--------------------------------------------------------------------------------------------------------------------

문제 풀이

1) 소수 찾기 기본 코드

조건식을 이용하여 나누어 떨어짐을 확인한다. 검사 끝은 i 에 루트(i**0.5, )를 적용한 수 까지 찾는다.

def solution(n):
    answer = 0
    for i in range(2,n+1):
        prime = True
        for j in range(2,int(i**0.5)+1):
            if i%j==0:
                prime = False
                break

        if prime:
            answer += 1
        
    
    return answer

효율성 결과는?

2) 효율성 개선 코드

체크 해야될 수 중에서 짝수와 짝수 약수를 제거하여 아래와 같이 코드를 변경하였다.

def solution(n):
    answer = 1
    for i in range(3,n+1,2):        
        prime = True
        for j in range(3,int(i**0.5)+1,2):            
            if i%j==0:
                prime = False
                break
            
        if prime:
            answer += 1
        
    
    return answer

효율성 결과는? 약 2배정도 빠라짐을 확인할 수 있다.

728x90
반응형
LIST

+ Recent posts