문제

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/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)

개요

심볼릭 링크에 대해서는 '파이썬 2개 버전 동시 사용하기' 글에서 이미 다루었다. 해당 글을 작성하고 최근까지도 나는 이 경우에만 심볼릭 링크를 사용하는 줄 알았다. 그러나 자사 제품의 로컬 실행을 위해 빌드하며 다른 메시지의 오류 2개를 심볼릭 링크로 해결해보며, 이것이 다양한 경우에서 사용될 수 있음을 깨달았다. 요약하자면 심볼릭 링크는 파일 A와 B가 멀리 떨어진 위치에 있을 때, A 파일을 실행하며 종속적으로 B 파일 실행이 필요한 경우 A에 B 파일의 위치를 알려주는 느낌이다.

 


 

Windows에서의 Symbolic Link

Symbolic Link 란?
  • 링크를 연결하여 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크이다.
  • 윈도우의 바로가기와 비슷한 개념이다.
  • 특정 폴더에 링크를 걸어 NAS, library 원본 파일을 사용하기 위해 심볼릭 링크를 사용한다.
  • 소프트 링크라고도 한다.
  • 리눅스 용어이지만 자사에서는 윈도우로 개발하는 바, 이하에서는 윈도우 명령어와 오류로 설명한다. 

 

명령어 및 결과

1. 링크 생성

  • 파일에 대한 링크 생성 : mklink 생성파일 실행파일 
mklink C:\Workspace\Rogic\scratch-blocks\python.exe C:\Python27\python.exe
// 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 창을 관리자 권한으로 열어야한다! 관리자 권한으로 열지 않으면 명령어가 권한이 없어 작동하지 않는다!

 


 

참고 자료

https://bluedrim.tistory.com/entry/%EC%9C%88%EB%8F%847-%EC%8B%AC%EB%B3%BC%EB%A6%AD-%EB%A7%81%ED%81%AC-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B0%8F-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0

 

윈도7 심볼릭 링크 만들기 및 삭제하기

윈도7 심볼릭 링크 만들기 및 삭제하는 방법, 심볼릭 링크라고도 하고 소프트 링크라고도 함 먼저 command 창을 관리자 권한으로 실행시키는 것이 필요. 보조프로그램에서 "명령 프롬프트"를 마우

bluedrim.tistory.com

231031 7번째 완료

 

'Backend > Enviornment setting | Git' 카테고리의 다른 글

[Setting] Visual Studio Code 위주 유용한 단축키 + 확장 앱  (0) 2023.11.30
[Git] commit과 push  (0) 2023.11.30
[Git] git stash  (0) 2023.11.29

개요

파이썬 + 이것이 코딩테스트다(파이썬편)으로 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