문제

 

프로그래머스

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

programmers.co.kr

문제 요건

 

시키는 대로 하면 되는 문제이고 파이썬 문자열 연습하는데 좋은 문제인 것 같다.

 

 

풀이 (python)

def solution(new_id):
	#1단계
    new_id1 = new_id.lower()
    
    #2단계
    new_id2=''
    for x in new_id1:
        if x.isalpha() or x.isdigit() or x=='-' or x=='_' or x=='.':
            new_id2+=x
    
    #3단계
    while '..' in new_id2:
        new_id2 = new_id2.replace('..','.')
    
    #4단계
    new_id3=list(new_id2)
    if new_id3 and new_id3[0]=='.': del new_id3[0]
    if new_id3 and new_id3[-1]=='.':del new_id3[-1]
    
    new_id4 = ''.join(new_id3)
    
    #5단계
    if new_id4=='': return 'aaa'
    #6단계
    if len(new_id4)>=16: new_id4 = new_id4[:15]
    if new_id4[-1]=='.': new_id4 = new_id4[:14]
    #7단계
    if len(new_id4)<3:
        while len(new_id4)!=3:
            new_id4+=new_id4[-1]
            
    return new_id4

 

문자열 함수들과 리스트변환, 슬라이스를 사용해 풀이했다.

 

반응형

JAVA의 메모리 영역 <메소드/스택/힙>

  • 메소드 : 바이트 코드, 전역변수, static변수
  • 스택 : 매개변수, 지역변수 (사용 종료 시 바로 소멸, 컴파일 시 메모리 할당)
  • 힙 : new로 생성된 객체 (호출 끝나도 사라지지 않음, 프로그램 실행 시 동적할당) 

자바 프로그램 실행과정

1) JVM : OS로부터 프로그램이 필요로 하는 메모리 할당받음
2) javac (자바 컴파일러)가 소스코드(.java)를 읽어 바이트코드(.class)로 변환시킴 (컴파일)
3) 클래스로더 : class 파일들 JVM으로 로딩
4) 실행엔진 : 로딩된 class 파일들 해석 (class 실행)
5) 해석된 바이트코드 > 런타임 데이터 영역에 배치 (실질적 수행)

위 과정 중에 JVM은 GC작업 수행 (스레드 동기화 등)

 

 

자바 프로그램 실행과정과 JVM 구성

JVM (자바 가상 머신)

JAVA가 OS에 구애받지 않고 재사용 가능하게 함 (중개자 역할 : JAVA - JVM - OS )

자바 애플리케이션을 클래스 로더로 읽어 자바 API와 함께 실행 (스택기반 가상머신)

역할 : 메모리관리, 가비지 컬렉션

 

JVM 구성

1) 클래스로더 : JVM으로 클래스파일 로드, 링크를 통해 배치, 런타임 시 동적으로 클래스 로드, 컴파일러 역할


2) 실행엔진 : 클래스로더가 런타임 영역에 배치한 바이트코드를 실행 가능한 형태로 변경, 실행

  • 인터프리터 : 한 줄씩 수행 (느림)
  • JIT (just-in-time) : 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체 컴파일 > 네이티브 코드로 변경 > 네이티브 코드로 실행 (네이티브 코드 : 캐시 보관, 한 번 컴파일된 코드 빠른 수행)
  • 네이티브 코드 : 자주 수행되는 메소드를 JVM->실행엔진->JIT 컴파일

3) 가비지 컬렉터 : 가비지 컬렉션

 

4) 런타임데이터영역 : JVM의 메모리영역. 자바 애플리케이션을 실행할 때 사용하는 데이터들을 적재하는 영역

  • 메소드 영역 : 모든 쓰레드가 공유하는 영역 (클래스, 인터페이스, 메소드, 필드, static 변수 등 바이트코드 보관)
  • 힙 영역 : 모든 쓰레드가 공유하는 영역 (new로 생성된 객체/배열. GC가 참조되지 않는 메모리를 제거하는 영역)
  • 스택 영역 : 메소드 호출 시마다 생성되는 영역 (메소드 내 매개변수, 지역변수 등을 임시로 저장. 메소드 끝날때 삭제)
  • PC 레지스터 : 쓰레드 시작될 때마다 각각 생성 (쓰레드가 어떤 명령을 실행할지 기록, 수행중인 JVM 명령의 주소를 가짐)
  • 네이티브 메소드 스택 : 자바 외 언어로 작성된 코드를 위한 영역

 

 

