디지털 저작권(Digital Copyright): 개념, 장점, 단점, 문제점, 해결 방안
개념디지털 영역에서 원본 저작물에 부여된 법적 권리를 보호음악, 영화, 소프트웨어, 문서, 이미지 등 다양한 디지털 형태의 저작물을 포함하며, 복제, 배포, 공연, 전송 등을 통제할 권리를 창작자에 부여 사례1. 음악 스트리밍 서비스: Spotify, Youtube Music 등의 플랫폼은 저작권을 보호하면서 음악을 스트리밍하도록 함. 2. 동영상 플랫폼: Youtube 3. 전자책 플랫폼: Amazon Kindle 등. 저작권 보호를 통해 불법 복제 예방하며 창작물 판매 4. 오픈소스 소프트웨어:  개발자들이 소스 코드를 공개하여 누구나 수정하고 개선할수 있도록 하여 협업과 혁신을 촉진 문제점 1. 불법 복제: 쉽게 복제, 배포가 가능한 디지털 저작물 특성상, 저작권 보호가 쉽지 않음. 2. 국제적 규..
2024.05.30
IT
no image
딥페이크(Deepfake): 개념, 장점, 단점, 문제점, 해결 방안
정의인공지능 딥러닝 기술을 활용하여 영상, 이미지, 음성 등을 조작하여 진짜처럼 보이게 만드는 기술.딥러닝(Deep learning)의 '딥'과 가짜를 뜻하는 페이크(fake)의 합성어딥페이크의 기반은 2014년 등장한 머신러닝 기술인 '적대관계생성신경망(Generative Adversarial Networks, GAN)'※GAN기술?생성자와 판별자를 대립 관계로 생성한 뒤, 생성자가 만들어낸 정보를 판별자가 진위 판별. 이 과정을 반복하며 상호 발전하며 실제와 유사하게 만들어짐.  장점 (활용 사례) 1. 다양하고 간편해진 창작 활동: 고인이 된 배우를 영화에 재현하거나, 가수의 콘서트 장면 재현 등 2. 교육 및 훈련: 실제 상황과 유사하게 재현하여 현실감을 높여 교육 및 훈련 효과 상승 3. 질병 ..
2024.05.30
IT
생성형 인공지능(Generative AI): 정의, 활용, 장점, 단점, 문제점, 해결 방안, 현안 사항
정의인공지능(Artificial Intelligence)인간의 지능으로 할 수 있는 사고, 학습, 추리, 논증 등을 컴퓨터 프로그램으로 실현한 기술 생성형 인공지능(Generative AI)프롬프트에 대응하여 텍스트, 음악, 이미지, 기타 미디어를 생성할 수 있는 인공지능으로, 주어진 데이터로부터 새로운 컨텐츠를 만들어내는 데 초점을 맞춘 인공지능 활용 종류1. 텍스트 인공지능대화형 인공지능- 챗봇 : 채팅에서 유저의 메세지에 응답하는 봇  ex) 심심이, 은행 상담챗봇 등- 음성인식 비서 : 사람이 컴퓨터에 음성 명령을 주고, 그 일을 대신 수행   ex) 빅스비, Siri, 구글 어시스턴트- LLMs A.I.(Large Launguage Models conversational A.I.) : 대규모 언..
2024.05.30
IT
자바: StringTokenizer 사용법, split과의 차이
StringTokenizer??문자열을 원하는 구분자로 나누어 토큰으로 분리할 때 사용java.util 패키지에 속해 있음기본은 공백 기준으로 쪼개준다  사용법1. 기본 구분 (공백으로 구분) String str = "Java is fun"; StringTokenizer st = new StringTokenizer(str); while (st.hasMoreTokens()) {     System.out.println(st.nextToken()); }     // 출력: Java   is   fun    2. 원하는 구분자로 구분두 번째 매개변수로 원하는 구분자를 입력하면 해당 구분자를 기준으로 쪼개준다.String str = "Java, is, fun"; StringTokenizer st = new St..
2024.05.29
백준: 2164번 카드2 (자바, Java)
[백준] 2164번 카드2https://www.acmicpc.net/problem/2164   문제N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나..
2024.05.28
no image
자바: BufferedReader , Scanner
입력을 처리하는 방법 중 가장 많이 사용되는 클래스가BufferedReader, Scanner이다. BufferedReader, Scanner 특징BufferedReader- 입력을 버퍼링 하여 빠르게 읽음- readLine()을 사용해 한 줄씩 읽을 수 있음- 멀티스레드 환경에서 안전하게 사용 가능 Scanner- 사용 비교적 간편- 문자열 뿐 아니라 파일, 콘솔 등 다양한 입력 가능- nextLine(), nextInt(), nextTokenizer() 등 다양한 타입을 입력받을 수 있다.- 멀티스레드 환경에서는 부적합- 정규표현식 지  // 임포트 필요 import java.io.BufferedReader;      import java.io.InputStreamReader; import java...
2024.05.27
머신러닝 / 딥러닝
머신러닝:컴퓨터가 프로그래밍 없이 스스로 규칙을 찾아 학습하고 예측하거나 결정을 내리는 기술  딥러닝:머신러닝의 한 분야, 인공신경망(Artificial Neural Networks)사용한 학습 방법.다층신경망을 통해 복잡한 패턴을 학습  기술 활용 상황1. 이미지 및 음성인식: 이미지 분류, 얼굴 인식, 음석 인식 등에 딥러닝을 활용함ex) 구글 포토 이미지 검색, 애플 시리, 아마존 알렉사 2. 자연어 처리: 텍스트 분석, 번역, 챗봇 등ex) GPT, 챗봇서비스 등 3.추천 시스템: 사용차 행동 패턴을 분석해 취향 맞춤 추천, 광고를 해줌ex) 넷플릭스 유튜브에서 영상 추천 4. 의료 진단: 의료 이미지를 분석해 질병을 진단ex) 암 진단, 심장 질환 예측 5. 자율 주행: 딥러닝을 통해 주변 환경..
2024.05.27
IT
백준: 1436번 영화감독 숌 (자바, Java)
[백준] 1436번 영화감독 숌https://www.acmicpc.net/problem/1436      문제숫자 6이 연속으로 3개 이상 포함되는 수 중 가장 작은 수는 666이다.그렇다면 숫자 6이 연속으로 3개 이상 포함되는 수 중  N번째로 작은 수를 구하는 프로그램을 작성하라. 입력 :첫째 줄에 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다. 출력 : 첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.  나의 답안처음에 문제를 잘못 읽었다. 6이 연속해서 3개 이상 포함되어야 하는데, 연속하지 않아도 3개 이상 포함되기만 하면 되는 줄 알고 charAt() 메서드를 사용해서 코드를 작성했다... 왜 안되나 계속 들여다 보다가 한참 뒤에 문제를 다시 읽고 원인을 발견했다 ㅋㅋㅋ ..
2024.05.25
백준: 1920번 수 찾기 (자바, Java)
[백준] 1920번 수 찾기https://www.acmicpc.net/problem/1920     문제육각형으로 이루어진 벌집이 있다. 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다. 입력 :첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다. 출력 :입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.  나의 답안 import java.util.*; public class Mai..
2024.05.24
no image
자바: getter, setter 메서드
Getter와 Setter란?객체지향 프로그래밍에서 클래스의 속성(필드)을 외부에서 접근할 수 있도록 하는 메서드데이터 보존을 위해 private으로 객체를 보호하므로, 이 객체의 값에 접근하기 위해서는 같은 클래스 안의 메서드를 만들어두고 해당 메서드를 통해 접근해야 함.Getter : 클래스의 필드 값을 반환하는 메서드Setter : 클래스의 필드 값을 설정하는 메서드 작성법Getter 메서드 :- 반환타입은 필드의 타입과 동일- get + 필드이름(첫 글자 대문자)Setter 메서드 :- 반환타입은 void- set + 필드이름(첫 글자 대문자)public class Person {     // private으로 객체보호     private String name;       private int ..
2024.05.23

개념

  • 디지털 영역에서 원본 저작물에 부여된 법적 권리를 보호
  • 음악, 영화, 소프트웨어, 문서, 이미지 등 다양한 디지털 형태의 저작물을 포함하며, 복제, 배포, 공연, 전송 등을 통제할 권리를 창작자에 부여

 

사례

1. 음악 스트리밍 서비스: Spotify, Youtube Music 등의 플랫폼은 저작권을 보호하면서 음악을 스트리밍하도록 함.

 

2. 동영상 플랫폼: Youtube

 

3. 전자책 플랫폼: Amazon Kindle 등. 저작권 보호를 통해 불법 복제 예방하며 창작물 판매

 

4. 오픈소스 소프트웨어:  개발자들이 소스 코드를 공개하여 누구나 수정하고 개선할수 있도록 하여 협업과 혁신을 촉진

 

문제점

 

1. 불법 복제: 쉽게 복제, 배포가 가능한 디지털 저작물 특성상, 저작권 보호가 쉽지 않음.

 

2. 국제적 규제 복잡성: 국가별 법률과 규정이 달라 국제적인 저작권 보호가 어려움

 

3. 저작권 침해 판별의 어려움: AI가 제작한 제작물을 저작권으로 인정 가능한지, 저작물의 불법적 배포의 근원이 어디인지
                                                등 명확한 침해 판별이 어려움

 

4. 생성형 AI 저작권 침해 문제: 인터넷 상 데이터를 수집하여 활용하는 AI가 창작한 저작물은 저작권 침해의 위험이 있음.

 

해결방안

 

1. 법적 규제 강화: AI기술로 창작된 컨텐츠에 워터마크 의무화 등의 규제 필요

 

2. 올바른 데이터 활용: 생성형AI 학습 시 저작권 문제가 해결된 데이터만을 활용하여 저작권 문제 해결

 

3. 플랫폼 책임 강화: 유튜브, 페이스북 등 주요 플랫폼 차원에서 딥페이크 콘텐츠 감지 및 차단하는 시스템을 강화

 

4. AI복제 방지 기술: AI 데이터 학습에 사용될 때 원본과 다른 형태로 보이게 하는 기술 개발 (시카고 대학교 글레이즈팀)

 

5. NFT 기술: 블록체인 기술을 활용한 NFT를 통해 창작물의 소유권 주장 가능. 복제 시 저작권 침해 여부 파악이 용이

 

 

 

관련 뉴스

https://ditoday.com/ai-%EC%8B%9C%EB%8C%80-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%A0%80%EC%9E%91%EA%B6%8C-%EC%96%B4%EB%94%94%EA%B9%8C%EC%A7%80-%EC%99%94%EB%82%98/

 

AI 시대 디자인 저작권, 어디까지 왔나 - DIGITAL iNSIGHT 디지털 인사이트

AI 저작권 논의 첨예... 합리적인 저작권 법 만들어져야

ditoday.com

 

https://www.newsis.com/view/?id=NISX20240516_0002737197&cID=10701&pID=10700

 

저작권보호원, 한-태국 저작권포럼…"K-콘텐츠, 전략적 협력"

[서울=뉴시스]조수원 기자 = 문화체육관광부와 태국 지식재산청이 공동 주최하고 한국저작권보호원이 주관하는 '2024 한-태 저작권 포럼'이 16일(현지시간) 태국 방콕에서 개최됐다

www.newsis.com

 

정의

  • 인공지능 딥러닝 기술을 활용하여 영상, 이미지, 음성 등을 조작하여 진짜처럼 보이게 만드는 기술.
  • 딥러닝(Deep learning)의 '딥'과 가짜를 뜻하는 페이크(fake)의 합성어
  • 딥페이크의 기반은 2014년 등장한 머신러닝 기술인 '적대관계생성신경망(Generative Adversarial Networks, GAN)'
    ※GAN기술?
    생성자와 판별자를 대립 관계로 생성한 뒤, 생성자가 만들어낸 정보를 판별자가 진위 판별. 이 과정을 반복하며 상호 발전하며 실제와 유사하게 만들어짐.

 

 

장점 (활용 사례)

 

1. 다양하고 간편해진 창작 활동: 고인이 된 배우를 영화에 재현하거나, 가수의 콘서트 장면 재현 등

 

2. 교육 및 훈련: 실제 상황과 유사하게 재현하여 현실감을 높여 교육 및 훈련 효과 상승

 

3. 질병 예방: 암 탐지 모델을 학습시키는데 활용하여 정확도 높임

 

4. 감정적 치유: 사망한 가족의 과거 데이터를 통해 VR을 통해 구현

 

 

 

단점, 문제점

 

1. 사생활 침해, 초상권 문: 딥페이크 음란물 등에 악용하여 사생활 침해와 정신적 피해를 유발

 

2. 허위 정보 확산: 실제 일어나지 않은 가짜 뉴스를 확산시켜 사회적 혼란 야기

 

3. 범죄 악용: 금융 사기, 정치적 목적으로 악용할 가능성이 있음

 

 

해결방안

 

1. 법적 규제 강화: 딥페이크 창작물에 대한 워터마크 표시 의무화. 허가 없는 유포 규제 등 법적 규제 강화

 

2. 기술적 방어: 딥페이크 여부를 탐지하는 인공지능 모델 개발하여, 딥페이크 창작물 식별 및 차단 시스템 구축

 

3. 플랫폼 책임 강화: 유튜브, 페이스북 등 주요 플랫폼 차원에서 딥페이크 콘텐츠 감지 및 차단하는 시스템을 강화

 

4. 사회적 교육: AI교육, 딥페이크 악용 사례 전파, 공개적인 토론, 인식 제고 캠페인  등을 통해 스스로 정보를 판단하고 검증할 능력을 키움.

 

 

 

관련 뉴스

https://www.edaily.co.kr/news/read?newsId=03253766638894168&mediaCodeNo=257&OutLnkChk=Y

 

"딥페이크 범죄, 골든타임 중요…5분이면 판별 가능하죠"[경찰人]

“예전에는 수사관이 눈으로 가짜인지 판단할 수 있었지만 AI(인공지능) 때문에 이젠 아니에요. 사이버범죄는 빨리 포착하지 않으면 증거 수집이 어려워서 수사를 도울 프로그램이 필요하다고

www.edaily.co.kr

https://www.greened.kr/news/articleView.html?idxno=314658

 

국회미래연구원 보고서, “딥페이크, 규제뿐 아니라 산업적 가치도 주목해야” - 녹색경제신문

[녹색경제신문 = 이선행 기자] 국회미래연구원이 「국가미래전략 Insight」 97호 ‘생성형 인공지능(AI)가 만든 진짜 같은 가짜: 딥페이크의 진화와 의미’를 27일 발간했다. 보고서를 작성한 이승

www.greened.kr

 

 

딥페이크는 가짜를 진짜랑 구별하지 못할 정도로 정교하게 만들어 낼 수 있을 정도로 그 기술이 발전했다.

그러나 이를 악용하는 사례까 너무나 많고, 그 피해 정도가 큰 만큼 좋지 않은 인식이 매우 많은 상황이다.

악용 범죄를 법적, 기술적, 사회적 측면에서 방지할 대책을 강구하여 딥페이크 기술의 안전한 사용 체계를 구축해야 한다.

정의

인공지능(Artificial Intelligence)

인간의 지능으로 할 수 있는 사고, 학습, 추리, 논증 등을 컴퓨터 프로그램으로 실현한 기술

 

생성형 인공지능(Generative AI)

프롬프트에 대응하여 텍스트, 음악, 이미지, 기타 미디어를 생성할 수 있는 인공지능으로, 주어진 데이터로부터 새로운 컨텐츠를 만들어내는 데 초점을 맞춘 인공지능

 

활용 종류

1. 텍스트 인공지능

  • 대화형 인공지능
    - 챗봇 : 채팅에서 유저의 메세지에 응답하는 봇
      ex) 심심이, 은행 상담챗봇 등
    - 음성인식 비서 : 사람이 컴퓨터에 음성 명령을 주고, 그 일을 대신 수행
       ex) 빅스비, Siri, 구글 어시스턴트
    - LLMs A.I.(Large Launguage Models conversational A.I.) : 대규모 언어 모델 기반 대화형 인공지능 서비스
      ex) 대화 특화: openAI - chatGPT, 구글 - 제미나이, MS - 코파일럿, 네이버 - 클로바X

