반응형

 

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

 

프로그래머스

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

programmers.co.kr

 

 

    int len = (int) (Math.log10(numbers[i])+1); //자릿수
    if(len >= 2){
        a = numbers[i]/(1*(10*(len-1))); //앞자리 숫자
    } else {
        a = numbers[i];
    }

앞자리 수만 비교해서 정렬 후 앞자리가 같으면 뒷자리 정렬하면 되겠지 생각했다.

처음엔 삽질 너무 많이 하다가 안되겠다 싶고 이걸 풀어도 시간초과나겠다 싶어서 결국 구글링.,,.,

 


🌌 전체 코드

import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {
        StringBuilder sb = new StringBuilder(); 
        String[] arr = new String[numbers.length];
        
        for(int i=0; i<numbers.length; i++){
            arr[i] = Integer.toString(numbers[i]);
        }
        
        Arrays.sort(arr, (String o1, String o2) -> (o2+o1).compareTo(o1+o2));
        
        if(arr[0].equals("0")){ return "0"; }
        
        for(String val : arr) sb.append(val);
        
        return sb.toString();
    }
}

1. String 배열로 요소들을 다 넣어준다.

 

(처음 시도엔 int로 처리하고 결과 값을 String으로 형변환해주려고 했는데 이건 너무 멀리가야했음)

StringBuilder sb = new StringBuilder(); 
String[] arr = new String[numbers.length];

for(int i=0; i<numbers.length; i++){
    arr[i] = Integer.toString(numbers[i]);
}

 

 

2. compareTo 사용하여 비교 

그냥 정렬하게 될 경우 6102가 반환되는데, 6102 < 6210 이므로

각각 더 한 값을 비교하여 큰 값을 리턴한다.

아래 코드 후 arr를 출력해보면 [6, 2 , 10]으로 출력된다.

 

compareTo!!

람다식을 활용하면 코드를 간결하게 작성할 수 있다. 니꼬 js강의 들을 때 람다식으로 많이 써서 그나마 익숙해졌다!

Arrays.sort(arr, (String o1, String o2) -> (o2+o1).compareTo(o1+o2));

이 부분만 알면 간단한 문제였다,,

 

Arrays.sort(arr, new Comparator<String>(){
    @Override
    public int compare(String a, String b){
        return (b + a).compareTo(a + b);
    }
});

이런 식으로도 쓸 수 있는데 완벽하게 Comparator를 잘 몰라서 더 알아봐야 할 것 같다.

그리고 Collections.sort(); 을 활용한 분도 계셨는데 이것도,, ( 리스트를 사용하심 List<Integer> list = new ArrayList<>();  )

 

 

3. 앞자리가 0이라면 0을 반환

 

0000이라면 0을 출력해야하니깐

if(arr[0].equals("0")){ return "0"; }

 

4. 출력 

for(String val : arr) sb.append(val);

return sb.toString();
반응형
반응형

 

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

 

프로그래머스

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

programmers.co.kr

 

테스트케이스 13번

: 배열 sort를 해주어야 한다.

 

이유

n=5 lost=[4,2] reserve=[3,5] 
return : 5
출력 값 : 4

 

> 정렬하지 않으면 3번이 4번한테 빌려줘서 2번은 못받기 때문

 

 

import java.util.*;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]){
                    reserve[j] = lost[i] = -1;
                    answer++;
                    break;
                } 
            }
        }
        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if((lost[i]+1) == reserve[j] || (lost[i]-1) == reserve[j]){
                    reserve[j] = -1;
                    answer++;
                    break;
                }
            }
        }
        
        return answer;
    }
}

(반복문이 많아서 리팩토링이 필요할 것 같다.)

for(int loster : lost){
            for(int j=0; j<reserve.length; j++){
                if(loster == reserve[j]+1 || loster == reserve[j]-1){
                    reserve[j] = -1;
                    answer++;
                    break;
                }
            }
        }

무릎을 탁 친 다른 분들의 풀이

이중포문을 없애줄 수 있다.

 

잃어버린 사람 -1 

잃어버렸지만  여분이 있는 사람 0 

빌려줄 수 있는 사람 1

public int solution(int n, int[] lost, int[] reserve) {
        int[] people = new int[n];
        
        for (int l : lost) 
            people[l-1]--;
        for (int r : reserve) 
            people[r-1]++;
 }

 

반응형
반응형

1. 프로그래밍 기본 문법 공부

 

