네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

'전체 글'에 해당되는 글 194건


반응형

 

 

1. 백준 10844번 쉬운 계단 수

2. 백준 1562번 계단 수

 

둘 다 동적 프로그래밍에 관한 내용이다. 

2번은 1번 문제에 하나의 조건만 추가되었다.

"0~9까지 모든 수를 한번 이상 사용해야 한다는 것이다." (길이가 N이면서 0에서 9가 모두 등장하는 계단 수가 총 몇 개?) 이 과정에서 비트 마스크가 사용된다.

 

 

1번 백준 10844번 쉬운 계단 수 문제

 

i번째 자리의 수를 결정하고

i+1번째 자리의 수를 결정하는 부분을 재귀 호출한다.

 

앞자리 수가 결정되었을 때,

가능한 현재 자리 수는 앞자리수 - 1, 앞자리수 + 1 두 가지이다.

현재 자리 수는 0부터 9 사이의 숫자여야 하기 때문에

앞자리 수가 0일 때는, 현재 가능한 수는 1(앞자리수+1)뿐이고

앞자리 수가 9일 때는, 현재 가능한 수는 8(앞자리수-1)뿐이다.

 

종료 조건은 남은 자릿수가 0일 때 1을 리턴한다. (개수)

static int 계단수(int 길이, int 앞자리) { 
  if (길이 <= 0) // 종료 조건
    return 1; 
    
  int 결과 = 0; 
  
  if (앞자리 - 1 >= 0) 
    결과 += 계단수(길이 - 1, 앞자리 - 1); 
    
  if (앞자리 + 1 <= 9) 
    결과 += 계단수(길이 - 1, 앞자리 + 1); 
    
  return 결과; 
} 

static int solution(int N) { 
  int 결과 = 0; 
  for (int i = 1; i <= 9; ++i) 
    결과 += 계단수(N - 1, i); 
  return 결과; 
}

이는 O(2^N)의 시간 복잡도가 발생하여 "동적 프로그래밍"으로 시간 효율성을 높여야 한다.

 

결과 배열[길이][앞자리]를 저장하는 배열을 만들었다.

static final int M = 1000000000; 
static long[][] 결과배열; // 동적프로그래밍을 사용하기 위한 저장소

static long 계단수(int 길이, int 앞자리) {
  if (길이 <= 0) 
    return 1; 
    
  if (결과배열[길이][앞자리] > 0) 
    return 결과배열[길이][앞자리]; 
    
  long 결과 = 0; 
  if (앞자리 - 1 >= 0) 
  	결과 = (결과 + 계단수(길이 - 1, 앞자리 - 1)) % M; 
  if (앞자리 + 1 <= 9) 
  결과 = (결과 + 계단수(길이 - 1, 앞자리 + 1)) % M; 
  
  return 결과배열[길이][앞자리] = 결과; 
} 

static long solution(int N) { 
  long 결과 = 0; 
  for (int i = 1; i <= 9; ++i) 
    결과 = (결과 + 계단수(N - 1, i)) % M; 
  return 결과; 
}

 

2번 1562번 계단 수

모든 수를 사용해야 한다고 한다. 

보통 방문 여부를 결정할 때는 boolean으로 visited 여부를 결정한다.

 

하지만 이 문제에선 "비트 마스크"로 visited 여부를 결정한다.

 

비트 마스크는

방문하지 않았으면 0, 방문하였으면 1로 나타낸다.

 

만약

숫자 3이 방문하였으면 0000001000으로 표현하고

이는 1<<3으로도 표현할 수도 있다.

 

즉, 숫자 n이 방문하였으면 1<<n 으로 나타낸다.

 

숫자 5와 7이 방문하였으면 0010100000

숫자 0, 2, 9가 방문하였으면 1000000101

식으로 표현한다.

 

어떤 숫자를 방문한 상태에서 n을 방문할 경우

(방문한 상태를 나타내는 비트) | (1<<n)로 나타낸다.

 

즉 숫자 0과 9를 방문한 상태 비트는 (1000000001)이고

이 상태에서 숫자 2를 방문할 경우 (1000000101)

1000000001 | (1<<2)로 표현할 수 있다.

 

0부터 9까지 모든 숫자를 방문했을 경우