2. 그림 : 인공지능을 이용해 이미지를 생성
    ex) 삼성 갤럭시AI, DALL·E3, DeepAI

 

3. 작곡
    ex) Suno AI, AIVA, Udio

 

4. 동영상 제작

    ex) Sora(OpenAI), AI 스튜디오 페르소, LUMIERE(구글)

 

5. 음성: 클로바더빙, AI보이스 스튜디오, Typecast 등

 

6. 코딩: GitHub Copilot, Tabnine

 

장점

 

1. 효율성 향상: 복잡하고 반복적인 작업을 자동화하여 인간의 개입 감소

 

2. 개인화: 개인의 선호도와 행동에 대한 데이터로 맞춤형 추천 등 개인 맞춤형 컨텐츠 경험 가능

 

3. 향상된 의사결정: 대량의 데이터를 분석하고 패턴을 식별함으로써 더 많은 정보에 근거한 결정을 지원

 

4. 활용성: 다양한 산업 분야에 적용할 수 있어 활용 범위가 넓음

 

 

 

단점, 문제점

 

1. 개인정보 침해: 개인정보를 포함한 데이터 수집 및 활용에 따른 프라이버시 침해 우려

 

2. 저작권 침해: 인터넷 상의 정보를 수집, 학습하는 특성 상, 만들어내는 창작물이 어딘가에 이미 존재하는 창작물일 위험

 

