728x90

문제 설명

  • 로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.

  • 로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
  • 알아볼 수 없는 번호를 0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가 44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가 31, 10, 45, 1, 6, 19라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.

lottos = [44, 1, 0, 0, 31, 25]
win_nums = [31, 10, 45, 1, 6, 19]
# 예상 답은 [3,5] 입니다.
def solution(lottos, win_nums):
    answer = []
    # 최저와 최고 순위번호를 6으로 할당한다.
    max_win = 6
    min_win = 6
    # 하나씩 맞출 때마다 순위가 상승하지만 두개까지는 똑같은 6위이기에 아래와 같이 할당한다.
    score = [1,2,3,4,5,6,6]
    # for문으로 0부터 5 까지의 인덱스를 i에 할당.
    for i in range(6):
        # 만약 lottos[i]가 win_nums에 있는 번호라면
        if lottos[i] in win_nums:
            # 최저와 최고 순위번호를 1씩 차감한다.
            min_win -= 1
            max_win -= 1
        # 만약 lottos[i]가 0이라면
        elif lottos[i] == 0:
            # 최고 순위 번호만 1씩 차감한다.
            max_win -= 1
    # max_win과 min_win에 해당하는 score의 인덱스 요소를 answer에 넣는다. 
    answer.append(score[max_win])
    answer.append(score[min_win])
    return answer
# 함수를 실행시켜 보자.
solution(lottos, win_nums)

# [3, 5]

다른 풀이

def solution(lottos, win_nums):
    # rank라는 딕셔너리를 만든다
    # rank에는 아래와 같은 key와 value값이 있다.
    rank = {
        0: 6,
        1: 6,
        2: 5,
        3: 4,
        4: 3,
        5: 2,
        6: 1
    }
    
    # lottos의 값 중 0인 값의 갯수를 카운팅한다
    zero_count = lottos.count(0)
    
    # 집합을 이용해 lottos와 win_nums를 교집합으로 같은 값만 빼내어 그 길이를 잰다.
    correct_count = len(set(lottos) & set(win_nums))
      
    # 위 예제에서 rank[correct_count + zero_count] -> rank[2 + 2] -> rank[4] = 3
    # rank[correct_count] -> rank[2] = 5
    # [3, 5]가 출력된다.
    return [rank[correct_count + zero_count], rank[correct_count]]
728x90
728x90

문제 설명

  • 나만의 카카오 성격 유형 검사지를 만들려고 합니다. 성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

  • 4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.
  • 검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.

  • 각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
  • 예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

  • 이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.
  • 위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
    하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.
  • -매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
    -동의나 비동의 선택지를 선택하면 2점을 얻습니다.
    -약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
    -모르겠음 선택지를 선택하면 점수를 얻지 않습니다.
  • 검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
  • 질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ survey의 길이 ( = n) ≤ 1,000
    • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
    • survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
      -survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
  • choices의 길이 = survey의 길이
    • choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
    • 1 ≤ choices의 원소 ≤ 7

survey = ["AN", "CF", "MJ", "RT", "NA"]
choices = [5, 3, 2, 7, 5]
# 이때 예상 리턴 값은 "TCMA" 입니다.
def solution(survey, choices):

    # 최종 값을 넣을 변수를 만들어 줍니다.
    answer = ''
    # 각 성격유형 종류와 점수를 딕셔너리 타입으로 선언합니다. 
    score = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0,'M':0,'A':0,'N':0} 

    # choices의 길이만큼의 범위에서 for문을 사용하여 각 성격 유형마다 비교합니다. 
    for i in range(len(choices)):
        first = survey[i][0] # sruvey의 i 인덱스의 문자의 첫 번째 알파벳입니다.
        second = survey[i][1] # sruvey의 i 인덱스의 문자의 두 번째 알파벳입니다.

        if choices[i] > 4:
            score[second] += choices[i] -4
            # if 문으로 choices[0]의 값은 5라고 가정
            # 이 때 같은 survey[1]은 "AN" 질문이다.
            # "AN" 질문에서 값이 4보다 높아지면 성격유형이 N쪽으로 기운다.
            # 4 보다 1 큰 5이기 때문에 "AN" 질문에서 N 쪽으로 1점
            # 이때 second는 survey[0][1] 즉, N이다
            # score["N"]에 5(choices[0]) - 4 인 1을 더하여 저장한다.

        elif choices[i] < 4:
            score[first] += 4 - choices[i]
            # if 문으로 choices[1]의 값은 3라고 가정
            # 이 때 같은 survey[1]은 "CF" 질문이다.
            # "CF" 질문에서 값이 4보다 작아지면 성격유형이 C쪽으로 기운다.
            # 4 보다 1 작은 3이기 때문에 "CF" 질문에서 C 쪽으로 1점
            # 이때 first는 survey[1][0] 즉, C이다
            # score["c"]에 4 - 3(choices[1]) 인 1을 더하여 저장한다.

        # for을 완료하면
        # score = {'R': 0, 'T': 3, 'C': 1, 'F': 0, 'J': 0, 'M': 2, 'A': 1, 'N': 1}
        # 위와 같은 score값이 나온다.

    if score["R"] >= score["T"]:
        answer += "R"
    else:
        answer += "T"
    # score의 R과 T값을 비교하여 R이 T보다 같거나 크면
    # answer에 R을 추가, 아니면 "T"를 추가한다.
    # 값이 같을 땐 영어 순서대로 추가된다.

    # 나머지 C와F, J와M, A와N도 같은 코드를 짜준다.
    if score["C"] >= score["F"]:
        answer += "C"
    else:
        answer += "F"

    if score["J"] >= score["M"]:
        answer += "J"
    else:
        answer += "M"

    if score["A"] >= score["N"]:
        answer += "A"
    else:
        answer += "N"
    return answer
# 함수를 돌려보자
solution(survey, choices)

# 'TCMA'

다른 사람의 풀이

def solution(survey, choices):
    
    # 성격 유형 문제와 값을 가진 딕셔너리 타입인 my_dict
    my_dict = {"RT":0,"CF":0,"JM":0,"AN":0}
    
    # zip을 사용하여 survey와 choices를 key와 value로 나눠 각각 A와 B에 할당
    for A,B in zip(survey,choices):
        # 만약 survey의 값이
        #  my_dict.keys() 즉, "RT","CF","JM","AN" 중에 없으면
        if A not in my_dict.keys():
            A = A[::-1] # A[::-1]을 이용해 뒤집어서 사용
            my_dict[A] -= B-4 # my_dict의 A에 해당하는 value에 B - 4 빼기
        else:
            my_dict[A] += B-4 #survey의 값이 my_dict.keys()에 있으면 B - 4 더하기
    # 위 for문을 돌리면 최종적으로
    # my_dict = {'RT': 3, 'CF': -1, 'JM': 2, 'AN': 0} 가 출력된다.
    
    result = "" # result를 선언
    
    # for문으로 my_dict.keys()의 값을 하나하나 name으로 확인한다.
    for name in my_dict.keys():
        # 예를 들어 my_dict.keys()의 첫 요소인 'RT'를 사용하여
        # my_dict['RT']의 값은 3 -> 0보다 큰 수 이므로
        # result에 name 즉, 'RT'의 1번 인덱스 값인 T가 들어간다.
        if my_dict[name] > 0:
            result += name[1]
        # 그 다음으로 my_dict.keys()의 첫 요소인 'CF'를 사용하여
        # my_dict['CF']의 값은 -1 -> 0보다 작은 수 이므로
        # result에 name 즉, 'CF'의 0번 인덱스 값인 C가 들어간다.
        elif my_dict[name] < 0:
            result += name[0]
        # 위 경우 이외에 my_dict의 value 값이 0인 key값은
        # name을 sorted로 정렬하여 맨 처음 값을 집어 넣는다.
        else:
            result += sorted(name)[0]

    return result
728x90
728x90

문제 설명

  • 고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
  • 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
    당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

  • 다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.

  • 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.
  • 오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

제한사항

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

from datetime import datetime
from dateutil.relativedelta import relativedelta

today = "2022.05.19"
terms = ["A 6", "B 12", "C 3"]
privacies = ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
# 결과값은 [1,3]이 나와야한다.

