알고리즘 1일차

vscode 설정하기

우선 그냥 편한 파이참으로 해도 되지만 vscode 사용을 익히는 겸 설정을 진행했다. 아직은 맥이 익숙하지 않고 터미널 쉘 환경 (zsh, bash 등)이 낯설어서 고생을 좀 했다. 환경설정 진행은 아래와 같다.

  1. 기본 쉘을 bash 로 설정하기

    • 맥은 zsh가 디폴트였는데 homebrew 설치 후 git, python3 설치
    • vscode 에서 기본 shell 변경 (설치 후 재부팅 해야 bash 뜨는 듯?)
    • vscode 설정 단축키 : cmd + ,
  2. python3 을 기본 파이썬 버전으로 설정하기

    • python -V (= python --version) 으로 버전 확인
    • ls -l /usr/local/bin/python* 로 전체 설치된 버전 확인
    • ln -s -f /usr/local/bin/python3.8 /usr/local/bin/python 버전변경
    • 맥 터미널에서 하고 껐다 켜면 바뀐다.
  3. venv 설정하기

    • 작업 공간 폴더를 만들고 해당 폴더 안에서 venv 만들기
    • python -m venv venv : 맨뒤 venv는 폴더 이름인데 venv라고 통상적으로 만든다.
    • 그리고 폴더 새로고침하면 만들어져 있다.
    • 가상환경 켜기 - 폴더 상황에 따라 코드는 유동적임 기본 적으로 아래와 같다.
    • source ./venv/bin/activate 즉, activate가 있는 폴더 구조를 타고 들어가는 코드로 activate 를 실행 시켜 주면 되고 앞에 source 빼먹지 말아야한다.
    • 가상환경 끄기 - deactivate 입력하면 된다.

    < 그 외 북마크 링크들 찾아보거나 다시 구글링 하자.. >

1번 - 사칙연산

간단한 사칙연산 문제였다. 하지만 백준을 처음 써봐서 예제 입력값을 어떻게 받아오는지 어려웠다.

  • 한 줄로 입력값 받아오기 : input().split() 으로 띄어쓰기 기준 단어 나눠서 변수 저장
  • input 으로 받은 값은 str 형태 이므로 int(변수) 로 활용

2번 - 세자리 수 곱하기

세자리 수 곱하기 할 때 모든 과정을 출력하는 문제였다. 여렵게 생각하지 말고 변수 하나는 int형 하나는 str 로 받아서 str 을 한글자씩 떼와서 다시 숫자형으로 변환한 후 각각 곱한 뒤 결과값은 그냥 곱하면 된다.

  • 출력할 때 값 하나당 한줄 씩 띄우는 법 : sep='\n'
    print(a, b, sep='\n')

3번 - 알람 시간 바꾸기

시간 입력값을 받아와서 int형으로 각각 변수에 저장하는 것이 처음에 힘들었다. 간단하게 쓸 수도 있고 리스트 형태로 나눠서 변수 저장을 해도 되는 듯 하다.

# 예시 1
H, M = map(int, input().split()) 

# 예시 2
time = input().split()
hour = int(time[0])
minute = int(time[1])

중간에 시간 계산하는 코드를 작성하는 데 실수를 많이 해서 오래 걸리긴 했지만 그리 어려운 문제는 아닌 것 같다. if 문을 쓸때 예외 사항을 코드로 누수없이 작성하는 스킬이 필요하다.

4번 - 더하기 사이클

규칙을 따라 숫자를 더해서 만든 숫자가 다시 처음 자기 자신으로 돌아오는데 까지 걸리는 횟수를 구하는 문제다. 포인트는 입력받은 값이 자꾸 변하기 때문에 최종 결과와 비교할 수 있는 첫 입력값 저장, 체크 목적의 변수가 필요하다.

  • 체크 변수 = 입력값
  • 새로 만들어지는 수, 규칙에 따라 중간 값을 저장하기 위한 변수, 횟수를 세는 변수 필요
  • while True : 반복문 안에 break 가 없으면 무한 루프가 생기는 구문.
  • 새로 생긴 숫자와 체크변수(초기 입력값)이 같으면 break 하게 해서 카운트를 센다.

문제를 풀때 1차원 적으로 접근해서는 안된다는 것을 느낀 문제다. 문제에서 숫자를 앞 뒤로 나누었다고 해서 문자열로 바꾸어 문제대로 상황을 푸는 것이 아니라 몫, 나머지의 개념으로 바라보고 코드로 활용가능한 방법을 구현해 내야 한다는 것을 느꼈다. 코드를 짜다가 코드가 더럽다 싶으면 진짜 더러운 것이니 깔끔히 지우고 새로운 방법을 구상해야한다.

  • 결론 : 숫자를 앞 뒤로 자르는 식의 문제는 몫, 나머지 (10, 100 단위)를 잘 활용하면 된다.

