우선 그냥 편한 파이참으로 해도 되지만 vscode 사용을 익히는 겸 설정을 진행했다. 아직은 맥이 익숙하지 않고 터미널 쉘 환경 (zsh, bash 등)이 낯설어서 고생을 좀 했다. 환경설정 진행은 아래와 같다.
기본 쉘을 bash 로 설정하기
python3 을 기본 파이썬 버전으로 설정하기
venv 설정하기
< 그 외 북마크 링크들 찾아보거나 다시 구글링 하자.. >
간단한 사칙연산 문제였다. 하지만 백준을 처음 써봐서 예제 입력값을 어떻게 받아오는지 어려웠다.
세자리 수 곱하기 할 때 모든 과정을 출력하는 문제였다. 여렵게 생각하지 말고 변수 하나는 int형 하나는 str 로 받아서 str 을 한글자씩 떼와서 다시 숫자형으로 변환한 후 각각 곱한 뒤 결과값은 그냥 곱하면 된다.
print(a, b, sep='\n')
시간 입력값을 받아와서 int형으로 각각 변수에 저장하는 것이 처음에 힘들었다. 간단하게 쓸 수도 있고 리스트 형태로 나눠서 변수 저장을 해도 되는 듯 하다.
# 예시 1
H, M = map(int, input().split())
# 예시 2
time = input().split()
hour = int(time[0])
minute = int(time[1])
중간에 시간 계산하는 코드를 작성하는 데 실수를 많이 해서 오래 걸리긴 했지만 그리 어려운 문제는 아닌 것 같다. if 문을 쓸때 예외 사항을 코드로 누수없이 작성하는 스킬이 필요하다.
규칙을 따라 숫자를 더해서 만든 숫자가 다시 처음 자기 자신으로 돌아오는데 까지 걸리는 횟수를 구하는 문제다. 포인트는 입력받은 값이 자꾸 변하기 때문에 최종 결과와 비교할 수 있는 첫 입력값 저장, 체크 목적의 변수가 필요하다.
문제를 풀때 1차원 적으로 접근해서는 안된다는 것을 느낀 문제다. 문제에서 숫자를 앞 뒤로 나누었다고 해서 문자열로 바꾸어 문제대로 상황을 푸는 것이 아니라 몫, 나머지의 개념으로 바라보고 코드로 활용가능한 방법을 구현해 내야 한다는 것을 느꼈다. 코드를 짜다가 코드가 더럽다 싶으면 진짜 더러운 것이니 깔끔히 지우고 새로운 방법을 구상해야한다.
여러 줄을 입력 받아서 1번줄은 체크할 샘플 수, 각 다음 줄의 [0] 번째는 학생 점수 케이스 수, 점수 순이었는데 이 데이터를 가공하는 것이 어려웠다. 이때문에 초반 런타임에러가 났다.
런타임 에러 (value error) : 일반적으로 배열 인덱스를 잘못 참조했을 때 발생한다. 즉 리스트 등으로 입력 값을 받는데 효용범위를 벗어나는 방식으로 배열을 지정하면 발생한다. 나 같은 경우 입력값이 랜덤일 수 있는 상황에서 백준 예시 숫자만으로 a, b, c, d, e 5가지로 변수 고정시켜 받아오면서 확장성이 없는 코드를 짠 과정에서 에러가 발생한 듯? 싶었다.
결국 그냥 예시만 겨우 답을 내는 수준으로 코드를 짜는 것이 아니라 어떤 케이스가 들어와도 받아 낼 수 있는 확장성 있는 코드와 변수, 배열을 지정하는 것이 맞다는 것을 배웠다.
N = list(input() for _ in range(10)) # 예시 1
maze = [list(map(int, input())) for _ in range(n)] # 예시 2 리스트로 만들어서 받기
생각보다 은근 까다롭다고 느낀 소수점. 일반적으로 round 를 쓰면 지정 숫자 범위를 넘어 선 소수점들을 정리가 되어 나오는 것에 반해 숫자 범위 안에 있던 것들이 자리수를 채워서 출력되지는 않았다.
round(3.1235, 3) = 3.123
round(3.14, 3) = 3.14
따라서 처음에 format 이라는 구조를 알게 되어 적용했는데 그것 보다는 f-string이 쓰기에 더 편한 느낌이다.
x = '{변수:.3f}%'
변수에는 소수점을 지정하고 싶은 숫자 내용이 들어가고 3이 소수점을 나타낸다. 자세한 사항은 구글링 gogo
딕셔너리 key 값을 이용해서 정수리스트와 셀프넘버 리스트를 저장 비교하는 방식으로 제거하고 남은 딕셔너리 key 값을 반환하는 식으로 작성했다. 여기서도 몫, 나머지 개념을 활용해서 셀프넘버를 구하였고 만까지의 정수들이 만들 수 있는 셀프넘버 중 만을 넘지 않는 숫자만 셀프넘버에 append 했다.
for key in int_list:
exception_dict[key] = True # 꼭 True 일 필요도 없다. 그냥 key를 저장하는 형식이 필요할 뿐이다.
for key in self_num_list:
del exception_dict[key]
for key in exception_dict.keys():
result.append(key)
for i in range(len(result)):
print(result[i])
처음으로 알고리즘 문제를 풀어봤는데 생각보다 오류가 많고 자잘한 실수가 시간을 오래 끌게 만들었다. 문제를 접근하는 방식을 더 많이 연습해 봐야할 것 같고 지금 작성한 코드들이 그닥 좋은 코드라는 생각은 들지 않아서 다른 사람들의 코드를 더 많이 참조해 봐야 할 것 같다.
저녁 8시에 알고리즘 튜터님의 설명을 들었는데 이제 시작한 단계에서는 최소 목표를 어디로 잡는게 좋은지 여쭤 봤고 프로그래머스 레벨 2 정도를 답을 보더라도 다시 이해하고 안보고 풀수있는 정도로 해도 좋다고 하신 걸 들으니 너무 부담 갖지 말고 해야겠다는 생각을 가지게 되었다.
너무 잘하는 분들이 많은 상황에서 주눅들지 말고 나의 페이스를 지키면서 너무 스트레스 받지말고 문제 유형을 공부해간다는 느낌 정도로 접근해볼 생각이다.