3. 자동화로 인한 일자리 감소: 자동화로 인해 기존의 일자리가 사라질 수 있다는 우려

 

4. 신뢰성 문제(환각, Hallucination문제): 실제 존재하지 않는 정보나 사실을 만들어내 혼란을 야기

    ex) 피자에 치즈를 붙이기 위한 방법에 대한 질문에 접착제를 사용해야 한다고 답변

 

5. 과도한 전력, 에너지 소비: 초거대 AI의 경우 높은 운영비용과 오랜 훈련시간, 전력소모가 매우 큼

 

6. 과도한 의존성: 과도한 의존으로 개인의 사고력 저하될 가능성 있음

 

7. 기술 악용(딥페이크)

 

 

 

해결방안

 

1. 사용 데이터 투명화: 각 인공지능 학습 시 활용하는 데이터를 공개하여 저작권, 프라이버시 문제 예방

 

2. 개인정보 식별, 익명화: 개인정보로 확인되는 데이터는 제거하거나 변경하여 익명화하는 AI 학습 및 도입

 

3. 데이터품질 향상을 위해 데이터 전처리 과정에서 품질 개선, 데이터 수집 단계에서부터 정확한 데이터를 수집하도록 노력

 

4. 편향성 제거: 공정한 데이터를 사용하고, 모델 학습 과정에서 편향성을 제거하도록 보정
    ex) 인종, 성별 등 각 인구 분포에 맞게 보정, 특정 관점을 반영하도록 의도적 조종

 