1111111111로 표현할 수 있고 (1<<10)-1로도 표현한다.

(아래에선 111111111으로 표현하지 않고 (1<<10)-1 로 나타냈다.)

 

모든 숫자가 방문했는지 여부를 확인하는 배열을 하나 추가해준다.

위의 코드에서 2차원 배열이었던 결과 배열3차원으로 변경해준다.

 

종료 조건은 남은 자릿수가 없을 경우 (길이가 0보다 작을 경우) 모든 숫자를 사용했는지 비트 마스크로 비교하였다.

비트가 (1<<10)-1과 같을 경우 1을 리턴

다를 경우 모든 숫자를 사용하지 않았으므로 0을 리턴한다.

 

현재 자리 수를 결정하고 나서 

비트도 변경해준다.

bit = 비트 | 1<< (앞자리-1)

bit = 비트 | 1<< (앞자리+1)

 

	static final int M = 1000000000;
	static long[][][] 결과배열;

	static long 계단수(int 길이, int 앞자리, int 비트) {
		if (길이 <= 0)
			return 비트 == (1 << 10) - 1 ? 1 : 0;

		if (결과배열[길이][앞자리][비트] > 0)
			return 결과배열[길이][앞자리][비트];

		long 결과 = 0;
		if (앞자리 - 1 >= 0) {
			int bit = 비트 | (1 << (앞자리 - 1));
			결과 = (결과 + 계단수(길이 - 1, 앞자리 - 1, bit)) % M;
		}
		if (앞자리 + 1 <= 9) {
			int bit = 비트 | (1 << (앞자리 + 1));
			결과 = (결과 + 계단수(길이 - 1, 앞자리 + 1, bit)) % M;
		}

		return 결과배열[길이][앞자리][비트] = 결과;
	}

	static long solution(int N) {
		결과배열 = new long[N][10][1 << 10];

		long 결과 = 0;
		for (int i = 1; i <= 9; ++i) {
			결과 += (계단수(N - 1, i, 1 << i) % M);
			결과 %= M;
		}
		return 결과;
	}

 

 

전체 코드 확인 백준 1562번 문제

 

jeon9825/TIP

✒️오늘 연습한 것을 정리하는 저장소✒️ Today I Practice . Contribute to jeon9825/TIP development by creating an account on GitHub.

github.com

donaricano-btn

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

이전 버전 oracle jdk를 제거하고 최신 버전으로 설치하는 법

 

💻 OS: Window10

 

저번에 이전 버전 jdk를 제거하지 않고 최신 버전으로 설치하였다가 꽤나 문제가 생겼기 때문에

이번에 java8에서 java11로 버전 업그레이드하기 전에 삭제하는 법에 대해서 찾아보았습니다.

나중에도 찾지 않고 빠르게 삭제하고 싶어 글을 작성합니다.

 

1. [제어판]-[프로그램 및 기능]

2. [프로그램 제거 또는 변경]에 들어가서 Java로 시작하는 파일들을 삭제해줍니다.

저 캡처본을 보면 3개의 프로그램을 제거해주시면 됩니다. (보통 2개 깔려있음, Development Kit, Update)

3. www.java.com/ko/download/uninstalltool.jsp 접속해서 "약관에 동의하고 계속합니다." 버튼을 클릭하면

실행파일이 나오고 실행파일을 실행시켜주면 됩니다.

 

4. 저는 이미 제어판으로 삭제했기 때문에 No Java Versions Detected 문구가 뜨고,

저 페이지를 먼저 접속하셨으면 자동적으로 Java jdk이 삭제됩니다.

 

5. 다시 설치하실 때는 환경변수 설정을 꼭 변경해주는 것도 잊지 말 것

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

2020년 엔테크 채용전제형 인턴십 코딩 테스트

 

사실 몇 분 전에 합불 발표가 났는데 불합격 메일이 왔네요.

아무튼 후기를 써보자면

 

총 5문제(프로그래밍 4문제+SQL 1문제)로 9월 25일 오전 10시부터 12시까지 2시간 동안 진행되었습니다.

C, C++, Java, Javascript, Python3이 사용 가능했고 SQL문제를 풀이할 Database환경은 Mysql, Oracle로 제공되었습니다.