def solution(today, terms, privacies):
    today = datetime.strptime(today,'%Y.%m.%d')
    terms_key = []
    terms_items = []
    for term in terms:
        terms_key.append(term[0])
        terms_items.append(term[2:])
    terms_dict = dict(zip(terms_key,terms_items))
    answer = []
    for i in range(len(privacies)):
        mon = int(terms_dict[privacies[i].split(' ')[1]])
        pre = datetime.strptime(privacies[i].split(' ')[0],'%Y.%m.%d')
        stop_day = pre + relativedelta(months=mon)
        # print(f'계약날자 : {pre}')
        # print(f'유효기간 : {mon}개월')
        # print(f'종료 날짜 : {stop_day}')
    
        if stop_day <= today:
            # print('파기')
            answer.append(i+1)
            
    return answer
solution(today, terms, privacies)

# [1, 3]

 

728x90
728x90

문제 설명

  • 코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.
    • 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
    • 한 번 사용한 카드는 다시 사용할 수 없습니다.
    • 카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
    • 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
  • 예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.
  • 문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ cards1의 길이, cards2의 길이 ≤ 10
    • 1 ≤ cards1[i]의 길이, cards2[i]의 길이 ≤ 10
    • cards1과 cards2에는 서로 다른 단어만 존재합니다.
  • 2 ≤ goal의 길이 ≤ cards1의 길이 + cards2의 길이
    • 1 ≤ goal[i]의 길이 ≤ 10
    • goal의 원소는 cards1과 cards2의 원소들로만 이루어져 있습니다.
  • cards1, cards2, goal의 문자열들은 모두 알파벳 소문자로만 이루어져 있습니다.

# 예제
cards1 = ["i", "drink", "water"]
cards2 = ["want", "to"]
goal = ["i", "want", "to", "drink", "water"]
# return값은 'Yes'여야 합니다.
def solution(cards1, cards2, goal):
    answer = []
    # for문을 사용하여 goal리스트의 값을 하나하나 살펴 봅니다
    for word in goal:
        
        # 만약 word와 cards1의 첫번째 요소가 같다면
        if word == cards1[0]:
            # cards1의 첫번째 요소를 빼서 cards1의 마지막에 넣습니다.
            cards1.append(cards1.pop(0))
            # 그리고 answer에는 'Yes'를 넣습니다.
            answer.append('Yes')
            
        # 만약 word와 cards2의 첫번째 요소가 같다면
        elif word == cards2[0]:
            # cards2의 첫번째 요소를 빼서 cards2의 마지막에 넣습니다.
            cards2.append(cards2.pop(0))
            # 그리고 answer에는 'Yes'를 넣습니다.
            answer.append('Yes')
            
        # 만약 word가 cards1과 cards2의 첫번째요소와 모두 맞지 않다면    
        elif (word != cards1[0]) and (word != cards2[0]):
            # answer에 'No'를 첫번째 요소로 집어 넣습니다.
            answer.insert(0,'No')
    
    # anwer의 첫번째 요소를 반환합니다.
    return answer[0]
# 함수를 실행 합니다.
solution(cards1, cards2, goal)

# 'Yes'
728x90
728x90

2022년 11월 17일...

 

 

여느날 처럼 코딩 학원에서 코드에 파묻혀 살던 비전공자는

학원 쌤으로 부터 프로그래머스라는 사이트의 코딩 테스트라는 신문물을 소개 받게 되었다.

 

그저 기본...그저 기초...그저 개념에만 파묻혀 살다가

이런 재미진(?) 사이트를 알게된 필자는 허겁지겁 문제하나를 풀어보기로 한다.

(혹시 나에게도 코딩쪽으로의 천재성이?) 라는 되도않는 희망을 품으며....

 

??? : 레벨 0은 쫀심이...레벨 1부터해보자.

 

말렸어야 했다.... 코딩 경력은 학원 2달 반이 전부인 필자에겐

레벨 1 테스트 조차 높디 높은 벽이란 사실을 그 당시 필자에게 말해주는 사람은 아무도 없었다.

 

"과일장수" 얼마나 만만해 보이는 단어들인가...

마치 초등학교 수학문제에나 나올거같은 단어들로 필자를 유혹했고...

 

 

 

 

심지어 html, css, js, python 밖에 할 줄 몰랐던 2개월 반따리 필자에게는 python으로도 풀 수 있다는 거에

조금더 부푼 희망을 안고 문제를 마주 하였다.

 

 

 

 

??? : del!! 봤던거다...오오오 return

문제보다 코드가 먼저 눈에 들어온 필자는 내적환호를 지르며 옆에 나와있는 문제를 보았다.

 

 

 

......

 

 

솔직히 첫줄 '1점부터 k점까지' 에서 부터 금이갔다.(어디가?)

 

문제를 읽어 나갈 수록 처음부터 다시 보기를 반복 했으며

다 읽고 나서도 이해가 안되 처음부터 다시 읽었다.

 

아마 문제 이해하는데 시간을 다 쓸 듯 싶다.

 

 

 

......

.........

 

뭐부터 해야되지?

농담이 아니라 키보드에 손가락 하나 갖다대지 못했다..3분 동안...

 

real 맨붕인 상황에서 for도 한번 넣어보고(스샷은 없다)

 

if 도 한번 넣어봤다가...(역시 스샷은 없다..)

 

다시 문제도 봤다가...(소용은 없다.)

 

정말 도저히 모르겠어서

alt + f4 를 누르려던 찰나

 

 

 

 

다른 사람의 풀이라는 희망적인 메세지를 보았다.

왼쪽의 자물쇠 표시가 불안했지만, 지금의 좌절감으로부터

해방되고 싶었던 나는 가감없이 클릭하였고

 

 

 

 

솔직히 그냥 풀이 열기를 눌러도 상관없지 않았나 싶다...

 

하지만, 한국 부모님밑에서, 한국만의 주입식 교육에 물들여버린 필자는

 

점수가 깍인다는 것을 용납할 수 없었고,

 

시간이 얼마나 오래 걸린다 한들 끝까지 풀어보자는 의지를....

 

 

 

 

불태워서 구글링하니 바로 나오더라....(Jiwoon님 정말 감사합니다...정말 천재세요....)

 

"천재 Jiwoon" 님의 블로그를 읽어보니 문제 부분 부터 정리가 잘 되어있었다.

 

약간의 양심의 가책(?)을 느끼며 "천재! Jiwoon"님의 블로그를 읽어 내려갔다.

 

 

 

 

그치...레벨 1인데 쉽겠지...라는 생각과 자괴감이 몰려올 무렵 한층 짙은 혼돈의 카오스적인 절망이

나를 덥쳐왔다.

 

 

 

 

.....?

 

.......???

 

단 7줄....

 

심지어 원래 적혀져있던 3줄을 제외하면 고작 4줄을 추가하는 것으로

저 미친 난이도의 문제 (level 1. 사과장수) 를 풀 수 있다는 것이다.

 

??? : 뭐지?? 저 문제를 자동으로 풀어주는 패키지나 모듈을 불러온 것인가?

 

라는 허무맹랑한 생각을 하며, 코드를 뜯어 보았다.

(개발자들은 이때 코드를 뜯어 본다는 말을 하더라...왠지 멋져보여서 따라해 보았다.)

 

 

구글 코랩으로 풀어보려했다....

 

안 뜯어짐.

 

아니 ㄹㅇ 안 뜯어짐

 

단 7줄 짜리에 코드에 얼마나 거대한 우주의 진리가 담겨있기에....

진짜 몇번을 봐도 모르겠다.

 

해설을 봐도 무슨 말인지 전혀 모르겠다.

 

40분동안 우주의 진리를 담은 7줄 짜리 코드를 보며 겨우 해답에 가까워져 갔다.

 

그리고 해답에 가까워져 가면서 이 블로그를 작성하신

"천재! Jiwoon" 님이 얼마나 대단한 알고리즘적인 구사 능력을 가지고 계신지도 느꼈다.

 

 

 

 

"!초천재! Jiwoon" 님의 해설을 참고하여(?)

문제를 풀어 보았다.

 

약간의 양심으로 변수이름을 packed에서 i 로 바꿔 보았다.

 

 

 

??? : 양심의 가책따윈 느끼지 않는다.

 

헛소리를 지껄이며 하루에 두 문제 정도 풀어보자. 라고 다짐한 과거의 나를

고이 접어 보내며 인터넷 창을 모조리 끄면서...

 

오늘의 포스팅을 마치겠다.

(혹시 급마무리 같은 냄새를 맡았다면 개코인정)

 

마지막으로 "!우!주!천!재! Jiwoon" 님에게 심심한 감사의 인사를 보낸다.

 

 

Jiwoon 님의 블로그로 이동할 수 있습니다.

728x90

+ Recent posts