5. 새로운 일자리 창출 및 재교육 : 실업자에 대한 신규 일자리 창출, 적응을 위한 교육

 

6. 책임 소재 명확화: AI시스템 결정에 대한 근거, 출처 등을 남기도록 하여 책임소재 확인하도록 유도

 

7. 경량화모델 개발: 각 모델의 목적에 맞는 데이터만을 학습하여 연산 수와 매개 변수를 줄여 비용 감소



StringTokenizer??

  • 문자열을 원하는 구분자로 나누어 토큰으로 분리할 때 사용
  • java.util 패키지에 속해 있음
  • 기본은 공백 기준으로 쪼개준다

 

 

사용법

1. 기본 구분 (공백으로 구분)

 

String str = "Java is fun";
StringTokenizer st = new StringTokenizer(str);

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
    // 출력: Java   is   fun

 

 

 

 

2. 원하는 구분자로 구분

두 번째 매개변수로 원하는 구분자를 입력하면 해당 구분자를 기준으로 쪼개준다.

String str = "Java, is, fun";
StringTokenizer st = new StringTokenizer(str, ", ");

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
   //출력: Java   is   fun

   

 

 

3. 구분자까지 토큰으로 포함

 

세 번째 매개변수를 true로 설정할 경우 구분자까지 하나의 토큰으로 간주한다!