난이도는 ★★정도였다고 생각합니다. 일단 인턴십이라 그런지 문제가 어렵지 않았고 히든 테스트도 제공되었고 점수도 몇 점인지 알려주었단 점에서 어려웠던 코딩테스트는 아니었다고 생각합니다.

끝나면 점수를 알려주는데 이번 코테는 500점 만점에 400점 컷이라고 생각되고 350점도 합격하는 것을 보니 같이 제출했던 자소서를 많이 보는 것 같습니다.

저는 365점이었고, 1,2,5번은 100점씩, 그리고 3번 효율성에서 만점을 받지 못하고 65점을 받았습니다.

 

1번은 #배열 #구현

2번은 #DP

3번은 #투포인터알고리즘 으로 풀어야 하는 문제였고 완전 탐색을 했을 경우 정확성에서는 만점, 효율성에서는 점수를 받지 못합니다.

4번 #이진트리 

SQL문제였던 5번은 #JOIN #GROUP BY #ORDER BY 문제로 기본적인 sql문제였습니다.

 

개인적으로 SQL을 공부하신 분이라면 SQL문제는 그다지 어렵지 않은 난이도였다고 생각합니다.

전 투포인터 알고리즘을 몰라서 3번은 몰랐던 문제라고 생각하고 3번 효율성을 풀지 말고 4번을 푸는 게 나았을 거라고 살짝 후회하고 있습니다.

이번 기회로 투포인터 알고리즘에 대해서도 공부해야겠습니다.

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

2020년 라인 하반기 코딩 테스트 후기

 

9월 13일 오전 10시~오후 1시, 3시간 동안 진행되었고 총 6문제가 나왔습니다.

사용 가능한 언어는 C++, Java, JavaScript, Kotlin, Python3, Swift 6가지였습니다.

난이도는 ★★★★정도로 생각합니다. 문제 난이도 자체는 높은 편은 아니었지만(개인적으로 카카오보단 쉬웠다고 생각합니다.) 히든 케이스를 제공하지 않아서 어려웠다고 생각합니다.

 

저는 제출기준 3솔이었고 푼 문제는 4문제입니다.

합격선은 4-5솔이었던것 같고 5솔을 해도 떨어졌다는 사람이 있는 것 보면 히든 케이스를 주지 않았기 때문에 효율성이나 경계조건에서 많이 갈렸다고 생각합니다.

 

 

1번은 구현 문제였다고 생각합니다. #배열 

2번은 자료구조 문제였다고 생각합니다. #큐 #덱 

3번은 문자열 문제였습니다. #문자열 

4번은 #BFS #DFS #재귀 

 

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

2020년 카카오 하반기 코딩 테스트 후기

 

 

카카오 코테 후기입니다.

첫 취준에 대외활동도 한 적이 없어서 코딩 테스트를 본 적이 없었는데 이번 카카오 코딩 테스트로 코테 입문을 시작했습니다.

사실 쓸까 말까 고민했었는데 기록용으로 남겨두려고 합니다.

혹시나 문제가 되면 댓글, 이메일 부탁드립니다.

 

 

총 7문제, 2시부터 7시까지 5시간 동안 진행되었습니다.

C++, Java, Javascript, Kotlin, Python2, Python3, Swift 중에서 선택할 수 있었습니다.

시험 난이도는 제 기준 ★★★★

코테 자체 난이도는 높았던 대신 나중에 문제가 공개된다는 점과 히든 케이스를 맞았는지 알 수 있어 점수를 바로 알 수 있다는 점이 좋았습니다.

아마 제가 푼 코드는 문제가 공유되고 올릴 수 있다면 올리겠습니다.

들어보니 4솔 정도가 1차 코테 합격선이었던 것 같고 어려웠다던 6번과 7번만 푼 사람도 1차 합격을 한 것을 보니 문제별로 점수가 다른 것 같았습니다.

코테는 기본적으로 난이도 순입니다.

 

 

1번은 String 문자열 문제였습니다. 정규식을 알면 쉽게 풀 수 있는 문제였습니다. #문자열 #정규식

2번은 조합문제였습니다. #조합 #정렬 Collections.sort() #Iterator
3번은 #비트마스크 구현문제로 기억합니다! 아마 비트마스크로 구현하지않으면 효율성에서 감점당합니다.

 

 

 

 

 

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !