def solution(n, lost, reserve):
answer = 0 #1번
new_reserve = set(reserve)-set(lost) #2번
new_lost = set(lost)-set(reserve)
for i in new_reserve: #2번
if i-1 in new_lost:
new_lost.remove(i-1) #3번
elif i+1 in new_lost:
new_lost.remove(i+1)
answer = n - len(new_lost) #1번
return answer
배운 점
0. 변수 설정
문풀 전: 내가 정한 규칙에 따라 입력값을 항상 재설정
문제점: 레퍼런스를 보게 될 경우, 변수 달라 항상 고생. 또한 대문자로 변수 썼으므로 고속으로 코딩하기에 불편
결론: 프로그래머스처럼 입력값 변수가 정해져 있는 경우 그냥 그거 쓰자
1. 리턴 값 초기화의 중요성
문풀 전: 리턴 값을 초기화 하지 않고, 바로 answer = n - len(new_lost) 식으로 값 할당
문제점: 코드를 맞게 작성하였는데도, 심지어 정답 코드들과 초기화 부분을 제외하고 코드가 동일한데도 계속 일부 3-5개 케이스를 통과하지 못함
원인: 이전에 문풀 했을 때 할당되었던 answer이 누적될 수 있음
결론: 항상 리턴 값은 초기화하고 시작하는 것을 습관화하자
2. 배열 or 집합 값의 직접 탐색
직접 탐색
문풀 전: 항상 for i in range(len(lost)) 식으로 탐색하고 싶은 배열의 길이의 범위를 지정하여 탐색
문제점: lost[i] 식으로 한 번 더 그 값을 지정해주어야 하는 번거로움 발생. 또한 이번 문제처럼 lost 도 탐색해야 하는 경우 무조건 이중 for문 사용하여 배열 값에 접근해야함
결론: 배열 값에 바로 접근하자. for i in lost
집합 값 탐색
문풀 전: 집합을 생성하고 집합을 탐색하는 것을 몰랐음
문제점: 이번 문제처럼 공통 원소를 제거하는 set(lost) - set(reserve) 같은 코드를 사용할 수 없음
결론: 배열, 집합 양자 왔다 갔다 하자
배열을 집합으로 만들기: set(lost) ( 결과: {2, 4} )
차집합 (= 공통 원소 제거): set(lost) - set(reserve)
집합도 len(lost), lost.remove(i) 처럼 배열에서 사용하는 메서드 사용 가능
3. remove() 메서드
문풀 전: 배열에서 원소 제거할 때 무조건 pop() 메서드 사용
문제점: 메서드 특성 상 스택큐 문제에서 뒤의 원소부터 제거한다는 느낌이 강함 (실제 특정 값만 제거할 수 있는데도). 따라서 부담스러움
결론
remove() 메서드를 사용하자.
다만 배열 or 집합 순회하면서 remove() 메서드를 사용할 경우, 순회하는 대상이 달라져 원하는 결과가 나오지 않을 가능성 있음 -> lost[:] 식으로 리스트의 전체를 슬라이싱하는 기법 사용하자. 이를 통해 리스트의 모든 요소를 복사하여 새로운 리스트를 생성하고, 이를 순회하면서 각 요소에 접근 가능
M = 1000 - int(input()) // input 받아 한 번에 M 정의
coins = [500,100,50,10,5,1] // 반복되는 로직의 대상을 coins 배열에 넣기
ans = 0
for coin in coins:
ans += n//coin
M %= coin // M 업데이트
print(ans)
while True: # 무한 루프 돌겠다
try:
A, B, C = map(int, input().split())
jumpA = B - A - 1
jumpB = C - B - 1
ans = max(jumpA, jumpB)
if ans == 0:
print(0)
else:
print(ans)
except EOFError: # input 공백일 때 읽어들이려고 할 때 발생하는 에러, break 처리
break
T = int(input())
C = []
for i in range(T):
C = list(map(int, input().split()))
# 값 초기화
Q = D = N = P = 0
# 리스트의 첫 번째 값만 활용하고 바로 답 출력
Q = C[0] // 25
D = C[0] % 25 // 10
N = (C[0] % 25) % 10 // 5
P = ((C[0] % 25) % 10) % 5 // 1
print(Q, D, N, P)
심볼릭 링크에 대해서는 '파이썬 2개 버전 동시 사용하기' 글에서 이미 다루었다. 해당 글을 작성하고 최근까지도 나는 이 경우에만 심볼릭 링크를 사용하는 줄 알았다. 그러나 자사 제품의 로컬 실행을 위해 빌드하며 다른 메시지의 오류 2개를 심볼릭 링크로 해결해보며, 이것이 다양한 경우에서 사용될 수 있음을 깨달았다. 요약하자면 심볼릭 링크는 파일 A와 B가 멀리 떨어진 위치에 있을 때, A 파일을 실행하며 종속적으로 B 파일 실행이 필요한 경우 A에 B 파일의 위치를 알려주는 느낌이다.
Windows에서의 Symbolic Link
Symbolic Link 란?
링크를 연결하여 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크이다.
윈도우의 바로가기와 비슷한 개념이다.
특정 폴더에 링크를 걸어 NAS, library 원본 파일을 사용하기 위해 심볼릭 링크를 사용한다.
소프트 링크라고도 한다.
리눅스 용어이지만 자사에서는 윈도우로 개발하는 바, 이하에서는 윈도우 명령어와 오류로 설명한다.
// cmd 결과
C:\Workspace\Rogic\scratch-blocks\python.exe <<===>> C:\Python27\python.exe에 대한 기호화된 링크를 만들었습니다.
// 파일탐색기 결과 심볼릭링크 유형으로 실행파일.exe가 추가됨
디렉토리에 대한 링크 생성 : mklink 생성디렉토리 실행디렉토리 -> 파일에서 디렉토리로만 변경되고, 로직 및 결과는 동일하게 확인 가능하다.
2. 링크 삭제
파일에 대한 링크 삭제
cmd 창을 이용 : (생성파일이 있는 디렉토리로 이동하여) del 생성파일
파일탐색기 이용 : 위 사진에 있는 심볼릭 링크 파일 삭제
디렉토리에 대한 링크 삭제
cmd 창을 이용 : (생성 디렉토리로 이동하여) rmdir 생성디렉토리
파일탐색기 이용 : 상동
Trouble Shooting
오류 내용
scratch-blocks에서 npm run prepublish 실행 시 아래 오류 발생
// 파이썬에서 site-packages를 찾을 수 없는 오류
ImportError: No module named site
// 자바가 path에 없다는 오류
Could not find "java" in your PATH.
Using remote compiler: closure-compiler.appspot.com ...
Error: Closure not found.
오류 원인(내 생각)
파이썬의 경우 2개 버전을 함께 사용하므로 설치한 후부터 지금까지 경로가 꼬였을 수 있겠다고 생각했다. 따라서 완전 삭제 후 재설치하고 오류를 해결하기로 했다.
그러나 재설치해도 위 오류는 동일하게 발생했다. 따라서 scratch-blocks에서 실행되는 파이썬(ver 2.7.18)에게 site-packages를 찾을 수 있도록 알려주어야 겠다고 생각했다.
자바의 경우에도 고급 시스템 설정-환경변수-Path에 올바른 경로를 추가해도 위와 같은 오류가 발생했다. 따라서 scratch-blocks에서 실행되는 자바가 어디 있는지 알려주어야 겠다고 생각했다.
즉 위의 두 문제 모두 메시지는 다르지만 '알려준다' 라는 요점이 같고, 이것이 곧 심볼릭 링크라고 생각했다!
해결
// 파이썬은 두 버전의 명령어를 구분하여 심볼릭 링크 만들기
mklink C:\Workspace\Rogic\scratch-blocks\python.exe C:\Python27\python.exe // 빌드 명령어 : python
C:\Workspace\Rogic\scratch-blocks\python.exe <<===>> C:\Python27\python.exe에 대한 기호화된 링크를 만들었습니다.
mklink C:\Workspace\Rogic\scratch-blocks\py.exe C:\Users\KHR\AppData\Local\Programs\Python\Python312\python.exe // ai 개발 명령어 : py
C:\Workspace\Rogic\scratch-blocks\py.exe <<===>> C:\Users\KHR\AppData\Local\Programs\Python\Python312\python.exe에 대한 기호화된 링크를 만들었습니다.
// 자바
mklink "C:\Workspace\Rogic\scratch-blocks\java.exe" "C:\Program Files (x86)\Java\jre-1.8\bin\java.exe"
C:\Workspace\Rogic\scratch-blocks\java.exe <<===>> C:\Program Files (x86)\Java\jre-1.8\bin\java.exe에 대한 기호화된 링크를 만들었습니다.
주의할 점
빌드하는 디렉토리 위치에서 심볼릭링크를 생성해야한다! 처음 cmd 창을 열었을 때 설정 되어있는 기본 디렉토리에서 링크 생성해봤자 소용 없다!
cmd 창을 관리자 권한으로 열어야한다! 관리자 권한으로 열지 않으면 명령어가 권한이 없어 작동하지 않는다!
파이썬 + 이것이 코딩테스트다(파이썬편)으로 PCCP(프로그래머스 코딩전문역량인증시험) 준비를 시작했다. 파이썬 기본 문법-입출력 부분을 공부하던 중 책처럼 입출력이 되지 않았다..! 분명히 이전 내용들은 vscode 기준으로 ctrl+alt+N을 누르면 실행되어 콘솔창에 결과가 출력되었는데 입출력 부분은 실행되기만 하고 결과는 출력되지 않았다. 고민의 시작...
1. launch.json 파일 생성 + Debug 모드로 실행 -> 입출력 텍스트 파일로 자동 조작
그냥 실행하면 아무 것도 출력되지 않는 문제부터 해결해야 겠다고 생각했다. 뭐라도 출력되어야 해결을 하든 말든 하지! 구글링 해보니 알고리즘 문제를 풀 때는 입출력이 필수이므로 단순 실행이 아닌 디버그 모드로 실행해야 하고, 이를 위해 launch.json 파일을 만들어야 하는 것을 알았다.
벌레 + 재생 표시 있는 버튼을 클릭하면 왼쪽 그림과 같은 창이 뜨고 자연스럽게 launch.json 파일을 만들 수 있다.
일단 launch.json 파일에 아무 것도 입력하지 않고, 다시 벌레 + 재생 표시 있는 버튼을 클릭해보면 디버그 모드로 실행할 수 있는 빨간색 동그라미 버튼이 뜬다. 누르면 디버그 모드로 실행된다.
꼬리 문제 1
- 콘솔창에서만 입출력을 받는다면 테스트를 해보기 위해 실행할 때마다 입력값을 넣어주어야 한다. 번거롭다! - 구글링 해보니 알고리즘 공부 + 코테 준비를 하는 다수가 입력을 input.txt로 받고, 출력을 output.txt로 자동으로 되도록 환경설정 해놓고 있었다. 아무래도 나도 하는게 효율적이겠군.. 다시 고민의 시작...
2.launch.json 파일 설정 -> redirection 되지 않는 문제
구글링 해보니 입출력을 txt 파일로 자동화하기 위한 최초 세팅은 launch.json 파일 설정이었다. 핵심 코드는 다음과 같다. input.txt에서 값을 넣고(<), output.txt로 값을 빼라는(>) 의미이다.
아 참고로 input.txt, output.txt 위치는 제일 바깥쪽(.vscode 와 동등한 준위)이다. 왼쪽 사진과 같은 위치에 넣으면 된다.
꼬리 문제 2
- 위와 같이 설정 후 디버그 모드로 실행하니 아래와 같은 오류(ParserError + RedirectionNotSupported)가 발생했다.
The '<' operator is reserved for future use.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RedirectionNotSupported
- 구글링 해보니 vscode는 기본으로 powershell로 디버그 모드를 실행하여 발생하는 문제였다. json 파일에 추가한 명령어는 cmd 명령어이기 때문이다. 즉, 디버그 모드를 cmd로 실행해야 문제가 해결된다. 그 설정을 어떻게 바꾸지.. 다시 고민의 시작...
3. vscode settings + settings.json 설정 변경 -> cmd가 시스템에서 인식되지 않는 문제
vscode settings 설정 변경
구글링 해보니 디버그 모드를 실행했을 때 powershell이 아닌 cmd로 연결되게 하려면 첫 번째로 vscode settings 설정을 변경해야했다.
설정으로 들어가 shell을 검색한 후, 터미널의 Default Profile: Windows를 Command Prompt (=cmd)로 변경한다.
settings.json 설정 변경
두 번째로 setting.json 설정을 변경한다. setting.json은 launch.json을 생성할 때 같이 만들어지는 .vscode 폴더 하위에 있는 파일이다. setting.json 파일에 아래와 같은 핵심 코드를 추가한다. 아래 코드는 나의 cmd 경로를 넣어야 하는데, cmd 경로는 Default Profile: Windows를 설정할 때 버튼에 마우스를 올리면 알 수 있다.
"${env:windir}\\System32\\cmd.exe"
꼬리 문제 3
- 위와 같이 설정을 변경한 후, 디버그 모드로 실행했더니 아래와 같은 오류가 발생했다.
"'cmd' is not recognized as an internal or external command"
- gpt에 물어보니, 'cmd' 콘솔 명령어를 실행하려고 시도했으나 'cmd'가 시스템에서 인식되지 않을 때 발생하는 문제라고 했다. cmd를 시스템에서 어떻게 인식되도록 해주지... 다시 고민의 시작...
3. 제어판 - 시스템 - 고급 시스템 설정 - 환경변수 설정 -> 모든 문제 해결!
gpt가 말하는 가장 기본적인 cmd 인식 방법은 시스템 환경 변수 설정이라고 했다. 제어판 - 시스템 - 고급 시스템 설정 - 환경변수 설정 - Path + 편집 클릭 - 새로 만들기 클릭한 후 아래 사진처럼 추가한다. 이 때 'C:\Windows\System32' 는 나의 cmd 기본 경로이다.
위처럼 설정한 후 디버그 모드로 실행했더니 input.txt에 입력한 데이터를 파이썬 코드에 입력 받아 실행하여 output.txt로 결과물을 자동으로 출력하는 것을 확인할 수 있었다. 231016 1번째