리눅스 서베에 접속할 때 생성한 키 파일을 이용해서 관리자 비밀번호를 표시하고, 이를 이용해서 로그인하는 방식으로 설명이 되어 있습니다. 보안상 root 계정 접속을 막고 새로 만든 계정으로 접속을 하라고 설명을 하셨는데요. 새로 만든 계정과 키 파일을 어떻게 연결을 해서 접솓을 하는지에 대한 설명이 없습니다. 이 부분에 대해서 추가 설명 부탁드립니다. 또한, 서버를 생성할 때 계정을 지정할 수 있는 방법이 있다면 이 부분도 설명 부탁드립니다.
안녕하세요. 선생님~ [AVL트리 - 개념] 강의 - 회전 관련 질문있습니다. 7:00 즈음 LL회전, RR회전 펼져있는 노드 이미지가 반대로 된것 아닌지? 궁금합니다. 헷갈려서 검색해보니 LL이라는 용어가 회전할 기준이 되는 노드의 왼쪽 노드, 그 다음 왼쪽 노드 형태에서 오른쪽으로 회전해서 균형을 맞추자!로 대체적으로 설명이 되어있는것같습니다. (이미지로는 왼쪽으로 쭉 내려가는 이미지) 위키백과에는 따로 LL,RR이라는 용어설명이 없어서, 블로그 글들 참조하였습니다. 뭔가 관점 차이인 부분일까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream> #include <initializer_list> using namespace std; class IntArray // integer가 담기는 클래스 { private: int m_length = 0; int* m_data = nullptr; public: //Constructors 생성자 IntArray(const int array_len) : m_length(array_len) { initialize(m_length); } IntArray(const initializer_list<int>& list) :IntArray(list.size()) { int count = 0; for ( auto& ele : list ) { m_data[ count ] = ele; count++; } } //initialize() 생성자에서 가져다 쓸 함수 void initialize(int len) { m_data = new int[ len ]; } //Destructors 소멸자 ~IntArray() { if ( m_data != nullptr ) delete[ ] m_data; m_data = nullptr; } //reset(); 메모리 지우고 초기상태로. void reset() { delete[ ] m_data; m_data = nullptr; m_length = 0; } //resize(); // 사이즈 바꿈 void resize(int n) { // 기존 메모리 temp에 저장 int* temp = m_data; // n만큼의 메모리 리사이징 m_data = new int[ n ]; // 리사이징된 메모리 크기만큼 기존메모리에서 값의 복사 for ( int i = 0; i < n; i++ ) { m_data[ i ] = temp[ i ]; } m_length = n; // 복사가 완료됐으면 기존 메모리 삭제 delete[ ] temp; } void insertBefore(const int& value, const int& ix) { // 인서트를 위한 새로운 메모리 할당 int* temp = new int[ m_length + 1 ]; // ix에 값이 들어가므로, temp[ix+1] = m_data[ix]의 전달이 이뤄진다. for ( int i = ix; i < m_length + 1; i++ ) { temp[ i + 1 ] = m_data[ i ]; } // 인서트 인덱스에 value 넣기 temp[ ix ] = value; // ix 전까지 기존 밸류 복사 for ( int i = ix - 1; i >= 0; i-- ) { temp[ i ] = m_data[ i ]; } // 기존 데이터 메모리 삭제 delete[ ] m_data; // 새롭게 인서트된 메모리 저장 m_data = temp; // 길이 +1 m_length += 1; } void remove(const int& ix) { // 제거를 위한 새로운 메모리 공간할당 int* temp = new int[ m_length - 1 ]; // 제거할 인덱스(ix)를 기준으로 값의 paste // step1. ix전의 값은 정상복사 for ( int i = 0; i < ix; i++ ) { temp[ i ] = m_data[ i ]; } // step2. ix기준 우측값의 복사 for ( int i = ix; i < m_length - 1; i++ ) { temp[ i ] = m_data[ i + 1 ]; } // 완료됐으면 기존 메모리 삭제 delete[ ] m_data; // 새로운 메모리 저장 m_data = temp; // 삭제됐으므로 길이 -1 m_length -= 1; } void push_back(const int& value) { // 끝자리 추적후에 그 뒤 새로운 메모리공간 할당후 추가하기 // insertBefore(value, m_length)를 하면? insertBefore(value, m_length); } void showAllEle() const { cout << "m_length: " << m_length << endl; cout << "m_data: "; for ( int i = 0; i < m_length; i++ ) { cout << m_data[ i ] << " "; } cout << endl; } }; int main() { IntArray my_arr{1,3,5,7,9}; my_arr.showAllEle(); my_arr.insertBefore(10,1); my_arr.showAllEle(); my_arr.remove(3); my_arr.showAllEle(); my_arr.push_back(13); my_arr.showAllEle(); } 살짝 지저분하지만, 구현에 목적을 두고 최대한 해봤는데 일단 원하는대로 구현이 되는건 확인했습니다. 추가로 문제가 발생할 수 있거나 아쉬운 부분 피드백 을 해주세요! 더 정확하고 깔끔하게 다시 수정해보겠습니다. 또한, 마지막 push_back 함수는 insert랑 기능상 비슷해보여서 insert함수를 재활용 했는데 이 방법또한 괜찮은것인지 아니면 위험한것인지도 답변해주시면 감사합니다
안녕하세요 큰돌선생님. 해당문제를 재귀dp (탑다운) 방식으로 풀어봤는데 잘 풀리지 않아 질문드립니다. 우선 해당문제 조건에 더불어 그냥 동전의 종류를 1, 2, 5로 픽스를 한다고 가정하여 문제를 풀어보았습니다. #include <bits/stdc++.h> using namespace std; int N, dp[100][100][100]; int go(int n1, int n2, int n5, int num) { if (num == N) return 1; int &ret = dp[n1][n2][n5]; if (ret) return ret; if (num + 1 <= N) ret += go(n1 + 1, n2, n5, num + 1); if (num + 2 <= N) ret += go(n1, n2 + 1, n5, num + 2); if (num + 5 <= N) ret += go(n1, n2, n5 + 1, num + 5); return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; cout << go(0, 0, 0, 0) << '\n'; return 0; } dp배열의 원소는 1, 2, 5원 동전의 개수로 잡았고, 동전의 값이 N이 되었을때 return 1을 해주고 경우의수 문제라서 더해주는 방식으로 문제를 풀어보았습니다. 혹시 어떤 부분이 잘못되었나요? 이전 7-E 문제와 유사한 방식으로 풀어보았습니다. 또한 추가로 만약 1, 2, 5원을 픽스하지 않고 해당 문제의 조건 그대로 문제를 해결한다면 선생님께서는 어떻게 문제를 해결하실지 궁금합니다.
http://boj.kr/5d7d83e1069547288f02236c01cc8d5a 위는 정답 코드입니다! 40번째 라인에서 a(인구 지도)를 업데이트 하는 위치가 이중 for문을 벗어난 다음이 되어야 하는 것이 아닌지 문의 드립니다. 이중 for 문 안에서 지도를 업데이트 하게 된다면, 원래라면 이동이 불가능한 지역간의 이동이 가능하게 될것 같습니다. 예를 들어 3 10 11 0 50 40 40 20 30 0 0 0 위와같이 진행한다고 한다면 dfs가 한번돌고 나면 지도가 다음과 같을것 같습니다 0 35 35 40 35 35 0 0 0 이 상태에서 다음 dfs를 돈다면 0 36 36 36 36 36 0 0 0 이 되면서 하루만에 전부 통합되는 상태가 되지 않을까 싶습니다! 실제로 코드를 돌려보면 3 10 11 0 50 40 40 20 30 0 0 0 1 다음과 같이 나옵니다! 정답은 2여야 하지 않을까 싶어서 질문합니다!
안녕하세요 큰돌님, 다름이 아니라 제가 영상에 나왔던 코드를 읽기 편하게 bfs 함수를 따로 함수를 만들어서 예제 입력을 받으면 프로그램이 잘 실행되는데, 제출을 하면 메모리 초과가 뜨네요, 혹시 어떻게 된 경우인지 여쭤보고 싶습니다. 미리 감사합니다! https://www.acmicpc.net/source/share/91f2eb33d6904a5ab55d7d851f317595
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의에서 이세계의 집 주소 별칭을 현실 세계의 도메인으로 빗대어 설명해 주신 부분에 대한 질문입니다. 1. 강의를 들을 때 ' 서울 에 있는 컴퓨터' == 강의를 듣고 있는 내 노트북 , ' 대전 에 있는 컴퓨터' == 인프런 사이트의 서버 쯤으로 이해하는 게 맞을까요? 처음에는 간단하게 친구 컴퓨터와 내 컴퓨터 사이의 카카오톡으로 데이터를 주고 받는 상황 으로 이해 헀는데, '대전에 있는 컴퓨터'의 주소에 도메인 이름이 붙는 걸 보니 이해가 안 가더라구요. 내 컴퓨터에 spring.com 이라는 주소 이름이 붙을리가 없으니까요.친구 컴퓨터와 내 컴퓨터 사이의 카카오톡 통신은 '친구 노트북와 카카오 서버와의 통신' + '카카오 서버와 내 노트북의 통신' 으로 나뉜다고 이해하는 게 맞을까요? 만약 위에서 카카오톡을 예시로 든 내용이 맞는 내용이라면 추가로 더 궁금한 게 있습니다. 채팅 어플에선 어떤 HTTP Method를 사용하나요? 내가 친구에게 카톡을 보낸다면 POST 같은 메소드를 쓸 수 있을 것 같긴한데, 그건 내가 '보내기' 버튼을 이용해서 카카오 서버에 요청하는 것으로 생각해봤습니다. 그런데 친구에게서 오는 카톡 은 어떻게 나에게 오는 건지는 도무지 생각이 나질 않습니다. 내 컴퓨터에서 카톡 서버에 실시간으로 계속해서 GET과 같은 메소드로 요청 을 하는 것은 아닌 것 같아서요. 카카오와 같은 서버가 내 컴퓨터로 요청하는 경우 가 있다면, 내 컴퓨터는 따로 도메인 주소를 갖고 있지 않으니 그냥 내 컴퓨터 IP를 사용 하나요?
import java.util.ArrayList; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] nums = new int[n]; Maininf = new Main(); ArrayList<Integer> answerList = inf.solution(nums); for (int i : answerList) { System.out.print(i + " "); } } public ArrayList<Integer> solution(int[] nums) { ArrayList<Integer> answerList = new ArrayList<>(); answerList.add(nums[0]); for (int i = 1; i < nums.length; i++) { if(nums[i] > nums[i-1]) { answerList.add(nums[i]); } } return answerList; } } 위는 제 코드인데.. IDE에서는 결과가 잘 리턴되는데, 채점 사이트에서 리턴이 자꾸 0으로 나온다고 오답처리합니다..! 문제가 뭔지 모르겠습니다
안녕하세요 선생님~~ 지금까지 모르는거 있어도 그냥 계속 반복해서 보고, log 찍어보면서 해결했는데 flatMap 부분에서 도저히 이해 안 가는 부분이 있어서 이렇게 질문드립니다 ㅠㅠ.. 우선 왜 map을 먼저하는지 모르겠습니다.. 중첩배열을 먼저 평탄화 시켜주고 그 다음 map을 했을때에는 예상치 못한 결과나 에러가 발생하지 않았는데요. map을 먼저 하게 되면 중첩 배열을 받아서 전달된 함수를 실행하는 부분에서 계속 결과값이 이상해 집니다... ㅠㅠ 사실 당연한 결과인데 map이든 L.map이 든 [1,2,[3,4],[5]] 이런 중첩배열을 받아서 순회를 하고 a => a+10 이런 함수를 실행하면 당연히 결과 값이 이상해지는데 선생님 코드에서는 어떻게 제대로 작동 되는 건지 궁금합니다...;; 만약 L.flatMap(a => a, [1, 2, [3, 4], [5]]) 이런식으로 하면 그냥 a를 반환만 하니까 중첩배열이 반환 되고 L.flatten 에서 평탄화 되니까 별문제 없는데 a =>a +10 이런식의 함수를 넘겨주면 결과값이 이상해집니다...ㅠ 뭐가 문제 인지 힌트 부탁드립니다~ const curry = fn => (a, ...args) => args.length ? fn(a, ...args) : (...args) => fn(a, ...args); const reduce = (fn, iter, acc) => { if (!acc) { iter = iter[Symbol.iterator](); acc = iter.next().value; } for (const a of iter) { acc = fn(acc, a); } return acc; } const L = {}; L.map = curry(function* (fn, iter) { for (const a of iter) { yield fn(a) } }); const isIterable = (a) => a && a[Symbol.iterator] L.flatten = function* (iter) { for (const a of iter) { if (isIterable(a)) { yield* a } else yield a } } const map = curry((fn, iter) => { const res = []; for (const a of iter) res.push(fn(a)) return res; }) const take = curry((limit, iter) => { const res = []; for (const a of iter) { res.push(a) if (res.length === limit) return res; } return res; }); const go = (...args) => reduce((a, fn) => fn(a), args); const pipe = (f, ...fn) => (...args) => go(f(...args), ...fn); // L.flatMap L.flatMap = curry(pipe( L.map, L.flatten )); const iter = L.flatMap(a => a + 10, [1, 2, [3, 4], [5]]) console.log(...iter) // 결과값 11 12 3 , 4 1 0 5 1 0