기본 콘텐츠로 건너뛰기

5월, 2023의 게시물 표시

코딩 테스트 - 피자 나눠 먹기 (3)

package programmers; class 피자_나눠_먹기_3_230530 {       public int solution ( int slice , int n ) {         int answer = 0 ;         if (n % slice == 0 ){             answer = n / slice;         } else {             answer = n / slice + 1 ;         }         return answer;     }           public int solution_upgrade ( int slice , int n ) {         return ( int ) Math. ceil (( double ) n / slice);         //나눗셈 대신 올림 함수를 사용할 수 있다.         //n을 slice로 나눌 때, 나머지가 있는 경우 하나를 더 추가로 먹어야 한다.         //이를 계산하기 위해 n/slice+1을 사용하고 있었는데,         //사실 Math.ceil 메서드를 사용하여 올림 하면 된다.     }     }

코딩 테스트 - 요격 시스템

package programmers ; import java.util.* ; class 요격 _ 시스템 _230529 { public int solution ( int [][] targets) { Arrays. sort (targets , Comparator. comparing (( int [] i) -> i[ 1 ])) ; //targets 배열을 두번째 열 ( 좌표 범위 끝 ) 기준으로 오름차순 정렬 int 요격미사일수 = 0 ; int 현재요격가능한최대 x 좌표 = 0 ; for ( int [] target : targets) { //targets 배열을 순회하며 요격 미사일 수 계산 if (target[ 0 ] >= 현재요격가능한최대 x 좌표 ) { // 현재 폭격 미사일의 시작 좌표가 현재요격가능한최대 x 좌표 보다 크거나 같은 경우에는 요격미사일수 += 1 ; // 요격 미사일을 추가로 발사 현재요격가능한최대 x 좌표 = target[ 1 ] ; // 현재요격가능한최대 x 좌표를 target[1] 로 업데이트 } } return 요격미사일수 ; } } 1. targets 배열을 두 번째 열(좌표 범위의 끝)을 기준으로 오름차순으로 정렬합니다. 이는 최대한 많은 폭격 미사일을 요격하기 위해, 가장 먼저 끝나는 폭격 미사일을 우선적으로 요격하려는 것입니다. 2. 요격미사일수 변수를 0으로 초기화하고, 현재요격가능한최대x좌표 변수를 0으로 초기화합니다. 요격미사일수는 요격 미사일의 수를 저장하는 변수이고, 현재요격가능한최대x좌표는 현재 요격 가능한 최대 x 좌표를 나타내는 변수입니다. 3. 정렬된 targets 배열을 순회하며 각 폭격 미사일을 확인합니다. 현재 폭격 미사일의 시작

코딩 테스트 - 배열 원소의 길이

package programmers ; import java.util.Arrays ; class 배열 _ 원소의 _ 길이 _230528 { public int [] solution (String[] strlist) { return Arrays. stream (strlist) .mapToInt(String::length) .toArray() ; } public int [] solution_arr (String[] strlist) { int [] answer = new int [strlist. length ] ; for ( int i = 0 ; i < strlist. length ; i++){ answer[i] = strlist[i].length() ; } return answer ; } }

코딩 테스트 - 삼각형의 완성조건 (1)

package programmers ; import java.util.* ; class 삼각형의 _ 완성조건 _1_230527 { public int solution ( int [] sides) { int answer = 0 ; Arrays. sort (sides) ; return sides[ 2 ] >= sides[ 0 ]+sides[ 1 ] ? 2 : 1 ; } public int solution_arr ( int [] sides) { int answer = 0 ; Arrays. sort (sides) ; if ( sides[ 2 ] < (sides[ 0 ] + sides[ 1 ]) ) { answer = 1 ; } else { answer = 2 ; } return answer ; } }

코딩 테스트 - 배열 뒤집기

package programmers; import java.util.Arrays; import java.util.stream.IntStream; class Solution {     public int [] solution_Intstream ( int [] num_list ) {         return IntStream. range ( 0 , num_list.length)                 . map (i -> num_list[num_list.length - 1 - i])                 . toArray ();     }         public int [] solution_for ( int [] num_list ) {         int [] answer = new int [num_list.length];         for ( int i = num_list.length - 1 ; i >= 0 ; i -- ){             answer[num_list.length - 1 - i] = num_list[i];         }         return answer;     } }

코딩 테스트 - 나머지가 1이 되는 수 찾기

package programmers; class 나머지가_1이_되는_수_찾기_230525 {     public int solution ( int n ) {         int answer = 0 ;                 for ( int i = 2 ; i <= 1000000 ; i ++ ){             if (n % i == 1 ){                 answer = i;                 break ;             }         }         return answer;     }     //그냥 return 해도 되는 것.     public static int solutionStream ( int n ) {           return IntStream. rangeClosed ( 2 , 1000000 )                 . filter (i -> n % i == 1 )                 . findFirst ()                 . orElse ( 0 );     } }

코딩 테스트 - 첫 번째로 나오는 음수

package programmers; import java.util.stream.IntStream; class Solution {     public int solution1 ( int [] num_list ) {         return IntStream. range ( 0 , num_list.length)                 . filter (i -> num_list[i] < 0 )                 . findFirst ()                 . orElse ( - 1 );     }     public int solution2 ( int [] num_list ) {         int answer = - 1 ;         for ( int i = 0 ; i < num_list.length; i ++ ){             if (num_list[i] < 0 ){                 answer = i;                 break ;             }         }         return answer;     } /*     solution1 :     IntStream을 사용하여 num_list의 요소를 반복하고,     각 요소가 0보다 작은지 확인하는 필터링 작업을 수행한다.     조건을 만족하는 첫 번째 인덱스를 찾은 후,     해당 인덱스를 반환하거나,     만족하는 인덱스가 없는 경우에는 -1을 반환한다.     solution2 :     예로부터 내려오는 탐색을 한다. */ }

코딩 테스트 - 정수 찾기

package programmers; import java.util.Arrays; class Solution {     public int solution ( int [] num_list , int n ) {         return Arrays. stream (num_list). anyMatch (i -> i == n) ? 1 : 0 ;     }     public int old_solution ( int [] num_list , int n ) {         int answer = 0 ;         for ( int i = 0 ; i < num_list.length; i ++ ){             if (n == num_list[i]){                 answer = 1 ;             }         }         return answer;     } } 이러한 코드는 스트림을 사용 시에 배열 반복하는 것과 별로 차이가 없다. 그런데 스트림을 사용한 코드는 더 간결하고 함수형 스타일로 작성되었으며, 내부적으로 최적화된 연산을 수행할 수도 있다고 하니까 쓰긴 하는데, 사실 반복문을 사용한 코드도 성능적으로 큰 문제가 없다면 충분히 효율적이라고 한다. 그래도 코드의 가독성과 유지보수 용이성을 고려하여 스트림을 사용한 코드를 선호하는 경향이 있다고 한다. 나는 그냥 스트림으로 쓸 수 있는 건 스트림으로 하고 (사실 전체를 다 스트림으로 바꿔도 될 거 같지만), 회사용 코드는 주석 한줄씩 한라인씩 다는 경우에는 반복문 돌리려고 한다. (코드에 주석 없으면 힘든 어른)

개발 공부 - Hazelcast 포트 설정 (5701만 사용하기)

 Hazelcast는 분산 데이터 그리드 및 캐시 플랫폼으로서 여러 포트를 사용한다. Hazelcast를 사용할 때 기본 포트 및 사용 가능한 포트는 아래와 같다. 1. 기본 포트:    - 멤버십 포트 (멤버십 관리 및 클러스터 통신): 5701 2. 추가 포트:    - 클라이언트 포트 (외부 클라이언트 접속용): 5701부터 5709까지 포트 범위    - REST 포트 (REST 기반 API): 8080 Hazelcast는 다른 기능을 사용하기 위해 추가 포트를 구성할 수 있다.  예를 들어, 멀티캐스트 포트, TCP/IP 멤버십 포트 등을 설정할 수 있다.  그러나 이러한 포트는 기본값을 사용하는 것이 일반적이며, 대부분의 사용자는 기본 포트만 구성하고 사용한다. 참고로 포트 번호는 환경에 따라 다를 수 있으며, 사용자 정의 설정에 따라 다를 수 있다. 따라서 사용하는 환경에 따라 포트 설정을 확인한 뒤에 변경해야 한다. 폐쇄망인 경우 뚫리지 않은 포트에 접근하려면 허가가 필요하다. Hazelcast를 사용할 때 특정 포트(예: 5701)만 사용하도록 설정하려면 다음과 같은 절차가 필요하다. 1. Hazelcast 구성 파일인 hazelcast.xml 파일을 연다. 이 파일은 Hazelcast 클러스터의 설정을 정의하는 데 사용된다. 2. hazelcast.xml 파일에서 <network> 요소를 찾는다.  일반적으로 다음과 유사한 구조를 가지고 있다. <network>     ... </network> 3. <network> 요소 내에서 <port> 요소를 찾거나, 존재하지 않으면 생성한다.  <port> 요소는 Hazelcast 클러스터의 멤버십 포트를 설정하는 데 사용한다. <network>     <port auto-increment="true">5701</port>     ... </network> 4. 위의 코드에서

코딩 테스트 - 문자열의 앞의 n글자

class 문자열의_앞의_n글자_230522 {     public String solution (String my_string , int n ) {         String answer = my_string. substring ( 0 ,n);         return answer;     } } 머리 안 쓰기 운동 : 0단계... 이...이것을 Stream 연습용으로 쓰기에도 너무나 0단계 그러므로 바쁘지 않은 날은 최고단계(머리를 쓰는) 2개를 풀어야겠다고 생각...

코딩 테스트 - 문자열을 정수로 변환하기

package programmers ; class 문자열을 _ 정수로 _ 변환하기 _230521 { public int solution (String n_str) { int answer = Integer. parseInt (n_str) ; return answer ; } public int solution2 (String n_str) { int answer = 0 ; int len = n_str.length() ; for ( int i = 0 ; i < len ; i++) { answer += (n_str.charAt(i) - '0' ) * Math. pow ( 10 , len - i - 1 ) ; } return answer ; } }

개발 공부 - 데이터독(Datadog)

이 프로그램 이름을 자꾸 잊어서, 기억하고자 게시한다. Datadog는 클라우드 기반의 모니터링 플랫폼으로, 애플리케이션, 인프라스트럭처, 로그 및 기타 요소들을 모니터링하고 분석하는 데 도움을 준다. 이는 시스템의 효율성, 안정성, 성능 등을 개선하는 데 도움이 되는 중요한 도구이다. Datadog는 다양한 기능을 제공하여 사용자가 애플리케이션과 인프라스트럭처의 상태와 성능을 실시간으로 모니터링 할 수 있다. 이를 통해 예기치 않은 문제를 조기에 감지하고 신속하게 대응할 수 있다.  예를 들어, 서버의 CPU 사용률, 메모리 사용량, 네트워크 트래픽, 애플리케이션의 응답 시간 등과 같은 지표를 실시간으로 모니터링할 수 있다. 또한, Datadog는 로그 관리, 알림 및 대시보드, 인프라스트럭처 모니터링, APM(응용프로그램 성능 관리), 인텔리전스 등 다양한 기능을 제공한다. 이를 통해 사용자는 시스템의 문제를 해결하고 성능을 개선하는 데 도움이 되는 데이터를 얻을 수 있다. Datadog는 다양한 클라우드 플랫폼 (예: Amazon Web Services, Microsoft Azure, Google Cloud Platform) 및 다양한 기술 스택 (예: Docker, Kubernetes, MySQL 등)과 통합될 수 있다. 이는 다양한 환경에서 사용자가 모니터링 및 분석을 수행할 수 있도록 한다. 요약하면, Datadog는 클라우드 환경에서 애플리케이션과 인프라스트럭처를 모니터링하고 분석하는 도구로, 시스템의 성능을 개선하고 예기치 않은 문제를 빠르게 대응하는 데 도움이 된다는 것이다. 대시보드가 있는 그냥 모니터링하는 툴이라고 생각하며 쓴다...

코딩 테스트 - 공배수

import java.util.stream.IntStream; package programmers; class Solution {     public int solution ( int number , int n , int m ) {         return (number % n == 0 && number % m == 0 ) ? 1 : 0 ;     }     public int solution2 ( int number , int n , int m ) {         //굳이 Stream을 써서 이렇게도 할 수 있음         return IntStream. of (number). filter (num -> num % n == 0 && num % m == 0 ). count () > 0 ? 1 : 0 ;     } } }

코딩 테스트 - 길이에 따른 연산

import java.util.Arrays; class 길이에_따른_연산_230518 {     public int solution ( int [] num_list ) {         int answer = 0 ;                 if (num_list.length >= 11 ) {             answer = Arrays. stream (num_list). sum ();         } else {             answer = Arrays. stream (num_list). reduce ( 1 , (a, b) -> a * b);         }                 return answer;     }             public int solution2 ( int [] num_list ) {         int answer = (num_list.length >= 11 ) ? Arrays. stream (num_list). sum () : Arrays. stream (num_list). reduce ( 1 , (a, b) -> a * b);         return answer;     } } import java.util.stream.IntStream ; class Solution { public int solution ( int [] num_list ) { IntStream stream = IntStream . of ( num_list ); return num_list . length > 10 ? stream . sum (): stream . reduce ( 1 , ( a , b ) -> a * b ); } } ↑ 보기가 좋은 코드

코딩 테스트 - flag에 따라 다른 값 반환하기

package programmers; import java.util.stream.IntStream; class flag에_따라_다른_값_반환하기_230517 {     public int solution ( int a , int b , boolean flag ) {                 return flag ? IntStream. of (a, b). sum () : IntStream. of (a, b). reduce ((x, y) -> x - y). orElse ( 0 );     } } IntStream을 사용하여 a와 b를 스트림으로 만들고, sum() 메서드를 사용하여 두 수의 합을 구한다. flag 값에 따라 삼항 연산자를 사용하여 합 또는 차를 계산한다. reduce() 메서드를 사용하여 두 수의 차를 구하고, orElse() 메서드를 사용하여 기본값을 0으로 설정하고 최종 결과를 반환한다.  그런데 사실 package programmers; import java.util.stream.IntStream; class flag에_따라_다른_값_반환하기_230517 {     public int solution2 ( int a , int b , boolean flag ){         //이렇게 하면 되긴 합니다...         return flag ? a + b : a - b;     } } 이렇게 하면 되긴 하다.

개발 공부 - Chatgpt 자동 번역 시키기 (프롬프트 지니)

https://www.promptgenie.ai/ 프롬프트 지니 홈페이지 프롬프트 지니 ChatGPT에 한글로 질문하면 대답이 느리고, 짧고, 앞서 대화한 내용을 더 빨리 잊어 버립니다. 프롬프트 지니를 사용해서 한글로 쓰시면서도 ChatGPT 성능을 최대한으로 누리세요! 2~3배 빠른 응답 2~5배 긴 문자수 출력 출력 중간 짤림 최소화 3~4배 더 길게 ChatGPT가 기억함 새 기능 - 이제 마우스 버튼을 누르지 않고 키보드 입력 만으로 사용할 수 있습니다! - Ctrl+엔터 (혹은 CMD+엔터) 로 입력창의 한글도 바로 영어로 번역할 수 있어요! 오류, 새로운 기능 추천 등은 여기 게시판 에 남겨 주시면 처리해 드립니다. 프롬프트 지니는 설치 후에 ChatGPT ( https://chat.openai.com/ )로 가셔서 사용하실 수 있습니다. 크롬 브라우저 확장앱 설치하러 가기 네이버 웨일 / 마이크로소프트 엣지 브라우저에서 설치하기 ↑ 이렇게 쓰면 됩니다. 쓰고 나면 Chatgpt의 UI가 이렇게 바뀝니다. 그냥 엔터치면 자동으로 번역 해주고, 자동으로 응답에 대해서도 번역을 해 줍니다.

개발 공부 - Windows 11 디렉토리 내 PNG 파일을 최상단으로 이동하는 명령어

이것은 사실 카카오톡 이미지 추출 하는 것이 궁금해서 찾아보다가 또 만들기 귀찮아서 저장 목적으로 기재하는 글이다. 카카오톡 이모티콘 이미지 추출 방법 :  https://sunstar2.tistory.com/2271 1 for   / f  "tokens=*"  %f in ( 'dir /b /s *.png' )  do  move  "%f"  . cs 위 명령어는 현재 디렉토리와 하위 디렉토리에서 확장자가 .png인 모든 파일을 찾아서 이동 시킨다. 이때, 이동할 파일 이름을 찾을 때마다 사용자에게 확인 메시지가 뜨므로, 모든 파일을 한번에 이동시키기 위해서는 "Y"를 입력해야 한다. 이렇게 하면, 파일명 중복 시에는 덮어쓰기 / 넘어가기 / 취소하기만 가능하므로 아래와 같이 bat 파일을 만들어서 실행하면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 setlocal enabledelayedexpansion set i = 0 for   / r %%f in ( * .png)  do  (   set  / a i + = 1   set filename = %%~nf   set extension = %%~xf   set newfilename = ! filename ! _ ! i ! ! extension !    if  exist  "!newfilename!"  (     set  / a i + = 1     set newfilename = ! filename ! _ ! i ! ! extension !   )   move  "%%f"   "!newfilename!" ) Colored by Color Scripter cs 파일명이 중복되는 경우, 이름 뒤에 일련번호를 붙이는 방법으로 파일을 이동할 수 있다.  다음과 같은 명령어를 넣은 bat 파일을 사용하고자 하는 경로에서 실행하면, 중복된 파일에 대해 이름 뒤에 일련번호가 붙은 파일이

개발 공부 - Windows 11에서 Kafka 실행하기 (1)

1. 환경 :     Windows 11 2. 필요 사항 :       https://kafka.apache.org/downloads     ↑ 에서 환경에 맞는 Kafka Binary 다운로드 (tgz 파일)      Java 17을 지원하는 3.1.0을 사용한다. 호환성을 개인이 확인해서 적용해야 한다. 3. 실행 방법 :      1) Kafka 압축 해제     tgz 압축 해제                2) 사용 폴더 확인     bin, config 폴더를 사용한다.     (1)  C:\Tools\kafka_2.13-3.1.0\bin\windows     ↑ zookeeper, kafka 실행 bat 파일이 들어있다.       그냥 bin에는 sh이므로 윈도우 환경에서는 bat을 사용한다.          (2)  C:\Tools\kafka_2.13-3.1.0\config      ↑zoopkeper, kafka의 config 파일이 들어있다.     3) 사용 파일 확인     (1) zookeeper, kafka의 start, stop bat 파일을 사용한다.     (2) zookeeper, kafka의 properties 파일을 사용한다.     4) zookeeper 실행     (1)  C:\Tools\kafka_2.13-3.1.0 에서 터미널 실행          (2)  bin\windows\zookeeper-server-start.bat config\zookeeper.properties     명령어 실행               (3) 다른 터미널에서 포트 확인           netstat -na | findstr "2181"     5) kafka 실행     (1) C:\Tools\kafka_2.13-3.1.0 에서 터미널 실행          (2)  bin\windows\kafka-server-start.bat config\server.properties      명령어 실행          (3)

코딩 테스트 - 대문자로 바꾸기

package programmers ; import java.util.Locale ; class 대문자로 _ 바꾸기 _230515 { public String solution (String myString) { String answer = myString.toUpperCase(Locale. ROOT ) ; //myString.toUpperCase(); return answer ; } } `myString.toUpperCase(Locale.ROOT)`과 `myString.toUpperCase()`은 둘 다 문자열을 대문자로 변환하는 데 사용되는 Java String 메서드이다. 하지만 `myString.toUpperCase(Locale.ROOT)`은 로케일을 명시 적으로 지정하여 대문자 변환이 수행되는 것을 보장한다. 대문자 변환은 지역에 따라 다르게 처리될 수 있으므로 예기치 않은 결과가 발생할 수 있다. 이를 방지하기 위해 `toUpperCase(Locale.ROOT)` 메서드는 항상 표준 로케일을 사용한다. 반면, `myString.toUpperCase()` 메서드는 로케일을 지정하지 않고 기본 로케일을 사용하여 대문자 변환을 수행한다. 이 경우에는 기본 로케일이 올바른 로케일인 경우에는 상관없지만, 로케일에 따라 다르게 처리될 수 있으므로 `toUpperCase(Locale.ROOT)` 메서드를 사용하는 것이 더 안전하다.

정보 공유 - 강동자치온 프로그램 소개

1. 강동자치온에서 등록 https://jumin.gangdong.go.kr/main/Main.do PC 버전 모바일(스마트폰) 버전 2. 로그인 후 [강좌소개] 버튼 누름 3. 프로그램 신청 페이지로 이동 됨 https://jumin.gangdong.go.kr/program/ProgramBoardList.do?menucode=84 PC 버전 모바일(스마트폰) 버전 4. [길동] 선택 PC 버전  모바일(스마트폰) 버전 5. [검색] 누름 6. [유산소근력운동], [월수오전요가] 등록 강의지역 길동 / 길동 주민센터 / 4층 강당 강사명 박희숙 교육기간 2023-01-01 ~ 2023-12-31 교육시간 화,목 9:30 ~ 10:30 강의료 30,000 원 접수기간 2023-01-01 ~ 2023-12-31 프로그램 상세 내용 차례대로 읽고, 문의바랍니다.  1.  [온라인 접수 불가]  -> 02)471-7849 연락주세요.     방문접수만 가능하므로, 희망강좌 참관 및 등록을 같이 하시기 바랍니다.   2. 수강결제는  [월 기준] 이므로 접수는 매월 마지막주에 받습니다  3. 수강마감 강좌는  [대기자 등록] 을 받고 있으며, 순번이 되면 전화 및 문자드립니다.      아울러, 수강  [최대기간은 1년] 입니다.( 1년 후 정기 수료제 실시예정 )  4. 수강결제는  [카드/계좌/현금]  모두 가능합니다.  5. 카드결제 후  [3거래일] 이 지나면 카드취소를 통한 환불이 불가합니다.     추후 환불신청서에 기재한 계좌로 수강료 입금해드립니다.  6. 수강료 감면기준이 있습니다.(강동구 주민자치회 조례 참조)      다만,  [감면은 1인당 1강좌] 로 제한합니다. 감사합니다. 강사소개 강사명 박희숙 강사소개 강의지역 길동 / 길동 주민센터 / 4층 강당 강사명 고윤서 교육기간 2023-01-01 ~ 2023-12-31 교육시간 월,수 9:00 ~ 10:00 강의료 30,000 원 접수기간 2023-01-01 ~ 2023-12-31 프로그램