가비지 컬렉션 (GC)

가비지 정리 프로그램 (가비지 : 정리되지 않은 메모리, 유효하지 않은 메모리주소)

참조되지 않은 객체 해제, 가용 공간 만듦 > heap 메모리 재활용을 위해 

자동 메모리 정리로 개발자의 개발 속도 향상

 

*Mark : 스택의 모든 변수를 스캔, 각각 어떤 오브젝트를 레퍼런스 하고있는지 찾는 과정

*Sweep : Mark되지 않은 모든 오브젝트들을 heap에서 제거

 

문제점 : 메모리를 되찾을 시점을 결정하기 위한 오버헤드 발생 가능

 

 

JVM, JRE, JDK 구성도

 

JRE (Java Runtime Environment) : 자바 실행환경

JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리, 기타 파일들을 가지고 있음 

JVM + 자바 클래스 라이브러리 + 자바 명령(command) + 기타인프라를 포함한 디렉토리 (패키지)

  • bin/ : Java 실행 프로그램, JVM 시작하는 java (javaw,,), keytool, policytool 등
  • conf/ : 사용자가 편집가능한 파일 
  • lib/ : supporting 파일, .jar 구성파일, 속성, 글꼴, 인증서, .class 포함 모듈
  • 네이티브 바이너리 코드 지원 : .dill (Window), dylib (Mac), .so (Linux) 

 

JDK (Java Development Kit) : JRE+개발도구들 (javac, jdb, java, etc...)

Java용 SDK (Software Development Kit) => 프로그램 생성, 컴파일 가능

JRE의 상위 집합 디렉터리 세트 

  • bin/ : 개발도구로 확대 - javac (.jar, javadoc, jshell)
  • jmods/ 추가 

일반적으로 Java 프로그램 실행 = JRE만 있으면 됨. 

Java 프로그래밍 = JDK 설치 필요

 

애플리케이션 서버 = JSP 를 Java Servlet으로 변환 >> JDK를 사용해서 Servlet 컴파일 해야함

>>> JDK 설치 필요

 


Runtime Data Area

프로그램 수행을 위해 OS에서 할당받은 메모리 공간

Runtime Data Area

구성

1) PC : 프로그램 카운터 레지스터, 스레드 시작 될 때 생성됨. (1스레드 1PC) 현재 수행중인 JVM 명령 주소 가짐

2) JVM stack : 프로그램 실행 중 소멸되는 특성의 데이터 임시저장, 삭제 (임시 할당, 변수, 임시데이터, 스레드, 메소드 등)

3) Native Method stack : 실제 실행가능한 기계어 프로그램 실행 영역, JAVA 외의 언어로 작성된 코드를 바이트코드로 전환, 저장

4) Method Area (=Class area = Static area) : 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장

    (Runtime Constant Pool : 상수 자료형 저장, 참조/ 중복 방지)

5) Heap : new연산으로 생성된 객체, 배열을 저장하는 가상 메모리 공간


*오버로딩과 오버라이딩

  • 오버로딩 : 메소드의 이름은 같고, 매개변수를 다르게 함으로써 여러 메소드를 만드는 것
  • 오버라이딩 : 부모클래스로부터 상속받은 메소드를 재정의하는 것. 자식 객체에서 오버라이딩한 메소드는 호출시 오버라이딩한 메소드가 우선시 되어 호출됨 (동일한 리턴타입, 메소드 이름, 매개변수를 가져야함)

*추상클래스와 인터페이스

  • 추상클래스 : 클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우. extends를 통해 기능을 이용하고 확장하도록 하는 클래스
  • 인터페이스 : 모든 메소드가 추상 메소드인 경우 (여러 implements가 가능해 다중 상속 구현 가능) 뼈대만 있으며, 구현하는 모든 클래스에 대해 강제적으로 메소드를 구현하도록 만듬

*메모리, 성능 개선 방법

  • 인스턴스 변수에 접근할 일이 없으면, static 메소드를 선언하여 호출
  • 모든 객체가 서로 공유할 수 있기 때문에 메모리가 절약되고 연속적으로 그 값의 흐름을 이어갈 수 있는 장점이 존재

*클래스와 구조체의 차이

  • 구조체 : 여러 자료형의 변수들을 하나의 구조로 묶을 수 있는 자료구조.
  • 클래스 : 변수뿐만 아니라, 메소드도 포함시킬 수 있음
  • 구조체도 함수 포인터를 이용하면 클래스처럼 만들어 낼 수도 있다.

*스레드 생성, 장단점

  • 생성 : Runnable(인터페이스)로 선언되어 있는 클래스 or Thread 클래스를 상속받아 run() 메소드를 구현
  • 장점 : 빠른 프로세스 생성, 메모리를 적게 사용 가능, 정보 공유가 쉬움
  • 단점 : 데드락에 빠질 위험이 존재

*벡터와 배열

  • 벡터 : 동기식. 한 스레드가 벡터 작업 중이면 다른 스레드가 벡터 보유 불가능
  • 배열리스트 : 비동기식. 여러 스레드가 배열리스트에서 동시 작업이 가능

Reference

 

NAVER 기술 면접 리뷰

NAVER 기술 면접 질문과 답변을 정리합니다.

martianlee.github.io

 

 

gyoogle/tech-interview-for-developer

👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com

 

 

#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?

#JVM이란? JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다 (가상머신이란 프로그램의 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.) JV

asfirstalways.tistory.com

 

 

[ Java ] JDK, JRE 차이점(JDK란? JRE란?)

JDK와 JRE의 차이? JRE란? JRE( Java Runtime Environment )는 자바 가상 머신( Java Virtual Machine ), 자바 클래스 라이브러리( Java class library ), 자바 명령( Java command ) 및 기타 인프라를 포함한 컴..

developerntraveler.tistory.com

 

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

JVM 메모리 구조란? (JAVA)

안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상

steady-coding.tistory.com

 

반응형

SOLID 란 ?

- 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 적용할 수 있는 원리이다.

- 5가지 원칙들의 약어 첫 문자를 따서 SOLID라 칭한다.

 

 

SOLID 구성 5원칙

1. SRP 단일 책임 원칙 (Single responsibility principle)
: 한 클래스는 하나의 책임만 가져야 한다.

- 클래스는 하나의 기능만 가지며 모든 서비스는 그 하나의 기능을 수행하는데 집중(책임)되어야 함
  어떤 변화에 의해 클래스를 변경하는 이유도 오직 하나이어야 함
  (가독성 향상, 유지보수 용이)
2. OCP 개방-폐쇄 원칙 (Open/closed principle)
: 소프트웨어 요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 

- 변경을 위한 비용은 줄이고 확장을 위한 비용은 극대화 해야함
- 변경이 발생하더라도 기존 구성은 수정이 일어나지 말아야함 = 기존 구성요소를 확장해서 재사용
3. LSP 리스코프 치환 원칙 (Liskov substitution principle)
: 서브타입은 언제나 기반 타입으로 교체할 수 있어야 함

- 서브클래스가 확장에 대한 인터페이스를 준수해야 함 (public ,인터페이스, 메소드의 예외 등)
4. ISP 인터페이스 분리 원칙 (Interface segregation principle)
: 하나의 범용 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다. (인터페이스의 단일 책임 강조)

- 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 함
1) 클래스 상속을 이용해 분리 : 인터페이스에 서비스가 제한될 수 있음
2) 객체 인터페이스 위임을 이용해 분리 : 책임을 다른 클래스/메소드에 맡김
5. DIP 의존관계 역전 원칙 (Dependency inversion principle)
: 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.

- 하위레벨 모듈이 상위레벨 모듈의 변경을 요구하는 관계를 끊는 것
- 둘의 관계를 직접 연결하는 게 아니라 추상레벨로 연결 = 상위 모듈의 확장성 보장 


- 예시 : 소켓프로그래밍 비동기 모델
클라이언트 스레드가  직접 send(), recv() 하지 않고 훅 메소드를 실행   
클라이언트 스레드의 잦은 응답확인을 제거, 클라이언트 스레드는 응답 확인할 시간에 다른 작업 가능해짐

 

 

+ 상속 시 주의할 점

 

is-a : 상속관계

일반적 개념-구체적 개념의 관계 (동물-사람, 동물-사자 등)

일반클래스를 구체화하는 상황에서 사용

하위 클래스가 상위 클래스에 종속 됨 (상위 수정 시 하위 미치는 영향 큼 -> IS-A 관계여야만 하는 이유)

 

has-a : 포함관계 (상속X)

다른 클래스의 기능(변수/메소드)을 사용.  (컴퓨터클래스 - CPU클래스, RAM클래스 등)

 


Reference

 

SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

객체지향 개발 5대 원리: SOLID

현재를 살아가는 우리들은 모두 일정한 원리/원칙 아래에서 생활하고 있습니다. 여기서의 원칙 이라 함은 좁은 의미로는 개개인의 사고방식이나 신념, 가치관 정도가 될 수가 있겠고, 넓게는 한

www.nextree.co.kr

 

[JAVA] IS-A 관계, HAS-A 관계

IS-A 관계, HAS-A 관계 안녕하세요? 장장스입니다. IS-A 관계, HAS-A 관계에 대해 알아보겠습니다. 객체지향 프로그래밍에서 우리는 상속을 사용합니다. 언제 상속을 사용해야 할까요? IS-A 관계 상속

zangzangs.tistory.com

 

반응형

문제

 

프로그래머스

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

programmers.co.kr

입출력 예시

 

 

풀이 (Python)

from collections import deque

def getThird(dq, n):
    a=n//3
    p=n%3
    if n==0: return dq
    else: 
        dq.appendleft(p)
        return getThird(dq,a)

def solution(n):
    answer = 0
    
    dq=deque()
    t = getThird(dq,n)
    
    for i in range(len(dq)):
        answer+=((3**i)*dq[i])

    return answer

 

위 소스로 풀긴 했지만 찾아보니 아래처럼 풀이할 수도 있다고 한다.

deque를 안쓰고 리스트로 푼담에 바로 return(answer, 3) 하면 좀더 간단할 것 같다.

 

int(answer, n) # n진법으로 구성된 str형의 answer를 10진수로 반환

 

레벨2 언제풀지..............

반응형

Node.js란?

  • html = 수동적, 과거엔 웹사이트 소유자만 수정가능했으며 일일히 타이핑으로 수정했음.
  • node.js = html 작성작업을 자동화하기 위해 등장한 도구 
  • js = 웹과 사용자의 상호작용 도움 > 웹이 웹애플리케이션이 될수있게 한 도구
  • node.js = js를 이용해 웹브라우저 자동생성하는 애플리케이션 생성가능

 

웹 브라우저에서 웹 어플리케이션을 실행할때 html 이용해 호출하는 것처럼

Node.js 런타임환경 (프로그램)에서 자바스크립트를 이용해 Node.js 어플리케이션을 호출할 수 있다.

 

 

Node.js 설치하기

공식사이트(nodejs.org)에서 설치가 가능하다. 윈도우, Mac, 리눅스 다양한 운영체제를 지원한다.

 

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

LTS 를 다운로드 후 실행시켜 쭉 next로 설치하면 된다.

 

정상적으로 설치가 완료되면 CMD 창에 명령어로 node.js 실행과 버전확인이 가능하다.

  • node -v : node.js 버전확인
  • node : node.js 실행 (cosole.log()로 자바스크립트 실행결과 확인가능)
  • Ctrl+c (두번) : node.js 종료 

 

 


Reference

Youtube /인프런 - 생활코딩 강의 : Egoing Lee - WEB2 Node.js 

 