5번 - 평균은 넘겠지

여러 줄을 입력 받아서 1번줄은 체크할 샘플 수, 각 다음 줄의 [0] 번째는 학생 점수 케이스 수, 점수 순이었는데 이 데이터를 가공하는 것이 어려웠다. 이때문에 초반 런타임에러가 났다.

  • 런타임 에러 (value error) : 일반적으로 배열 인덱스를 잘못 참조했을 때 발생한다. 즉 리스트 등으로 입력 값을 받는데 효용범위를 벗어나는 방식으로 배열을 지정하면 발생한다. 나 같은 경우 입력값이 랜덤일 수 있는 상황에서 백준 예시 숫자만으로 a, b, c, d, e 5가지로 변수 고정시켜 받아오면서 확장성이 없는 코드를 짠 과정에서 에러가 발생한 듯? 싶었다.

  • 결국 그냥 예시만 겨우 답을 내는 수준으로 코드를 짜는 것이 아니라 어떤 케이스가 들어와도 받아 낼 수 있는 확장성 있는 코드와 변수, 배열을 지정하는 것이 맞다는 것을 배웠다.

여러줄 입력 받는 방법 (1차원 배열)

  • 처음 몇줄이 나온다는 단서가 있는 경우 였는데
  • 이 숫자를 처음에 변수로 받아서 그 갯수만 큼 for 문을 반복하고
  • 그 안에 input 값을 넣어서 변수 만큼 값을 받는 구조로 만들었다.
  • 그리고 바로 이어서 그 변수를 해당 문제에서 원하는 방식으로 가공해줄 함수를 앞 부분에 만들어서
  • 결국 for 문으로 값을 받으면서 바로 값을 반환하도록 만들었다.
  • 아래처럼 한번에 여러줄을 받을 수 있긴하지만
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

6번 - 셀프넘버

딕셔너리 key 값을 이용해서 정수리스트와 셀프넘버 리스트를 저장 비교하는 방식으로 제거하고 남은 딕셔너리 key 값을 반환하는 식으로 작성했다. 여기서도 몫, 나머지 개념을 활용해서 셀프넘버를 구하였고 만까지의 정수들이 만들 수 있는 셀프넘버 중 만을 넘지 않는 숫자만 셀프넘버에 append 했다.

  • 딕셔너리 key 값을 비교하는 것이 목적이기에 value 값으로는 아무 것이나 들어가도 무방한다.
for key in int_list:
        exception_dict[key] = True  # 꼭 True 일 필요도 없다. 그냥 key를 저장하는 형식이 필요할 뿐이다.
  • 이후 셀프넘버의 값을 for 문으로 들고오면서 저장해둔 정수 딕셔너리에 같은 값이 있으면 키값을 del 하는 방식이다.
for key in self_num_list:
        del exception_dict[key]
  • 남은 key 값 들을 한줄씩 프린트 하기 위해서 새로운 결과 리스트를 만들어 append 해주었고 for 문을 돌면서 프린트 하게 했다.
    for key in exception_dict.keys():
        result.append(key)

    for i in range(len(result)):
        print(result[i])
  • 마지막으로 함수를 불러오는데 여기서 오류가 있었다. 이미 함수안에 프린트가 있어서 print(함수())로 코드를 불러오니 맨 마지막 값에 None 이 생겨서 출력값 불일치로 오답처리가 되었다. 이때는 print(print()) 의 느낌이므로 그냥 print 없이 함수만 불러오면 된다. 아니면 함수 안에서는 그냥 return 정도로 처리하면 되지 않을까 싶다.

느낀점

  1. 처음으로 알고리즘 문제를 풀어봤는데 생각보다 오류가 많고 자잘한 실수가 시간을 오래 끌게 만들었다. 문제를 접근하는 방식을 더 많이 연습해 봐야할 것 같고 지금 작성한 코드들이 그닥 좋은 코드라는 생각은 들지 않아서 다른 사람들의 코드를 더 많이 참조해 봐야 할 것 같다.

  2. 저녁 8시에 알고리즘 튜터님의 설명을 들었는데 이제 시작한 단계에서는 최소 목표를 어디로 잡는게 좋은지 여쭤 봤고 프로그래머스 레벨 2 정도를 답을 보더라도 다시 이해하고 안보고 풀수있는 정도로 해도 좋다고 하신 걸 들으니 너무 부담 갖지 말고 해야겠다는 생각을 가지게 되었다.

  3. 너무 잘하는 분들이 많은 상황에서 주눅들지 말고 나의 페이스를 지키면서 너무 스트레스 받지말고 문제 유형을 공부해간다는 느낌 정도로 접근해볼 생각이다.

profile
# 인생은 못 먹어도 GO # 오늘의 과제에 최선을 다하는 열심 인간

0개의 댓글