no image
[Python] 프로그래머스 숫자 변환하기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 x에서 y 까지의 최소 이동 횟수를 구하기 위해서 BFS를 활용했다. 이때 x와 y가 같은 경우엔, 이동 횟수가 0으로도 도달 가능하기에 미리 예외 처리를 해줬다. # 최소 연산 횟수? # y 까지의 위치를 저장하는 배열 생성 후 BFS from collections import deque def bfs(map_info: list, start: int, end: int, n: int) -> int: queue = deque() queue.append(start) # BFS 시작 while..
2023.03.24
no image
[Python] 프로그래머스 삼각 달팽이 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 재귀를 활용한 풀이 : 코드 작성 실패 n 이 3 보다 클 경우, 전체 삼각형은 외부 삼각형, 내부 삼각형으로 분리할 수 있다는 점을 주목해 풀이를 시도했다. 코드 작성엔 실패했고, 다른 사람이 작성한 아래 코드를 보고 이해한 뒤 주석을 작성했다. arr = [] def draw(x, y, cnt, num): if cnt < 1: return number = num # 삼각형의 좌측 대각선 for i in range(cnt): arr[x + i][y] = number number += 1..
2023.03.23
no image
[Python] 프로그래머스 뒤에 있는 큰 수 찾기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 완전 탐색으로 접근할 경우 $O(N^2)$ 이고, numbers의 길이는 최대 100만이기 때문에 시간 초과가 발생한다. 뒷 큰수는 앞에서 부터 값을 보관해 뒀다가, 더 큰 값이 나오면 제거하고, answer 정보를 업데이트하는 방식으로도 얻을 수 있다. 이 경우 스택에 값 numbers의 idx를 저장해두고, numbers의 숫자가 가장 최근에 입력된 값과 유사한 지 비교하면 된다. # 자신보다 뒤 + 크면서 가장 가까이 있는 수 : 뒷 큰수 # 뒷 큰수가 없으면 -1 # 완전 탐색 불..
2023.03.22
no image
[OOP] Class와 Instance(Object) 알아보기 Feat. self, cls
Class 데이터로 어떤 문제를 해결하기 위해서, OOP 원칙에 따라 코드로 구현한 것이다. 다시 말하면 어떤 집단에 속하는 Attributes(속성)과 Methods(행위)를 코드로 구현해, 변수와 메소드로 정의한 것이다. 이러한 Class는 Object(객체)의 설계도 역할을 하기 때문에, 실제 메모리 상에 올라가진 않는다. 실제 메모리에 할당되는 것은 Class가 아닌 객체이고, 객체 각각은 instance라고 부른다. Object(Instance) Class에서 정의한 것(설계도)를 토대로 실제 메모리 상에 할당된 것(실제 사물)이다. 프로그램에서의 데이터와 행위를 묶어 만들어진, 실체이다. Class로 만들어진 여러 instance는 각각 독립적이다. Python의 self 과 cls ? sel..
2023.03.21
no image
[OOP] OOP(객체 지향 프로그래밍)의 개념과 특징 알아보기
OOP란? 필요한 데이터를 추상화하여 속성(Attributes)와 행위(methods)를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 방법이다. 데이터를 중심으로 필요한 기능을 함수로 구현하는 방식의 절차 지향 프로그래밍과 달리, OOP에선 데이터와 함수들을 묶고 이를 객체로 관리한다. 객체라고 하면 뭔가 말이 어렵고 한데, 그냥 우리가 일반적으로 사용하는 언어 구조와 비슷하다고 생각하면 이해하기 쉽다. 위 그림을 예시로 들면 우선 데이터는 '돈', '잔돈', '제품'이다. 앞서 절차 지향에선 데이터(돈, 잔돈, 제품)를 행위와 별도로 생각한다고 했다. 그래서 절차 지향에선 데이터에 대한 모든 행위를 '~돈을 ~', '~잔돈을~', '~제품을~'의 식으로 표..
2023.03.16
no image
[Git] Configuration의 Scope 확인하기
Local git config --local로 접근 가능 해당 레포에만 적용 됨 설정 파일의 경로: 레포/.git/config Global git config --global로 접근 가능 현재 사용자에만 적용 됨 설정 파일의 경로: 유저/.git/config System git config --system으로 접근 가능 현재 PC의 모든 사용자와, 레포에 적용 됨 설정 파일의 경로 : 프로그램/git/config 주의! 모든 것은 현재 사용 중인 로컬 PC의 기준이고, Github 서버에 업로드 된 원격 저장소 origin과는 무관함 참고 Configure git for Azure and GitHUB and BitBucket on one system i am working on multiple proje..
2023.03.16
no image
Github Actions에서 git diff로 이전 Commit 확인하기
문제 상황Github Actions에서 git diff 명령어를 통해, 이전 Commit 정보 참고를 시도할 경우 다음과 같은 오류가 발생한다. 이때 입력한 branch 등의 이름이 잘못 되지 않아도, 동일한 메시지가 반복된다.git diff origin/main..origin/main^ 해결하기해당 오류는 checkout 액션이 가장 최근에 발생한 1개의 커밋 히스토리만 받아오기 때문에 발생하는 문제다. Github Actions이 실행되는 서버 입장에선, 히스토리 정보가 없는데 이전 커밋을 참고하라고 하니 당연히 오류가 발생할 수 밖에 없다. 이를 해결하기 위해선, checkout 액션이 이전 커밋 정보까지 받아올 수 있도록 fetch-depth 정보를 수정해줘야 한다. 앞서 1개의 커밋만 받아온다고..
2023.03.13
no image
[Github Actions] 기본 구성 요소 파악하기
Workflows 하나 이상의 Job과 그 내부 Step에 있는 기능들을 자동화하여 관리 가능 Workflows를 실행 시키는 트리거는 Event 라고 부름 Event로는 push, pull request, fork 등 Github 내 다양한 동작들이 지정될 수 있음 .github/workflows에 저장돼 있는 yaml 파일이 바로 Workflows를 정의하는 파일임 name: Update README # workflows의 이름 on: # Event 발생 시 실행 정보 push: branches: [ "main" ] pull_request: branches: [ "main" ] Jobs Workflows에서 독립적으로 수행할 작업들을 Job이라고 부름 각 Job은 각각 다른 서버에서 독립적으로 실행되..
2023.03.12
no image
[Git] 한글 깨짐 해결하기
문제 상황 깃 작업 중에서 diff나 status로 로그를 찍어볼 때, 한글이 깨져서 나오는 경우가 있다. git diff --name-only auto-readme..origin/auto-readme
2023.03.09
no image
[Python] 프로그래머스 큰 수 만들기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 DFS를 활용한 풀이 : 시간 초과 문자 조합을 구성하기 위해서 DFS를 활용했다. 조합 구성 시, 순서를 유지하기 위해서 start 변수를 도입해 탐색 범위를 제한했다. 시간 초과가 발생했다. 풀이의 시간 복잡도는 ${n \choose k}$ 인데, n과 k가 최대 100만 까지 가능하기 때문이다. 더보기 DFS 함수의 시간 복잡도 T(dfs) = (n-k) choose (k-1) + (n-k+1) choose (k-1) + ... + n choose (k-1) = (n+1) choos..
2023.03.09
no image
[Python] 프로그래머스 쿼드압축 후 개수 세기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 쿼드 압축은 매 시행 마다 압축이 가능한 지 확인하고, 불가능하다면 4개의 동일한 부분을 나눠서 다시 확인한다. 압축 시도 → 분할 후 압축 재 시도의 과정이 반복되기 때문에 재귀 함수를 활용할 수 있다. 압축의 형태를 비교하는 과정에서, 2차원 리스트 슬라이싱이 필요했다. 리스트를 2차원 슬라이싱 하려면, 다음과 같이 리스트 컴프리헨션을 사용하면된다. [row[j : j + n // 2] for row in arr[i : i + n // 2]] # (0의 개수, 1의 개수) # 재귀? ..
2023.03.07
no image
[Python] 프로그래머스 소수 찾기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가능한 문자열을 구성하기 위한 방법으로는 순열, 백트래킹을 활용한 DFS가 있다. DFS 과정에서 각 종이(숫자)가 한 번만 활용돼야 하기 때문에 is_used 라는 변수를 활용했다. # 가능한 문자열 구성하기 def dfs(numbers, n_len, num): global cnt, is_used, num_uniq # 문자열 길이 최대일 경우 if n_len == len(numbers): return for i in range(len(numbers)): if not is_used[i]:..
2023.03.06