생활코딩

일반인에게 프로그래밍을 알려주는 온라인/오프라인 활동 입니다. 채널 공개키 : MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbU/jgeYLWbmUB5pk/wlqMs+2qsOOPgN2ydxOsrWe8JJUXzj5ovsUmjfBSwLjajT6SyO00ulne3zja2PzEZC2wnJCgvZ6lr/ZLvA9yUqmrKRNa

www.youtube.com

 

 

[무료] WEB2 - Node.js - 인프런 | 강의

이 수업은 JavaScript를 이용해서 Node.js를 제어해 동적으로 HTML 코드를 생성하는 웹애플리케이션을 만드는 방법에 대한 수업입니다. , - 강의 소개 | 인프런...

www.inflearn.com

반응형

문제

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

로또 번호로 가능한 최고 등수와 최저 등수를 리턴하는 문제이다.

로또 숫자는 1~45인데, 0인 경우는 알아볼 수 없는 숫자이다.

그래서 0의 개수에 따라 가능한 최고 등수가 바뀐다.

 

 

14번 케이스만 계속 틀려서 시간이 좀 걸렸는데 0의 개수도 없고 6개 다 틀린경우를

생각하지 못했다ㅠ 어떤 문제든 제약사항을 잘 고려해야 하는 것 같다.

 

 

풀이 (Python)

def solution(lottos, win_nums):
    #0 없앰
    notzero = set(lottos) 
    if 0 in notzero: notzero.remove(0) #0이 한개일 경우 
    
    if len(notzero)==0: return [1,6]

    zero_cnt = len(lottos) - len(notzero) #0 개수
    lotto_len = len(set(win_nums)-set(notzero)) #1등과 차이 개수 
    
    if lotto_len==0: return [1,1]
    elif zero_cnt==0 and lotto_len==6: return [6,6]
    else:
        if zero_cnt==0: return [lotto_len+1,lotto_len+1]
        else: return [lotto_len-zero_cnt+1,lotto_len+1]

 

파이썬 쏠!

 

반응형

 

SQL 성능개선 팁을 정리해보려 한다.

 

1. 인덱스 사용 시 주의사항 

- 조회(SELECT, WHERE)시에는 속도에 도움을 주지만 삽입(INSERT), 갱신(UPDATE)시에는 오히려 느려진다.

- 데이터가 적은 경우에는 사용하지 않는 게 좋다.

- 조회쿼리 성능개선을 위해 WHERE 절에 자주 사용되는 컬럼은 인덱스로 지정하기도 하는데 주의할 점이 있다.

- 구간 별 선택이 많은 컬럼은 클러스터 인덱스 추천 

 

특정 컬럼을 인덱스로 지정해도 사용할 수 없는 경우

  • LIKE '%'을 변수 앞에서 사용 > 무조건 FULL SCAN
  • IS NULL, IS NOT NULL 사용
  • 여러컬럼에 OR 사용
  • 부정비교에 사용 (예시 : NOT, <>, !=. NOT EXISTS )
  • 컬럼을 변형한 경우 (예시 : substr() )

 

2. 데이터 추출 시 주의사항

  • select에 필요한 컬럼만 지정 (select * 지양, 사용하지 않는 데이터 호출에도 부하가 발생할 수 있음)
  • where 절 조건문 작성 시, 가장 많은 데이터를 걸를 수 있는 컬럼을 우선적으로 작성
  • where 절 조건문 작성 시, 왼쪽은 되도록 변형되지 않은 순수 컬럼을 사용
  • 정렬 (order by)하지 않고 limit, top을 사용중인지 확인
  • 백만건이 넘어갈 시에는 파티셔닝을 고려
  • IN < EXISTS < INNER JOIN 순으로 가독성은 떨어지지만 성능이 좋음
  • 서브쿼리보다 JOIN을 지향 (상황에 따라 서브쿼리로 추출 후 조인 시 성능이 개선될 수도 있음)
  • COUNT()보다 EXISTS() 지향
    • COUNT()는 모든 레코드 중 관련 데이터를 필터링 한 후 함수를 수행
    • EXISTS()는 필터링 시 하나라도 레코드가 있을 때 반환  

 

 

 