String str = "Java,is,fun";
StringTokenizer st = new StringTokenizer(str, ",", true);

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
    // 출력: Java   ,   is   , fun

  

 

 

 

 

StringTokenizer의 주요 메서드

1. hasMoreTokens(): 다음 토큰이 있는지 확인

 

2. nextToken(): 다음 토큰을 반환

 

3. countTokens(): 남은 토큰의 수 반환

 

 

 

 

 

 

split과의 차이?

 

StringTokenizer는 클래스이고, split은 String클래스에 있는 메서드이다!

 

StringTokenizer는 구분자로 문자열 or 문자 사용, split은 정규표현식 지원한다.

 

따라서 StringTokenizer는 간단한 작업, 가볍게 사용할 때 사용하며,

 

split은 정규표현식을 처리하는 만큼 복잡하고 유연한 사용이 필요할 경우에 사용하기 좋다.


[백준] 2164번 카드2

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

 

 

 

문제

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.

이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.

예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.

N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.

 

입력 :

첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.

출력 :

첫째 줄에 남게 되는 카드의 번호를 출력한다.

 

 

나의 답안

 

처음엔 다이나믹프로그래밍인가 하고

D(1) = 1

D(2) = 2

D(3) = 2

...

풀었으나, 일정 규칙이 보이질 않았다.

 

한참 헛다리 짚다가, 리스트를 사용해 직접 처리하는 코드를 작성했지만,

 

시간 초과로 실패.

 

알고보니 큐(Queue)를 이용해 푸는 문제였다.

 

<List를 사용한 코드>
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.io.*;
import java.util.*;

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());

        List<Integer> list = new ArrayList<>();

        for (int i = 1; i <= N; i++) {
            list.add(i);
        }

        while (list.size() > 1) {
            list.remove(0);
            list.add(list.get(0));
            list.remove(0);
        }

        System.out.println(list.get(0));
    }
}

 

 

 

 

개선 사항

<Queue를 사용한 코드>
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;

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());

        Queue<Integer> queue = new LinkedList<>();

        for (int i = 1; i <= N; i++) {
            queue.add(i);
        }

        while (queue.size() > 1) {
            queue.poll();
            queue.add(queue.poll());
        }

        System.out.println(queue.peek());
    }
}
  • List에서의 remove(0)은 첫 번째 요소를 제거하고 나머지 요소를 1칸씩 당겨와야 하기 때문에
    O(N)의 시간복잡도를 가진다.
  • Queue의 poll()은 FIFO구조로 맨 앞의 것만 빼오면 알아서 정렬되기에 O(1)의 시간복잡도를 가진다.

 

큐는 거의 사용해보질 않아서 생각을 못했다.

 

가독성은 둘 다 비슷하지만, 

 

효율성 측면에서 큰 차이가 있었다.

 

각 타입의 성질을 잘 파악해서 활용해야겠다.

자바: BufferedReader , Scanner

친환경 개발자
|2024. 5. 27. 22:26


입력을 처리하는 방법 중 가장 많이 사용되는 클래스가

BufferedReader, Scanner이다.

 

BufferedReader, Scanner 특징

BufferedReader

- 입력을 버퍼링 하여 빠르게 읽음

- readLine()을 사용해 한 줄씩 읽을 수 있음

- 멀티스레드 환경에서 안전하게 사용 가능

 

Scanner

- 사용 비교적 간편

- 문자열 뿐 아니라 파일, 콘솔 등 다양한 입력 가능

- nextLine(), nextInt(), nextTokenizer() 등 다양한 타입을 입력받을 수 있다.

- 멀티스레드 환경에서는 부적합

- 정규표현식 지

 

 

<BufferedReader 예시>

// 임포트 필요

import java.io.BufferedReader;      

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

public class BufferedReaderExample {
    public static void main(String[] args) {
        // 입력 받기 위한 변수 선언
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.print("Enter your name: ");
            String name = reader.readLine();  // 한 줄씩 입력
            System.out.println("Hello, " + name + "!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

<Scanner 예시>
// 임포트 필요

import java.util.Scanner;


public class ScannerExample {
    public static void main(String[] args) {
        // 입력 받기 위한 변수 선언

        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter your name: ");
        String name = scanner.nextLine(); 
        System.out.println("Hello, " + name + "!");
    }
}

 

비교

 

특징 BufferedReader Scanner
입력속도 더 빠름 비교적 느림
사용 용이성 복잡 (예외처리, 입력타입 문자열 뿐) 간편 (다양한 메서드 제공)
데이터 타입 String 다양 (int, double,String 등)
정규 표현식 지원 X 지원
멀티스레드 환경 멀티스레드에서 안전 멀티스레드에서 위험

 

 

 

 

 

 

 

속도차이가 나는 이유는 Buffer 사용 여부 차이, 정규표현식 적용 과정 여부 등 때문

 

여기서 Buffer란 데이터를 일시적으로 저장하는 메모리 공간을 말함.

 

BufferedReader는 8KB 크기의 버퍼에 저장되었다가 한 번에 전송하는 방식이고

 

Scanner는 입력에 바로바로 전송되는 방식

 

바로바로 전송되는 것보다 여러개 묶어서 보내는 것이 더 효율적이라는 원리.

 

 

 

 

 

결론

 

BufferedReader는 데이터 입력이 많거나 멀티스레드 환경, 빠르고 효율적인 처리가 필요할 때 사용

Scanner 다양한 데이터 타입을 입력할 수 있어 간편하므로 간단한 입력 처리인 경우에 용이

 

웬만하면 BufferedReader 사용하는 것으로 하자..

 

 

머신러닝 / 딥러닝

친환경 개발자
|2024. 5. 27. 15:24

머신러닝:

컴퓨터가 프로그래밍 없이 스스로 규칙을 찾아 학습하고 예측하거나 결정을 내리는 기술

 

 

딥러닝:

머신러닝의 한 분야, 인공신경망(Artificial Neural Networks)사용한 학습 방법.

다층신경망을 통해 복잡한 패턴을 학습

 

 

기술 활용 상황

1. 이미지 및 음성인식: 이미지 분류, 얼굴 인식, 음석 인식 등에 딥러닝을 활용함

ex) 구글 포토 이미지 검색, 애플 시리, 아마존 알렉사

 

2. 자연어 처리: 텍스트 분석, 번역, 챗봇 등

ex) GPT, 챗봇서비스 등

 

3.추천 시스템: 사용차 행동 패턴을 분석해 취향 맞춤 추천, 광고를 해줌

ex) 넷플릭스 유튜브에서 영상 추천

 

4. 의료 진단: 의료 이미지를 분석해 질병을 진단

ex) 암 진단, 심장 질환 예측

 

5. 자율 주행: 딥러닝을 통해 주변 환경을 인식하고, 경로 계획

ex) 테슬라 자율 주행 기술

 

6. 금융 분야: 신용점수 예측, 주식 거래 등

ex) 은행 부적 거래 탐지 시스템, 주식 거래 자동화

 

 

 

장점

 

1. 자동화: 복잡하고 반복적인 작업을 자동화하여 인간의 개입 감소

 

2. 정확성: 대량의 데이터를 분석하여 높은 정확도로 예측하고 의사결정

 

3. 적응성: 새로운 데이터에 따라 모델을 계속 학습하고 적응

 

4. 대규모 데이터 처리: 대량의 데이터를 효율적으로 처리하고 분석

 

