문제

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

정답 코드

첫 번째 제출
def solution(brown, yellow):
    answer = []
    yellow_wh = (brown-4)/2
    i=1
    while i <=  yellow_wh//2:
        if i * (yellow_wh-i) == yellow:
            answer.append((yellow_wh-i)+2)
            answer.append(i+2)
            break
        i=i+1
    return answer
  • yellow_wh: yellow의 가로 길이+세로 길이
    1. brown = (yellow 가로 길이+세로 길이) * 2 + 4 이므로 중간 합을 기준으로 식을 변형하면 위 코드처럼 됨
  • yellow_wh//2 까지 i 를 1씩 더하면서 반복문 돌리기: yellow = i + (yellow_wh-i) 조건에 맞는 쌍을 찾기 위함
  • yellow 가로>=세로 길이 이므로 애초에 큰 숫자(yellow_wh - i)를 먼저 append 하면 정답 나옴 

 

두 번째 제출 (다른 사람 풀이 참고)
def solution(brown, yellow):
    yellow_wh = (brown-4)/2
    i=1
    while i <=  yellow_wh//2:
        if i * (yellow_wh-i) == yellow:
            return [(yellow_wh-i)+2, i+2]
        i=i+1
  • answer 배열에 append 하지 않고, 바로 배열 형태로 return 하면 코드가 더욱 짧아짐
  •  

문제

https://school.programmers.co.kr/learn/courses/30/lessons/132201

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

정답 코드

-- 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
  • IF ~ ELSE 문을 SQL 식으로 직관적으로 표현한 것 
  • 꼭 IS NULL 이 아니더라도 다양한 상황에서 활용 가능 
  • WHERE 문이 아니라 SELECT 문에서 사용해야 함을 주의

'Algorithm & SQL > Oracle' 카테고리의 다른 글

[SELECT] 타입이 DATE 일 때 처리 방법 | 정렬  (0) 2024.01.09

문제

https://school.programmers.co.kr/learn/courses/30/lessons/144853

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

정답 코드

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'

 

2. 정렬

  • ORDER BY 까먹지 말자. 오름차순은 ASC, 내림차순은 DESC
    • ORDER (X), ARRANGE(X), SORT(X) 

'Algorithm & SQL > Oracle' 카테고리의 다른 글

[Select] COALESCE() 함수 | CASE 문  (1) 2024.01.09

문제 및 레퍼런스

https://school.programmers.co.kr/learn/courses/30/lessons/42862

https://namhandong.tistory.com/152

https://iambeginnerdeveloper.tistory.com/107


 

정답 코드

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 집합 값의 직접 탐색 

  1. 직접 탐색
    • 문풀 전: 항상 for i in range(len(lost)) 식으로 탐색하고 싶은 배열의 길이의 범위를 지정하여 탐색
      • 문제점: lost[i] 식으로 한 번 더 그 값을 지정해주어야 하는 번거로움 발생. 또한 이번 문제처럼 lost 도 탐색해야 하는 경우 무조건 이중 for문 사용하여 배열 값에 접근해야함 
    • 결론: 배열 값에 바로 접근하자. for i in lost
  2. 집합 값 탐색
    • 문풀 전: 집합을 생성하고 집합을 탐색하는 것을 몰랐음
      • 문제점: 이번 문제처럼 공통 원소를 제거하는 set(lost) - set(reserve) 같은 코드를 사용할 수 없음
    • 결론: 배열, 집합 양자 왔다 갔다 하자
      • 배열을 집합으로 만들기: set(lost) ( 결과: {2, 4} )
      • 차집합 (= 공통 원소 제거): set(lost) - set(reserve)
      • 집합도 len(lost), lost.remove(i) 처럼 배열에서 사용하는 메서드 사용 가능

 

3. remove() 메서드

  • 문풀 전: 배열에서 원소 제거할 때 무조건 pop() 메서드 사용
    • 문제점: 메서드 특성 상 스택큐 문제에서 뒤의 원소부터 제거한다는 느낌이 강함 (실제 특정 값만 제거할 수 있는데도). 따라서 부담스러움
  • 결론
    • remove() 메서드를 사용하자.
    • 다만 배열 or 집합 순회하면서 remove() 메서드를 사용할 경우, 순회하는 대상이 달라져 원하는 결과가 나오지 않을 가능성 있음 
      -> lost[:] 식으로 리스트의 전체를 슬라이싱하는 기법 사용하자. 이를 통해 리스트의 모든 요소를 복사하여 새로운 리스트를 생성하고, 이를 순회하면서 각 요소에 접근 가능 

참고 문제

 

2864번: 5와 6의 차이

첫째 줄에 두 정수 A와 B가 주어진다. (1 <= A,B <= 1,000,000)

www.acmicpc.net

 

A, B = map(str, input().split()) #str로 입력

mini = int(A.replace('6', '5')) + int(B.replace('6', '5')) #replace함수
maxi = int(A.replace('5', '6')) + int(B.replace('5', '6'))
print(mini, maxi)
  • 접근 오류 
    • ''.replace() 식으로 gpt한테 이상한 함수 사용법 받아와서 적용해보다가 틀림  
    • 문제의 핵심 로직 생각해낸 것은 맞았지만, replace() 함수를 사용해본 적 없어서 괜히 함수 써야할 것 같은 강박 관념에 틀림
    • input을 str로 받아놓고, A.replace(6, 5) 식으로 int로 함
    • print 할 때 굳이 print(mini, ' ', maxi) 안 하고 위처럼 해도 알아서 공백 넣어 숫자 2개 출력해줌 
    •  

참고 문제

 

5585번: 거스름돈

타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사

www.acmicpc.net

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로 값을 빼라는(>) 의미이다.

"args": ["<", "input.txt", ">", "output.txt" ]

위 코드를 launch.json 파일에 추가해준 최종 코드는 다음과 같다.

{ 
  "version": "0.2.0", 
  "configurations": [ 
  { 
    "name": "Python: Aktuelle Datei", 
    "type": "python", 
    "request": "launch", 
    "program": "${file}", 
    "console": "integratedTerminal", 
    "args": ["<", "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번째


참고 자료 출처

https://chat.openai.com/

https://velog.io/@hylee/vscode-input.txt-output.txt%EB%A1%9C-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98-%EC%95%88%EB%90%A0%EB%95%8C

 

vscode input.txt, output.txt로 리다이렉션 안될때

평소에 알고리즘 문제 풀때 입력을 복사 받아서 input.txt에 넣고 문제를 푸는데 갑자기 input.txt, output.txt로 리다이렉션 되던게 터미널로 나오는 문제를 만났습니다.vscode의 설정이나 launch.json 부분

velog.io

https://hbyun.tistory.com/28

 

[파이썬] vscode 에서 input.txt output.txt 로 입력값 결과값 넣기

이번에 자취를 시작하면서 노트북을 하나 사자라는 마음을 먹고 노트북을 하나 샀다 이전 PC의 환경처럼 세팅해주고자.. 다시 input과 output 도 자동으로 txt로 받아 실행해주는 세팅을 해주려 하는

hbyun.tistory.com

https://www.acmicpc.net/board/view/52485

 

글 읽기 - vs code에서 파일로 input 받는법 아시는 분 계신가요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net


https://seong6496.tistory.com/408

 

[Vscode] 파이썬(Python) input함수(키보드 입력) 활성화

vscode에서 파이썬 input 실행하는 방법입니다. 이걸 굳이 왜 쓰냐고 물으신다면 그냥 하면 안되기 때문입니다. vscode의 디버그 콘솔은 표준 입력을 지원하지 않아서 input() 함수가 포함된 파이썬 코

seong6496.tistory.com

https://gwpaeng.tistory.com/19

 

vscode에서 txt파일로 입출력 받기

하려는 것 input.txt에 입력값을 넣고 코드를 돌리면 output.txt에 결과값이 출력이 되는 것 ​ ​ launch.json 들어가는 법: 상단 debug에서 open configurations 들어가면 된다. 1. launch.json 바꾸기 + 그냥 terminal

gwpaeng.tistory.com


https://stackoverflow.com/questions/56480444/cant-run-python-programs-in-vs-code-cmd-is-not-recognized-as-an

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts