-- COALESCE() 함수 사용
SELECT PT_NAME, PT_NO, GEND_CD, AGE, COALESCE(TLNO, 'NONE') AS TLNO
FROM patient
WHERE AGE <=12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
-- CASE 문 사용
SELECT PT_NAME, PT_NO, GEND_CD, AGE,
CASE
WHEN TLNO IS NULL THEN 'NONE'
ELSE TLNO
END AS TLNO
FROM patient
WHERE AGE <=12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
배운 점
1. COALESCE() 함수
'합치다' 라는 의미
여러 개의 인수를 받아 첫 번째로 NULL이 아닌 인수를 반환 = 따라서 COALESCE(TLNO, 'NONE') 는 NULL 을 'NONE' 을 반환하고, 그 외는 반환
IS NULL 을 사용 & 조건문 일 때, 간단하게 표현할 수 있는 코드
2. CASE 문
문법
CASE
WHEN TLNO IS NULL THEN 'NONE'
ELSE TLNO
END AS TLNO
SELECT BOOK_ID, TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD')
FROM book
WHERE CATEGORY = '인문' AND TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021'
ORDER BY PUBLISHED_DATE ASC;
배운 점
1. 타입이 DATE 일 때 처리 방법
타입이 DATE = CHAR로 타입을 바꾸는 척 해야 처리 가능!
출력되는 형식 변경: TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD')
값 중 일부 글자가 특정 글자에 해당하는 값만 필터링: TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021'
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)
파이썬 + 이것이 코딩테스트다(파이썬편)으로 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번째