5. 다양한 응용 분야: 다양한 산업 분야에 적용할 수 있어 활용 범위가 넓음

 

 

 

단점, 문제점

 

1. 개인정보 침해: 개인정보를 포함한 데이터 수집 및 활용에 따른 프라이버시 침해 우려

 

2. 알고리즘 편향: 학습 데이터의 편향성이 모델에 반영되어 윤리적 문제 발생 가능 (성차별, 인종차별적 발언 등)

 

3. 자동화로 인한 일자리 감소: 자동화로 인해 기존의 일자리가 사라질 수 있다는 우려

 

4. 투명성: AI 시스템의 결정에 대한 근거를 찾기가 어려움.

 

5. 보안 위협: 악의적인 사용자가 AI 기술을 이용해 보안 시스템을 무력화하거나 해킹할 가능성

 

6. 높은 비용: 데이터 처리 및 학습에 필요한 에너지와 비용이 높음

 

 

 

해결방안

 

1. 투명성 강화: 알고리즘의 작동 원리를 이해하고 설명할 수 있도록 연구를 진행하여 투명성 제고

 

2. 데이터 프라이버시 보호: 데이터 수집 활용 과정에서 개인정보에 대한 규정 준수 필요. AI와 접목하여 개인정보로 확인되는 데이터는 제거하거나 변경하여 익명화하도록 도입

 

3. 데이터품질 향상을 위해 데이터 전처리 과정에서 품질 개선, 데이터 수집 단계에서부터 정확한 데이터를 수집하도록 노력

 

3. 편향성 제거: 공정한 데이터를 사용하고, 모델 학습 과정에서 편향성을 제거하는 기술 개발

 

4. 윤리적 AI 개발: 윤리적 기준을 마련하고, 이를 준수하는 AI 시스템을 개발

 

5. 새로운 일자리 창출: 신기술 관련 교육을 확대하고, 새로운 일자리 확보

 

6. 책임 소재 명확화: AI시스템 결정에 대한 근거, 출처 등을 남기도록 하여 책임소재 확인하도록 유도

 

7. 보안 위협 대응: AI시스템의 동작을 실시간 모니터링하여 즉각 탐지 대응, 보안 훈련 및 교육 강


[백준] 1436번 영화감독 숌

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

 

 

 

 

 

 

문제

숫자 6이 연속으로 3개 이상 포함되는 수 중 가장 작은 수는 666이다.

그렇다면 숫자 6이 연속으로 3개 이상 포함되는 수 중  N번째로 작은 수를 구하는 프로그램을 작성하라.
 

입력 :

첫째 줄에 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.

출력 :

첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.

 

 

나의 답안

처음에 문제를 잘못 읽었다.

 

6이 연속해서 3개 이상 포함되어야 하는데, 연속하지 않아도 3개 이상 포함되기만 하면

 

되는 줄 알고 charAt() 메서드를 사용해서 코드를 작성했다...

 

왜 안되나 계속 들여다 보다가 한참 뒤에 문제를 다시 읽고 원인을 발견했다 ㅋㅋㅋ

 

 

import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        int i = 666;

        while (count < n) {
            String s = String.valueOf(i);
            if (s.contains("666")) count++;
            if (count == n) break;
            i++;
        }

        System.out.println(i);
    }
}

 

어떻게 하면 효율적으로 풀까 하다가 생각이 나지 않아 무식하게(?) 작성해봤는데 통과되었다.

 

count 변수를 이용해 몇 번째 숫자인지를 카운트했고,

 

666부터 시작해 수를 1씩 올려가며

 

contains()메서드를 이용해 해당 숫자에 6이 연속 3회 이상 포함되는지 확인했다.

 

 

 

개선 사항

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

public class Main {
    public static void main(String[] args) throws IOException{
        // Scanner에 비해 처리속도 높음
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        int n = Integer.parseInt(br.readLine());

        int count = 1;
        int num = 666;

        while (count < n) {
            num++;    //조건문 말미에 넣는 대신 처음에 넣음으로써 break;문 제거
            if (Integer.toString(num).contains("666")) count++;
        }

        System.out.println(num);
    }
}
  • Scanner보다 BufferedReader를 통해 입력 받는 것이 처리 속도 면에서 유리
  • 문자열 변수를 별도로 생성하는 대신 Integer.toString(num)을 사용
  • while문 첫부분에 num++를 넣음으로써 불필요한 break문 제거

 

※브루트포스 알고리즘:

문제를 해결하기 위해 가능한 모든 경우의 수를 탐색하는 방법

규모가 작거나, 다른 최적화된 알고리즘을 사용하기 어려울 때 유용하다.

 

장점

1. 확실성: 모든 가능성을 탐색하기 때문에 100%의 정확도를 가짐

2. 단순성: 구현이 쉽고 직관적임

 

단점

1. 비효율성: 경우의 수가 많아질수록 시간이 오래 걸림

2. 고비용: 데이터소모가 매우 많아짐

 

브루트포스 알고리즘을 쓰더라도, 확실하게 정답이 아닌 것들은 최대한

제거해주는 코딩을 하는 것이 바람직할 것으로 보인다!


[백준] 1920번 수 찾기

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

 

 

 

 

 

문제

육각형으로 이루어진 벌집이 있다. 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.


입력 :

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력 :

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

 

 

나의 답안

 

import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        int count = 1;
        int a = 1;

        for (int i=0; i<N/6; i++) {
            a += 6*i;
            if(a >= N) {
                System.out.println(count);
                break;
            }
            count++;
        }
    }
}

 

계차수열처럼, 1칸씩 바깥으로 나갈수록 그전 값이랑 6*n만큼 차이가 나는 것을 알 수 있다.

 

따라서 N=1 이면 1칸, N=2~7이면 2칸, N=8~19이면 3칸 이런 방식.

 

for문을 사용해 a값을 6*i만큼 늘려가며 범위를 넓혔고,

 

count를 사용해 값을 반환하도록 작성했다.

 

다만, for문을 사용할 경우 i의 값을 N/6까지로 설정했는데,

 

break;를 사용하긴 했지만 불필요한 반복이 발생할 수도 있고

 

그렇게 보기 좋은 코드는 아닌 것 같다.

 

 

 

개선 사항

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.close();
        
        int count = 1; 
        int range = 1; 
        
        while (N > range) {
            range += 6 * count;
            count++;
        }
        
        System.out.println(count);
    }
}
  • 변수를 a 대신 range로 바꿔 가독성을 높였다.
  • for문 대신 while문을 사용하여 불필요한 반복의 가능성을 제거했다.
  • 코드가 한결 간결해졌다.

 

계차수열을 어떻게 반복문에 표현할까를 생각보다 오래 고민했다.

 

바로바로 나오는 수준이 되어야 할텐데..

 

더 열공하자

자바: getter, setter 메서드

친환경 개발자
|2024. 5. 23. 21:18

 

 

Getter와 Setter란?

  • 객체지향 프로그래밍에서 클래스의 속성(필드)을 외부에서 접근할 수 있도록 하는 메서드
  • 데이터 보존을 위해 private으로 객체를 보호하므로, 이 객체의 값에 접근하기 위해서는 같은 클래스 안의 메서드를 만들어두고 해당 메서드를 통해 접근해야 함.
  • Getter : 클래스의 필드 값을 반환하는 메서드
  • Setter : 클래스의 필드 값을 설정하는 메서드

 

작성법

  • Getter 메서드 :
    - 반환타입은 필드의 타입과 동일
    - get + 필드이름(첫 글자 대문자)

  • Setter 메서드 :
    - 반환타입은 void
    - set + 필드이름(첫 글자 대문자)

public class Person {
    // private으로 객체보호

    private String name;   
    private int age;

    // 이름 반환
    public String getName() {
        return name;
    }

    // 이름 설정
    public void setName(String name) {
        this.name = name;
    }

    // 나이 반환
    public int getAge() {
        return age;
    }

    // 나이 설정
    public void setAge(int age) {
        this.age = age;
    }
}

 

 

사용하는 이유?

  • 캡슐화: 클래스 내부 구현을 숨기고(정보 은닉), 외부에서의 접근을 제한하여 객체 보호
                 >> 마치 TV를 볼 때 TV가 어떻게 작동하는지 원리를 우리가 모르고 쓰는 것과 같음
  • 유효성 검사 : Setter를 통해 값 설정 시 유효성 검사 수행 가능
  • 디버깅, 유지보수 : 코드의 가독성을 높이고 메서드 수정을 통해 유지보수 용이하게 함

 

장점

  • 데이터 접근 제어: 객체의 속성에 대한 읽기 및 쓰기 권한 제어
  • 캡슐화

단점

  • 실질적인 정보 노출: 변수를 private를 선언하더라도 getter, setter를 통해 접근하면 데이터 접근이 가능
  • 외부 접근 시 캡슐화가 지켜지지 않아 코드 안정성이 무너질 수 있음

 

Getter, Setter 메서드 사용 시 데이터에 접근 권한을 주는 것과 마찬가지.

데이터의 무결성을 약화시킨다.

따라서 사용을 지양하는 것이 좋다.

 

 

인텔리제이 꿀팁

인텔리제이에서 편리하게 getter, setter 메서드를 작성하는 팁이 있다.

마우스 우클릭 - Generate 클릭

 

Getter and Setter 클릭

 

 

 

OK
생성 완료