2. 알고리즘 기본100제 (코드업:기초100제)

 

3. 백준 문제풀기(50문제씩)

 1. 그리디 알고리즘

 2. 탐색 알고리즘(완전탐색, BFS, DFS)

 3. 기초 동적 프로그래밍

ref. DP 공부법(이건 내가 찾아본거)

좋은 DP 문제들 추천 https://stonejjun.tistory.com/24 

DP 공부법 https://stonejjun.tistory.com/48

=========

(순서 상관 X)

4. 그래프 이론

5. 중급 고급 동적 프로그래밍 

6. 문자열 

 

4. 기출문제 풀기

 

반응형
반응형

DP를 처음 접하는 사람에게 추천하는 문제 중 하나.

 

https://www.acmicpc.net/problem/2748

 

2748번: 피보나치 수 2

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

 

1. 재귀함수

: 피보나치의 수는 재귀함수로도 풀 수 있는 문제지만,

지수적 함수를 현실에서 구할 수 없다고 판단 >> DP 활용!

 

동빈나 동적 프로그래밍 피보나치 수열 강좌 유튜브 캡처

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	 
	public static void main(String[] args) throws IOException  {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());	
		
		int result = fibo(N);
		
		System.out.println(result);
	}

	private static int fibo(int n) {
		
		if(n<=2) {
			return 1;
		} else {
			return fibo(n-2) + fibo(n-1);
		}
	}
}

 

2. DP

 

중복 호출이 일어나 비효율적이므로 어떠한 값을 계산한 적이 있다면 그 값을 활용

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	 
	public static void main(String[] args) throws IOException  {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());	
		
		int result = fibo(N);
		
		System.out.println(result);
	}

	private static int fibo(int n) {
		
		int[] dp = new int[91];
		
		if(n==2 || n==1) {
			return 1;
		} else if(dp[n]<=0){
			dp[n] = fibo(n-2) + fibo(n-1);	//값이 없다면 재귀함수 호출
		} 

		return dp[n];
	}
}

백준 결과 >> 메모리 초과

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	static long[] dp;
	
	public static void main(String[] args) throws IOException  {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());	
		
		dp = new long[N + 1];

		for(int i = 0; i < N + 1; i++) {
			dp[i] = -1;
		}
		
		dp[0] = 0;
		dp[1] = 1;
		System.out.println(fibo(N));
	}

	public static long fibo(int N) {
		
		if(dp[N]==-1){
			dp[N] = fibo(N-1) + fibo(N-2);	//값이 없다면 재귀함수 호출
		} 
		return dp[N];
	}
}

>> 백준 결과

2748 맞았습니다!! 14288 KB 128 MS

 

반응형
반응형

 

https://www.acmicpc.net/problem/2003 

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

 

1)  int Start Point, End Point 두 개의 포인터를 배열[0]에 두기

 

2)  S 포인터 ~ E 포인터 합 sum과 목표 숫자 M을 비교하기

 

3-1) 포인터를 증가시킬 때 

Start  포인터는 현재 위치의 원소를 sum에서 제거

End 포인터는 현재 위치의 원소를 sum에서 증가

 

# sum이 M보다 크다.

sum이 더 크니까 값을 줄여야 함. start 포인터를 1 증가시켜 현재 위치 원소 값을 sum에서 빼주기

 

# sum== M

cnt++;

같은 경우 후처리를 어떻게 해야하는지 블로그마다 달라 상당히 혼란스러웠는데, 다른 경우가 또 있나 찾아보아야 하기 때문에 end포인터를 1 증가시고 값을 sum에 더해줌

 

 

 sum이 M보다 작다

sum이 더 작으니까 값을 늘려주어야 함. end 포인터를 1 증가시켜 end 인덱스의 값을 sum에 더해준다.

 

 * E 포인터가 끝 점에 도달했다면, start  포인터를 1 증가

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
	 
	public static void main(String[] args) throws IOException  {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int N = Integer.parseInt(st.nextToken());	//수열 요소 개수
		int M = Integer.parseInt(st.nextToken());	//목표
		
		int[] arr = new int[N];
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int i=0; i<N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		int start = 0, end = 0, sum = 0, cnt = 0;
		
		while(true) {
			if(sum>M) {
				sum-=arr[start++];
			} else if(end==N) {
				break;
			} else {
				sum+=arr[end++];
			}
			
			if(sum == M) 
				cnt++;
		}
		
		System.out.println(cnt);
	}
}

 

