[Algo Smash] Week03 - BOJ1940, BOJ1253, PGS 178870
·
백준
BOJ 1940번: 주몽1) 접근 방법첫째 줄의 재료의 개수(n)가 주어지고, 두 번째에 두 재료의 수를 합쳐서 만들어야 하는 수(m)가 주어진다. 즉, arr[n]에 있는 숫자들 중 2개의 덧셈이 m이 되는 개수를 찾으면 된다.처음에 생각했던 방법은 단순하게 이중 for문을 사용해서 가능한 모든 조합의 수를 다 고려하는 방법이 떠올랐다. 하지만 이렇게 되면 시간 복잡도가 O(N*N)이고, N이 최대 15,000이기 때문에 시간 초과가 날 수 있다고 생각했다. 대신 두 개의 재료만 선택하면 되므로, 배열을 정렬한 뒤 양 끝에서 범위를 좁혀서 탐색하는 알고리즘을 선택했다. 데이터를 오름차순으로 정렬포인터 이동 규칙:arr[start] + arr[end] == M: 조건 만족을 했으므로 result를 증가시..
[Algo Smash] Week02 - BOJ 17413, 1021, 23843
·
백준
BOJ 17413번: 단어 뒤집기1) 접근 방법문자열이 주어졌을 때, 태그가 없는 단어이면 단어를 뒤집고 태그 안의 내용은 그대로 출력하는 문제이다. 단어를 들어온 순서대로 출력하거나 역순으로 출력해야 한다는 점에서 큐와 스택이 떠올랐다. 문자열 입력String으로 입력이 들어오는데 문자열 내에 공백이 있기 때문에 cin으로 받기에 부족하다고 생각했다. 그래서 getline(cin, str)을 이용해 엔터가 나오기 전까지의 문자열을 다 받는 메소드를 사용하였다. 태그 안에 있는 문자'')가 나올 때까지 queue에 넣는다. 또한, isTag라는 flag를 사용해서 태그가 시작되면 flag를 true로 바꿨다. 이는 태크 안에 있는 단어인지 판별하는 기능으로 사용했다. 마지막으로 '>'를 만나면 그동안 큐..
[Algo Smash] Week01 - BOJ 13335, 5052, 1759
·
백준
Ⅰ. 13335: 트럭1. 자료구조친절하게 그림까지 그려줘서,, 이 그림을 보자마자 큐가 생각났다!(자료구조를 배운 것이 2년 전이고 그동안 백준도 안 풀어서 algo-smach를 하면서 기초적인 내용도 정리할 예정이다.)Queue(큐)란 먼저 들어간 데이터가 먼저 나오는 방식의 선형 자료구조이다.간단하게 queue를 구현한다면 다음과 같이 구현할 수 있을 것 같다.struct Queue { int data[2000]; int front = 0; int rear = 0; void push(int val) { data[rear++] = val; } void pop() { front++; } int getFront() { ..
컴퓨터공학으로 살아남기.. 교수님 잡담에서 얻은 교훈
·
잡담
이번 학기에 전공 필수인 '시스템 프로그래밍' 수업을 듣고 있다. 개강미사랑 휴강이 겹쳐서 두 번이나 수업을 쉬고, 오랜만에 대면 강의를 하던 날이었다. 진도는 Process 파트를 나가고 있었는데, 갑자기 교수님의 잡담 타임이 시작됐다.교수님들 잡담이라고 하면 교수님 학부 시절 이야기나,, 머 요새 고등학교에서는 이런 거 안 배우냐,, ~ 조교님 잡도리하기 ..ㅋㅋㅋㅋ 등등 가벼운 이야기가 대부분이었다. 근데 영X큄 교수님은 현재 컴퓨터공학 관련 산업 전체에 대해 이야기를 시작했다. 요새 진로 고민이 너무 많은 나였기에 너무 흥미롭게 들었고, 교수님 말솜씨도 너무 좋아서 시간이 가는 줄 몰랐다. AI 시대에서 살아남는 법교수님이 제일 먼저 꺼낸 이야기는 AI였다.요즘 산업 현장에서는 원래 팀 단위로 ..
[기초컴퓨터그래픽스] 01. What is Computer Graphics
·
컴퓨터 그래픽스
Ⅰ. 3D 컴퓨터 그래픽스1. 3D 기하 모델링 (3D Geometric Modeling)가상의 3차원 세상에 존재하는 물체들을 어떻게 효과적으로 표현할 것인가? 개념: 3차원 물체를 수학적 데이터와 와이어프레임 형태로 만들어내는 과정 표현 기법: 폴리곤(Polygonal) 모델, 곡면(Curved surface) 모델, 볼륨(Volumetric) 모델, 절차적(Procedural) 모델 등 → 다양한 수학적 방식 사용생성 방식: 3D 모델링 전문 소프트웨어를 사용하여 직접 형태를 만들기실제 사물을 3D 스캐너로 스캔하여 데이터를 얻기촬영된 여러 장의 사진을 바탕으로 3D 모델을 추출해내기2. 3D 애니메이션 (3D Animation)어떻게 하면 가상의 3차원 세상에서의 움직임을 자연스럽게 표현할 수 ..
[DIP/FE] 구글 플레이스토어 앱 출시하기- 14일 비공개 테스트
·
TAVE-16th
Ⅰ. 초기 앱 등록1) 구글 개발자 등록하기앱을 구글 플레이스토어에 배포하려면 먼저 Google Play Developer 계정을 만들어야 한다.개발자 등록 비용은 25달러이며, 최초 1회만 결제하면 평생 사용할 수 있다. (꽤 비싸다..)개발자 등록을 완료하면 Google Play Console에서 앱을 등록하고 관리할 수 있는 권한이 생긴다. 2) 안내에 따라 앱 정보를 등록 개발자 등록이 끝나면 Play Console에서 앱을 생성하고 기본 정보를 입력해야 한다.이 과정에서 생각보다 입력해야 할 정보가 많았다. 앱 이름, 앱 설명, 광고 ID, 연령등급, 배포 국가, 개인정보 처리방침, 그래픽 리소스 등등 3) 앱 번들(AAB) 파일 추출하기예전에는 APK 파일을 업로드했지만, 현재는 AAB(And..
[DIP/FE] 둘러보기 - 카테고리별 API 호출하기
·
TAVE-16th
Ⅰ. 둘러보기 개요 둘러보기란 다른 사용자들이 생성한 플레이리스트를 탐색할 수 있는 페이지이다. 사용ㅈ는 다양한 맥락에서 만들어진 플레이리스트를 살펴보며 새로운 음악 취향을 발견할 수 있다. 상단에는 다음과 같은 카테고리 필터가 제공된다.장소 : 카페, 이동 중, 집/실내 등목표 : 활력, 집중, 위로 등데시벨 : 조용함, 보통, 시끄러움 등사용자는 이 카테고리를 선택하여 원하는 상황에 맞는 플레이리스트를 탐색할 수 있으며, 각 카테고리 안에서도 세부 필터를 통해 플레이리스트를 좁혀볼 수 있다. 또한 둘러보기 중 맘에 드는 플레이리스트를 발견하면 Spotify 딥링크를 통해 바로 재생할 수 있으며, 내 라이브러리레 저장할 수 있는 기능도 있다. Ⅱ. 둘러보기 필터링 구현 둘러보기 페이지에서 장소', ..
[DIP/FE] 라이브러리 - Spotify에서 4분할 커버 가져오기 & 플리 삭제하기
·
TAVE-16th
Ⅰ. 라이브러리 개요 사용자가 추천받은 플레이리스트를 저장하고 다시 찾아볼 수 있는 공간인 라이브러리이다. 2열 그리드로 구성하였고, 각 플레이리스트의 커버는 최상단의 플레이리스트 앨범 커버 4개를 분할하여 보여줬다. 이를 통해 사용자는 플레이리스트 이름과 앨범 커버를 동시에 확인하면서 시각적으로 시원함을 주었다. 라이브러리의 서버 요청을 할 때에는 데이터가 많아질 가능성이 있기 때문에 페이지네이션 방식을 사용하였다. 10개 단위로 끊어서 로드했고, 스크롤 하단 도달 시 다음 페이지를 또 요청하는 방식이다. 라이브러리에 들어오면 일단 우리 서버에서 playlistId 목록을 조회한다. 처음에는 이 아이디를 다시 상세 조회 API로 호출하여 4개의 커버를 가져오는 방식으로 하였는데, 이렇게 되면 for문..
[DIP/FE] Playlist 추천 결과 - 리스트형 & 갤러리형 보기(ViewPager2)
·
TAVE-16th
Ⅰ. 개요우리 앱은 플레이리스트 추천 결과 화면은 리스트형, 갤러리형 등 2가지 방식으로 음악을 탐색할 수 있도록 설계했다. 리스트형으로 추천된 음악을 빠르게 확인할 수 있고, 갤러리형으로 앨범 이미지가 넘어가는 애니메이션으로 보다 몰입감 있는 경험을 제공한다. 리스트형갤러리형 리스트형갤러리형사용자는 우측 맨 위에 있는 버튼을 눌러 언제든지 원하는 모드로 바꿀 수 있다.추천된 플레이리스트는 Spotify에서 바로 재생할 수 있도록 딥링크 기능을 제공한다. 화면 상단의 "Spotify 전체 듣기" 버튼을 누르면 Spotify이 실행되고(앱이 없는 경우 웹사이트로), 추천된 플레이리스트를 재생할 수 있다.하단에는 플레이리스트를 라이브러리에 저장할 수 있는 버튼이 있다. 사용자가 지금 추천된 플레이리스트가 마..
[DIP/FE] 노래 추천받기(2) - Polling 방식으로 서버 요청 보내기
·
TAVE-16th
Ⅰ. 추천받기 ViewModel3단계를 거치며 수집된 데이터들을 저장하는 뷰모델이다. 이 뷰모델 덕분에 마지막에 ResultFragment에서 한 번에 서버로 요청 보낼 수 있다.class RecommendationViewModel : ViewModel() { var place: String = "" var decibel: Float = 0.0f var goal: String = "" // 서버 전송용 영문명 var englishPlace: String = "" var englishGoal: String = "" // 데이터 확인용 로그 fun checkData() { Log.d("RecResultFragment", "현재 저장된 데이터 -> 장소:..