추후 개선 알게되는 팁은 계속해서 추가할 예정입니닷,,


Reference

 

SQL Outer join 2 tables

I have two tables, comp_product and comp_product_marchand. The comp_product contains product information (description, name, etc..) The comp_product_marchand contains different prices (product

stackoverflow.com

 

 

SQL IN EXISTS JOIN 성능 비교 및 용도 정리글

각종 SQL에서 데이터 조회 시 IN EXIST INNER JOIN을 사용해 조회를 하게 되는데 여기서 IN, EXIST, INNER JOIN 중 뭘 써야 성능이 가장 좋은가 싶을거다 일단 정답은 몇백~몇천건을 조회하는 정도라면 의미

wakestand.tistory.com

 

[SQL] WHERE 기능, 성능향상 팁 *****

WHERE 절은 "테이블내의 모든 행을 검색하는 대신 검색 조건을 지정하여 사용자가 원하는 행들만 검색하는 기능"이다. WHERE 조건식은 단일 조건식과 복수 조건식이 있다. 연산자 의 미  =   같다  

link2me.tistory.com

 

 

[MSSQL] 성능 향상을 위한 팁

1. 생성시 주의사항 (1) DB 생성시 주의사항 ① DB 명칭은 해당 서비스를 파악할 수 있도록 명명한다. ...

blog.naver.com

 

반응형

'CS Interview > DB' 카테고리의 다른 글

DB 용어 및 개념 (2)-INDEX  (0) 2022.02.02
DB 용어 및 개념 (1)-DBMS, 무결성, 정규화, UML, view  (0) 2021.05.07

문제

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

입력 : n=수빈시작위치, k=동생위치(도착지점)

출력 : 수빈이가 걷거나 순간이동한 횟수 

 

예를들어 n=5, k=17 일떼, 수빈이가 5-10-9-18-17 순으로 가면 4번 만에 동생을 찾을 수 있다.

 

 

풀이

from collections import deque

MAX=10**5
dp=[0]*(MAX+1)
dq = deque()

n,k = map(int,input().split())
dq.append(n)
while dq:
    c=dq.popleft() #current
    if c==k:
        print(dp[k])
        break

    for nc in (c-1,c+1,c*2):
        if 0<=nc<=MAX and dp[nc]==0:
            dp[nc]=dp[c]+1
            dq.append(nc)

 

큐에 현재 위치 c와 다음 위치 c-1, c+1, c*2를 넣으며 횟수를 추가했다.

 

 

 

반응형

문제

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

 

 

입력 : n = 동전의 가치, k = 만들어야 할 가치

출력 : 사용한 동전의 개수

 

동전 종류는 k가치보다 큰 경우가 있을 수 있다.

입력받은 동전 종류는 오름차순 정렬이 된채로 입력이 되기 때문에

동전배열 맨 뒤에서부터 가치 계산을 하도록 접근했다.

 

 

풀이

n,k = map(int,input().split())
coin=[0]*n

for i in range(n):
    coin[i]=int(input())

cnt=tmp=0
for i in range(n-1,-1,-1):
    if k>=coin[i] :
        tmp=k//coin[i]
        k-=(tmp*coin[i])
        if tmp==0: cnt+=1
        else: cnt+=tmp

print(cnt)

 

처음엔 그냥 for문 안에 while을 넣었다가 시간초과가 났고

그 다음은 세부조건을 고려하지 않아 오류가 났다... 따흑

 

 

반응형

문제

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

 

nums 배열에 n개의 폰켓몬 수가 주어지고 최대 n/2마리 폰켓몬을 선택해야하는데 

중복없이 선택해야하는 문제이다.

 

풀이

def solution(nums):
    
    po=len(nums)//2
    snums = set(nums)

    if len(snums)<po:
        return len(snums)
    else:
        return po

 

파이썬의 set으로 nums에서 중복제거 후 n/2와 비교하여 선택할 수 있는 수를 return했다.

반응형

+ Recent posts