9/5 오늘의 시간표
09:00 ~ 10:00 [실시간] 파이썬 문법
10:00 ~ 11:00 [실시간] 파이썬 문법
11:00 ~ 12:00 [실시간] 파이썬 문법
12:00 ~ 13:00 [실시간] 파이썬 문법
13:00 ~ 14:00 점심식사
14:00 ~ 15:00 [특강] 효율적인 코딩 공부법(학습법)
15:00 ~ 16:00 [특강] 효율적인 코딩 공부법(학습법)
16:00 ~ 17:00 [실시간] 파이썬 문법
17:00 ~ 18:00 [실시간] 파이썬 문법
18:00 ~ 19:00 저녁식사
19:00 ~ 20:00 [실습] 실무적용 알고리즘 실습
20:00 ~ 21:00 [실습] 실무적용 알고리즘 실습
오늘의 오전강의는 파이썬 문법 강의였다. 하지만 한가지 저번 주와 다른 것이 있다면 이번주는 원격 강의가 아닌 이창호 튜터님이 진행하는 실시간 강의라는 점이다. 많은 인원들이 줌에 모여 실시간 화상 강의가 진행되었고 오늘은 그 첫날이기 때문에 OT느낌을 겸해 가볍게 진행되었다.
파이썬 문법 실시간 화상강의
첫 강의의 주된 내용은 문법적인 부분보다는 파이썬의 기초 이론에 관련된 내용이었다. 튜터님도 설명을 하시면서 지금은 이해가 안될 것이라고 미리 말씀해 주셨지만 초반 내용은 정말 머리에 하나도 들어오지 않았다. TIL로 정리를 하고 있는 지금도 100% 이해했다고 자신할 수 없는 상태이다. 컴파일러, 인터프리터 언어, 코드 컨벤션 등 최근 한달 간 캠프를 준비하며 사전공부를 나름 열심히 했다고 생각했는데 들어보지도 못한 생소한 단어들이 계속 나오니 머리가 하얘졌다. 하지만 이 부분은 튜터님도 말씀하셨듯이 이해가 안되는게 당연한 것이니 너무 깊게 파고들지 않고 파이썬이란 이런것이다 정도로만 머리속에 넣어두기로 했다. 대신 코드 컨벤션 정도는 확실하게 알아둬야 차후에 웹개발 작업을 하게 될 때 유용하게 쓸 수 있을 것이라 생각이 들기에 한 번 정리하고 가는 것이 좋을 것 같다.
코드 컨벤션이란 코드를 개발하다보면 타인이 작성한 코드를 알아 볼 수 없는 경우가 빈번하게 발생하기 때문에 이를 방지하기 위해 스타일을 통일하는 '약속' 같은 것이다. 코드 컨벤션은 개발하는 언어에 따라서 다르기 때문에 본인이 개발에 사용하는 언어에 따라 코드 컨벤션의 스타일도 바뀌는 것에 유의해야 한다.
파이썬에서는 네이밍 컨벤션으로 변수 / 함수를 네이밍할 때는 Snake 표기법을, Class를 네이밍할 때는 Pascal 표기법을 사용한다.
Pascal 표기법은 각 단어를 대문자로 구분하는 표기법이고(PythonIsVeryGood)
Snake 표기법은 각 단어를 언더바(_)로 구분하는 표기법이다.(python_is_very_good)
선언할 변수 명 = 변수에 넣고 싶은 값
과 같은 형태로 변수를 선언할 수 있습니다.description = “변수를 선언 하는 방법입니다.”
a, b, c = 1, 2, 3
list_ = [1,2,3,4]
number = 10
과 같이 사용되며, 정수 자료형이기 때문에 소수점은 지원하지 않습니다.number = 10.3
과 같이 사용되며, 소수점을 지원합니다.hello = "world!!"
와 같이 사용되며, 변수에 문자를 저장할 수 있습니다.numbers = [1, 2, 3, 4, 5]
와 같이 사용되며 1개 이상의 값을 한 변수에 담아 사용할 수 있습니다.numbers = (1, 2, 3 ,4, 5)
와 같이 사용되며 리스트와 동일한 방법으로 선언할 수 있습니다.numbers = {1, 2, 3, 4, 5}
와 같이 사용되며 리스트와 동일한 방법으로 선언할 수 있습니다.members = {”1”: “lee”, “2”: “park”, “3”: “kim”}
과 같이 사용되며 {key: value} 쌍으로 이루어져 있습니다.flag = True
와 같이 사용되며 True 혹은 False 두 값만 사용할 수 있습니다.효율적인 코딩 공부법 특강
점심을 먹고 난 2시부터는 강민철 튜터님이 준비하신 효율적인 코딩 공부법에 대한 특강이 마찬가지로 줌에서 실시되었다. 우선 비전공자이기 때문에 코딩에 대해 겁을 먹고있는 우리를 위해 격려의 말씀을 해 주셨는데 비전공자이기 때문에 기죽어있었던 나 자신에게 아주 큰 힘이 되었다. 그리고나서 공부법에 대한 설명을 해주셨다. 고등학교시절 수능을 공부할 때나 대학에서 학점을 따기 위해 시험공부를 할 때 처럼 공부를 하면 안된다고 하셨는데 마침 내가 그때의 학습법을 그대로 따라하고 있었기 때문에 많이 찔렸다. 아무래도 평생을 공부라고는 전부 성적을 받기위한 공부만 했기 때문에 아무래도 그 습관이 쉽게 안고쳐지는 것 같다. 오늘부터 공부 할 때 계속 이 부분에 신경쓰면서 공부를 진행해야겠다고 생각했다. 다음으로는 프로그래밍 언어 또한 '언어'이기 때문에 계속 사용해보면서 말이 되도록 하는것이 중요하다고 하셨다. 나도 너무 완성된 코드만 만들려고 하다보니 이런 점을 간과한 것 같은데 실패도 해보면서 올바른 코드를 만드는 방법을 찾아가는 것을 중요시해야겠다.
프로그래밍 언어 (언어학자 전직 X 익숙해지기 O)
↓
프레임워크/라이브러리 (프레임워크는 기계! “사용법을 익히자”는 마음가짐으로)
↓
프로젝트 (완벽하게, 면접관 앞에서 설명할 수 있을 정도로)
↓
프로젝트 발전 (배포하기, 사용자 피드백 받고 유지보수하기, 테스트하기) + 코딩 테스트 대비 (개념 잡기, 그림 그리기, 코드로 옮기기)
이런 코딩 학습의 순서도 알려주시고 최종적으로는 결국 TIL 작성을 강조해주셨다. 앞으로도 TIL 작성에는 신경을 쓰도록 해야겠다.
알고리즘 실습
오늘도 어김없이 돌아온 알고리즘 실습 시간이다. 오늘은 반복문 단계의 문제를 풀어보게 되었다.
총 13문제를 풀었고 그 중에서 이해가 어려웠던 문제 몇가지를 가져와서 풀이를 다시 해 보았다.
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
정답
T = int(input())
for i in range(T):
A, B = map(int, input().split())
A > 0, B < 10
print(A+B)
T에서 테스트 케이스를 입력받고 그 수만큼 A와B의 합을 출력하도록 for문과 range함수를 활용하였다.
문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.
출력
1부터 n까지 합을 출력한다.
정답
n = int(input())
sum=0
for i in range(1, n+1):
sum += i
print(sum)
sum=0으로 변수를 지정해 두고 range 함수를 활용하여 범위를 1부터 n까지로 생성한다.
sum += i는 sum=sum+i와 같은 의미이기 때문에 sum을 출력해준다면 1부터n까지의 합이 구해진다.
문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.
Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.
이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.
입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
정답
import sys
T = int(input())
for i in range(T):
A, B = map(int, sys.stdin.readline().split())
print(A+B)
일반적인 input을 사용하면 시간이 부족해지므로 sys.stdin.readline를 사용합니다. 이를 위해 첫줄에서 import sys를 적용하고 10950번 문제를 그대로 가져와 input을 sys.stdin.readline로 바꿔주면 됩니다.
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
정답
T = int(input())
for i in range(1,T+1):
A, B = map(int, input().split())
print(f'Case #{i}: {A+B}')
마찬가지로 10950번의 코드를 그대로 가져와 약간만 수정하면 답을 낼 수 있다. %s를 통해 문자열을 구분하는 방법도 있지만 나는 f-스트링을 사용하였다. f-스트링으로 Case 뒤에 번호를 넣고 결과값이 나오도록 하면 될 것이다. 대신 이때 번호를 1부터 세야되므로 range 안의 값을 T에서 1, T+1로 수정해준다.
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.
출력
각 테스트 케이스마다 A+B를 출력한다.
정답
while True:
A, B = map(int, input().split())
if (A == 0 and B == 0):
break
print(A+B)
while문을 이용하여 무한루프를 쓰고 A, B가 0일때 break를 걸어준다.
문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
출력
첫째 줄에 N의 사이클 길이를 출력한다.
정답
N = int(input())
Num = N
cnt = 0
while True:
Num = (Num % 10) * 10 +(Num // 10 + Num % 10) % 10
cnt += 1
if Num == N:
break
print(cnt)
이 문제는 구글링을 통해 정답을 가져오긴 했지만 해설을 몇번을 찾아봐도 도저히 이해가 안되서 오늘은 일단 넘기기로 하였다. 이번주 중 시간이 있을때 다시 이 문제를 풀어보고 완전히 이해한다면 이번주 WIL에서 다시 한 번 정리하도록 하겠다.
대망의 2주차가 이제 시작되었는데 실시간 강의로 전환되어서인지 강의를 듣는 재미도 더 늘었고 그만큼 난이도도 올라간 것 같아 기대반 걱정반이다. 하지만 이왕 시작한거 피할수 없으니 즐겨보도록 하겠다.