※ 개발일지가 아니라 일기일 수도 있는 점 양해바랍니다. 오전, 오후, 새벽이 모두 담겨있어요.※
※ WEEK 시작인 매주 목요일에 업데이트 됩니다. 많.관.부 ※
DAY01 22.09.22 (목) WEEK00의 끝과 새로운 시작
GJ님과 SW님의 도움과 헌신 아래 3일만에 프로젝트 하나를 완성했다. 그래도 힘들게 했던 프로젝트이기에 리드미를 작성했다. WEEK00을 무사히 끝마치고 WEEK01 발제를 한 뒤 예상에도 없던 회식을 하였다. 코치님, 대표님, 의장님과 술을 한 잔을 하고, (한 잔이 아니였..) 얼른 동기들끼리 친해져서 모르는 것도 빨리빨리 물어보라는 명확한 의도의 술자리였다. 정말 덕분에 거의 대부분의 동기들과 안면과 말(?)을 텄고, 친해질 수 있었다.
DAY02 22.09.23 (금) input부터 시작이니라
백준 알고리즘의 시작은 input을 잘 받는 것부터 아닐까..
거의 무지의 상태였던 머리에서 데이터를 입력받게 만드는 머리로 전환되는 하루였다.
DAY03 22.09.24 (토) 과연.. 이것이 컴퓨팅사고로의 전환인가?
나: 언니 시온 어떻게 알아?
언니: 나 C언어 모르는데?
나: ???
나: 소수가 안 풀려..
오빠: 소주가 아직도 안 풀렸어? 이틀이나 지났는데
나: ???
DAY04 22.09.25 (일) KEEPGOING
DAY05 22.09.26 (월) 내 힘으로 로직 구현
오늘은 파이썬 문법은 찾아보더라도 내 힘으로 로직을 짜고 구현해보려고 애를 썼다. 정말 ... 구현까지의 시간은 오래걸렸지만 오늘 푼 대부분의 문제는 정답 혹은 비슷한 코드라도 보지 않았다는 점에서 뿌듯하다.
대망의 수학 친구들을 끝내고 대망의 재귀함수 친구들로 입성.
카드놓기에서 멘탈 한 번 털리고, 하노이탑으로 넘어갔는데 하노이탑을 직접 해본 기억이 있기 때문에 하노이탑이 어떤 규칙으로 흘러가는지는 알고 있었지만, 재귀함수로 하노이탑 구현 과정을 도저히 짤 수 없었다. 하노이탑의 규칙을 알았기 때문에 1. 원판의 개수가 입력으로 주어졌을 때 2. 규칙을 가지고 3.이동하는 횟수를 출력하는 코드만 짰었다. 하지만 백준에서 원판의 개수 N이 20보다 작을 때 수행 과정을 출력해야했기 때문에 규칙만으로는 답을 구할 수 없고, 로직을 구현해야했다.
# 1914: 하노이 탑
# 방법은 100%로 이해했지만 재귀로 짜는 방법을 모르겠다.
import sys
# 입력: 첫 번째 장대에 쌓인 원판의 개수 N(1<=N<=100)
n = int(sys.stdin.readline())
# 재귀는 어떻게 쓰는거지??????
def hanoitop(n):
result = 3
for i in range(2, n+1):
if i == n:
print(result)
break
elif i >= 2:
result = 2 * result + 1
hanoitop(n)
DAY06 22.09.27 (화) 재귀함수가 뭐야? 재귀함수란 말이야. 재귀함수이지. 재귀함수가 뭐야? 재귀함수란 말이야.....
하노이탑의 늪에 빠졌고, 재귀함수로 구현된 정답 코드를 확인하였다. 사실 정답 코드를 본다고 해서 한 번에 이해된 것은 아니지만, 끝내 하노이탑을 완료하였다.
# 1914: 하노이 탑
import sys
# 입력: 첫 번째 장대에 쌓인 원판의 개수 N(1<=N<=100)
n = int(sys.stdin.readline())
# 6 = 1 + 2 + 3
def move(n, x, y):
if n > 1:
move(n-1, x, 6-x-y)
print(x, y)
if n > 1:
move(n-1, 6-x-y, y)
# 등비수열
# 3, 7, 15, 31 ...
count = 2**n-1
if n > 20:
print(count)
else:
print(count)
move(n, 1, 3)
카드놓기 문제는 직접 구현하면 시간이 오래 걸릴거라고 판단하여 모듈을 사용하였다. import itertools 를 임포트하여 순열과 조합을 간단한게 구현할 수 있다.
수 정렬하기는 1. sort()를 이용하는 방법과 2. 삽입정렬을 이용하는 방법으로 풀었다.
수 정렬하기 2는 sort()로 풀리긴 했는데,
수 정렬하기 3는 카운팅 정렬을 사용해야했다.
WH오빠가 수 정렬하기 3를 설명해주면서 단계별로 풀어보기에서 다음과 같은 약간의 힌트를 확인할 수 있다는걸 알게 되었다.
오늘 오빠들과 학식을 먹고, 커피를 기다리는동안 CH오빠의 여자친구 꿈 얘기를 들었다. 오늘 여친분께서 악몽을 꾸시고 깨셨다는데, 꿈에서 엄마가 뒤에 계셨는데 방문을 열었더니 엄마가 있어서 너무 무서워서 깼다고 한다. CH: 엄마가 재귀함수인가 보다.. 그렇게 재귀함수의 늪에 빠진 우리..
여담)
1. 밥먹으러 가면서 오빠들에게 Intel Mac과 M1, M2의 차이에 대한 자세한 설명을 들었고, M2의 위대함을 알게 되었다. 하드웨어 엔지니어와 소프트웨어 엔지니어가 갈린 작품 아닐까 싶다. 다음 노트북은 Mac을 사야겠다.
2. 머리가 말랑말랑 할 때 코딩을 하면 잘 할 수 있다는 조기교육 이야기하다가 CH오빠는 돌잔치에 키보드를 놔둔다고 했고, JH오빠는 기계식 키보드를 나둔다고 했다. 난 M2를 놔둬야겠다 푸핫🤣
3. 나: 내일을 마지막으로 우리 3명이 앞으로 있을 조 구성에서 같은 팀이 될 확률이 이제 거의 없겠다..
나, A: (내일 마지막인데 뭐 먹지 ? ? !)
B: (조합으로 하면... 확률이.... )
DAY07 22.09.28 (수) 다시 시작된 재귀의 늪(?)
연산자 끼워넣기에서 int형 리스트와 튜플을 한 번에 더할려고 하니 계속 꼬였던 것 같다. JH오빠의 코드를 보고 이해하였다.
# 14888: 연산자 끼워넣기
import sys
from itertools import permutations
N = int(sys.stdin.readline().strip())
num_list = [0] * N
num_list = list(map(int, sys.stdin.readline().split()))
operator = [0] * (N-1)
operator = list(map(int, sys.stdin.readline().split()))
# 인덱스 갯수에 따라 연산자 넣어주기
oper_list = [0] * (N-1)
num = 0
for i in range(4):
# operator[i] 요소의 개수만큼 반복문이 돌아서 리스트에 넣어줌
for j in range(operator[i]):
oper_list[num] = i
num += 1
# 연산자의 가능한 순열(중복값 제거)
cases = list(set(permutations(oper_list, N-1)))
minimum = 1000001000
maximum = -1000001000
for case in cases:
calc = num_list[0]
for i in range(N-1):
if case[i] == 0:
calc = calc + num_list[i+1]
if case[i] == 1:
calc = calc - num_list[i+1]
elif case[i] == 2:
calc = calc * num_list[i+1]
elif case[i] == 3:
if calc < 0:
calc = -(abs(calc)//num_list[i+1])
else:
calc = calc // num_list[i+1]
if calc < minimum:
minimum = calc
if calc > maximum:
maximum = calc
print(maximum, minimum)
담주부터는 매일 한 줄이라도 써야겠다..!
'SW사관학교 정글 > 개발일지' 카테고리의 다른 글
In the jungle on the last day of 2022 (0) | 2022.12.31 |
---|---|
핀토스는... 내 맘을 ... (2) | 2022.12.11 |
[WEEK05] 개발일지 (부제: 🔴⚫🌳) (7) | 2022.10.28 |
[WEEK03] 개발일지 (부제: set💖과 소소한 행복 찾기) (6) | 2022.10.13 |
[WEEK01] 특별한 과제 (부제: 찬찬히 나를 돌아보는 시간) (9) | 2022.09.24 |