ref. 코딩 테스트 & 알고리즘 대회 핵심 노트 - 투 포인터(Two Pointers), 구간 합(Prefix Sum)

https://youtu.be/rI8NRQsAS_s

반응형
반응형
for (byte val : br.readLine().getBytes()) {
				
	//내용 삽입
}

 

입력받은 문자열 길이만큼 반복하여 변수 val 저장

반응형
반응형

- nodemon.json

{
    "ignore": ["src/public/*"],
    "exec": "babel-node src/server.js"
}

nodemon을 설정하기 위해 nodemon.json 생성

 

nodemon은 프로젝트를 살펴보고 변경 사항이 있을 때 서버시를 재시작해줌

서버를 재시작하는 대신 bable-node를 실행하게 되는데

Babel은 작성한 코드를 일반 NodeJs 코드로 컴파일 해줌 > 그 작업을 src/server.js에서 해주는 것

 

- server.js

 

import express from "express";

const app = express();

express를 import

express 어플리케이션을 구성

 

app.set("view engine", "pug");
app.set("views", __dirname + "/views" );
app.use("/public", express.static(__dirname + "/public"));
app.get("/", (req, res) => res.render("home"));

view engine을 pug로 설정

views 디렉토리 설정

public 디렉토리 설정 > public 폴더를 유저에게 공개해주는 코드 (line 3)

홈페이지로 이동 시 사용될 템플릿을 render

 

*public 파일은 frontend에서 구동되는 코드 (중요!)

*현재 디렉토리에서 server.js는 백엔드 / app.js는 프엔 

 

 

* catchall url를 만들고 싶다면

app.get("/*", (req, res) => res.redirect("/"));

유저가 어떤 url로 이동하든지 requst 및 response 할 수  있고 홈으로 돌려 보내기

(다른 url 사용 X, 홈 URL 만 사용할거기 때문)

 

 

- views > home.pug를 렌더하면 끝

 

script(src="/public/js/app.js")

 

정리

❗express 사용 NodeJS 설정

❗package.json, script 생성

❗babel (babel-node 실행 > babel.config.json을 찾고 코드가에 적용돼야 하는 preset 실행)

 

반응형

'Node.js' 카테고리의 다른 글

[Node/Zoom줌 클론 코딩] Server Set up  (0) 2022.06.04
반응형

1. zoom 폴더 생성 후 npm init -y 해주기

C:\Users\user>cd C:\projects

C:\projects>mkdir zoom

C:\projects>cd zoom

C:\projects\zoom>npm init -y
Wrote to C:\projects\zoom\package.json:

{
  "name": "zoom",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

 

* npm init -y 이란 ? 

npm(Node Package Manager) | node.js에서 사용하는 모듈들을 패키지로 만들어 관리하고 배포하는 역할

package.json | 패키지에 관한 정보와 의존중인 버전에 관한 정보를 담고 있습니다.

npm init | package.json를 생성하여 Node 패키지에 관한 정보와 의존중인 버전에 관한 정보로 node.js에서 사용하는 모듈들을 패키지로 만들어 관리하고 배포하기 위해서 사용되는 것입니다. >> package.json이란 파일을 생성하기 위해 사용된다.

 

참고) https://m.blog.naver.com/ckdgh930314/221801015725

 

2. README.md 파일 생성

 

3. npm i nodemon -D

: nodemon 설치를 위한 코드

 

4. 파일 생성

babel.config.json (바벨 설치를 위해)

nodemon.json

src > server.js

 

5. npm i @babel/core @babel/cli @babel/node -D

.gitignore도 생성하기

 

6. nodemon.json

: exec 명령어로 서버 실행

{
    "exec" : "bable-node src/server.js"
}

7. babel.config.json 

: preset 설정

{
    "presets" : ["@babel/present-env"]
}
 
8. npm i @babel/preset-env -D  
* package.json에 설치된 것을 볼 수 있음.

9. package.json scripts 추가

*"dev"는 nodemon을 호출하는 일만 함

nodemon 호출 > nodemon.json를 살펴봄

"scripts": {
        "dev": "nodemon"
      },

10. express, pug 설치

npm i express

npm i pug

 

11. server.js 수정

 

import express from "express"

const app = express();

console.log("hello");

//port 3000
app.listen(3000);

 

12. nom run dev

반응형

'Node.js' 카테고리의 다른 글

NodeJS 프로젝트 셋업 정리  (0) 2022.06.05