masterpiece-programming의 등록된 링크

 masterpiece-programming로 등록된 티스토리 포스트 수는 269건입니다.

[Swift] 프로그래머스 기능개발(lv. 2) [내부링크]

[Swift] 프로그래머스 기능개발(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42586 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 몇 일 째에 무슨 기능이 배포가 되는 것이 중요한 것이 아니고 '어떤 날에' 배포되는 기능의 '수'를 찾아내야 한다. 주어진 progresses를 100에서 뺀 수를 speeds로 나누면 남은 날이 나올 것이다. 만약 나누어 떨어지지 않으면 하루 더 걸리는 것이고. 이런 생각을 구현해보기 위해 progressingDay 라는 배..

[Swift] 프로그래머스 튜플(lv. 2) [내부링크]

[Swift] 프로그래머스 튜플(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/64065 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 주어진 문자열 s를 잘게 분해해서 원래 표현하려고 했던 튜플을 만들어나가는 문제이다. 처음 문제를 보았을 때, 이해가 잘 되지는 않았지만 순서와 중복에 주의하면서 풀어나가야 겠다는 실마리를 잡을 수 있었다. 주어진 예제 결과 (2, 1, 3, 4)를 보면 이해가 조금은 더 쉽다. {(2), (2, 1), (2, 1, 3), (2, ..

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 4. 면접, 최종결과 편 [내부링크]

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 4. 면접, 최종결과 편 1. 면접을 보기 전까지 1차 합격 발표가 난 후, 준비를 따로하지는 않았다. 몇 가지 후기 아닌 후기를 들어보니 뭐 인싸가 살아남는 면접이다, 준비를 애초에 할 수 없는 면접이라 그냥 편하게 있어라 하는 말들을 많이 했다. 아마 그룹 면접인데 거기서 뭘 하지 않을까하는 추측이 있었지만, 그래도 내 서류는 한 번 더 보고 있으면 좋겠다는 생각에, 면접 보기 한 3일 전에 다시 지원한 서류를 꺼내서 쭉 보았다. 할게 뭐 코딩 공부 밖에 없어서 그 동안은 어플 계속 개발하고 스위프트 공부하고 알고리즘을 공부했다. 편안한 마음가짐과 신체 활동을 해주며 12월 말을 보내고 1월을 맞이했다. 이 생활을 3주간 경..

[Swift] 프로그래머스 위장(lv. 2) [내부링크]

[Swift] 프로그래머스 위장(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42578 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 의상의 종류가 중요하다. 의상의 종류 별로 몇 개가 있는지를 알아보아야 한다. 전체 경우의 수를 알아내는 것이기 때문에, 의상의 종류 별 개수를 모두 곱하고, 모두 입지 않은 경우의 수 1을 빼주면 의상을 입을 수 있는 모든 경우의 수가 나올 수 있다. 첫 번 째 반복문에서는 dictionary를 활용해서 의상 별 아이템의 개수를 ..

[Swift] 프로그래머스 행렬의 곱셈(lv. 2) [내부링크]

[Swift] 프로그래머스 행렬의 곱셈(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12949 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 행렬을 곱하라. 고등학교 이후로 오랜만에 보는 요구 조건이다. (요즘은 안배운다고...) 아무튼 곱셈을 할 수 있는 것만 주어지기 때문에, arr1의 원소들과 arr2의 각 원소의 n번째 원소들을 각각 곱하고 더해서... 새로운 행렬의 값들을 만들어내는 것이다. k번째의 j번째 인덱스들을 서로 곱해서 그 합을 새로운 원소로 ..

[Swift] 프로그래머스 괄호 회전하기(lv. 2) [내부링크]

[Swift] 프로그래머스 괄호 회전하기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/76502 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 괄호가 소, 중, 대괄호 모두 등장하는 괄호문제이다. 올바른 괄호인지를 물어보는 것이 아니라, 문자열을 회전시키면서 그것이 올바른 괄호인지를 판별하고, 그 개수를 리턴해야 하는 문제이다. 문자열의 길이만큼 반복문을 필수적으로 돌아야 하고, 한 번의 반복마다 그 괄호가 올바른지 판별해야 하므로 이중 반복문을 사용해야 할 것 ..

[Swift] 프로그래머스 [1차] 캐시(lv. 2) [내부링크]

[Swift] 프로그래머스 [1차] 캐시(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/17680 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 캐시 교체 알고리즘은 모르기 때문에 따로 구글링을 해서 찾아보았다. https://dailylifeofdeveloper.tistory.com/355 LRU 알고리즘 (Least Recentely Used) 개념 및 구현방법 안녕하세요! daily_D 입니다! c 오늘은 페이지 교체 알고리즘 중에서 LRU에 대해서 공부..

[Swift] 프로그래머스 H-Index(lv. 2) [내부링크]

[Swift] 프로그래머스 H-Index(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42747 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 논문이 인용된 횟수가 주어지는데, 이것을 가지고 'N번 인용된 논문의 개수'를 세고, N회 이상 인용된 논문의 수를 세야 한다. 그렇다면 계수를 활용해서 정렬을 하는 '계수정렬'을 사용하면 될 것이다. 0번 인용된 논문의 수 / 1번 인용된 논문의 수 / 2번 인용된 논문의 수 / 3번 인용된 논문의 수 / ..... 이렇..

[Swift] 프로그래머스 멀리 뛰기(lv. 2) [내부링크]

[Swift] 프로그래머스 멀리 뛰기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12914 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 뭔 문제지... 하다가 1칸일 때부터 5칸일 때까지 일일이 구해보았다. 1칸일 때는 1가지 밖에 없고(1칸) 2칸일 때는 2가지 밖에 없고(1칸 , 1칸 / 2칸) 3칸일 때는 3가지 밖에 없고(1칸, 1칸, 1칸 / 1칸, 2칸 / 2칸, 1칸) 4칸일 때는 위에 예시마냥 5가지 밖에 없고, 5칸일 때는 (1칸, 1칸, 1칸..

[Swift] 프로그래머스 점프와 순간이동(lv. 2) [내부링크]

[Swift] 프로그래머스 점프와 순간이동(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12980 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 건전지로 움직이는 거리를 최소화하려면...? 순간이동을 최대한 많이 하면 된다. 나는 처음부터 쌓아가는 것이 아니라, 거꾸로 distance를 절반 씩 나눠가면서 최소 건전지 사용량을 구하려고 했다. '그리디 문제' 같은 것이므로, distance가 2로 나누어 떨어지면 2로 나누어버리고 answer(건전지 사용량)을 누..

[Swift] 프로그래머스 예상 대진표(lv. 2) [내부링크]

[Swift] 프로그래머스 예상 대진표(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12985 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 배열이 아니기 때문에 쉽게 생각해보면, 1번 선수, 2번 선수 이렇게 변환을 해서 생각을 해보면 접근이 쉽다. 서로 경기를 하기 위해서는 1 - 2 / 3 - 4 / 5 - 6 / .... 이런 식으로 붙어 있어야 경기를 할 수 있다. 2 - 3의 경우는 경기를 할 수 없다고 생각을 하고 이에 맞추어 구현을 하면 될 것 같았..

[Swift] 프로그래머스 N개의 최소공배수(lv. 2) [내부링크]

[Swift] 프로그래머스 N개의 최소공배수(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12953 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 최소공배수를 구하는데, 인자가 두 개가 주어지지 않고 배열로 주어진다. 반복문으로 최소공배수를 찾아주는 로직을 구현해주면 된다. 최소공배수를 찾기 위해서는 최대공약수를 찾아주어야 한다. 두 수의 최소공배수는 두 수의 곱 / 최대공약수 로 찾을 수 있기 때문이다. 아래에서는 lcm, gcd라는 함수로 최소공배수와 최대공약..

[Swift] 프로그래머스 카펫(lv. 2) [내부링크]

[Swift] 프로그래머스 카펫(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42842 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 중앙에는 노란색으로 칠해져있고, 테두리는 갈색인 카펫이라고 했다. 그렇다면, 내부에는 정사각형이든 직사각형이고, 테두리는 1줄로 고정되어 있는 것이다. 그러면 전체 카펫 가로 세로 길이가 각각 x, y라고 한다면, 노란색 부분의 면적은 항상 (x - 2) * (y - 2) 가 된다. 그러면 한 칸의 길이를 1 * 1로 생각하고, 전..

[Swift] 프로그래머스 영어 끝말잇기(lv. 2) [내부링크]

[Swift] 프로그래머스 영어 끝말잇기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12981 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 문제가 길긴 했지만, '탈락하는 사람'이 누구인지, 몇 번 째 턴에서 탈락한 것인지를 구하면 되는 문제이다. 주어지는 String 배열은 이미 진행한 결과로, 누가 틀렸는지를 분석해내는 것이라고 생각하면 쉬울 것 같다. loop, person 변수에는 현재 진행되고 있는 라운드, 현재 단어를 말하고 있는 사람을 계산하여 각..

[Swift] 프로그래머스 짝지어 제거하기(lv. 2) [내부링크]

[Swift] 프로그래머스 짝지어 제거하기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12973 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 짝을 지어 제거하는 것이기 때문에, 스택에 쌓았을 때, 이전에 쌓여있던 것과 새로 들어올 것이 같으면 removeLast()를 활용해서 같은 것들을 골라낼 수 있다. 앞에서부터 없애가는 것이기 때문에 이 방법을 활용할 수 있는 것이다. 마지막에 stack에 어떤 것이 남아있다면, 더이상 제거가 불가능한 것이고, stack..

[Swift] 프로그래머스 다음 큰 숫자(lv. 2) [내부링크]

[Swift] 프로그래머스 다음 큰 숫자(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12911 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 다음 큰 수의 정의는 이진수에서 1의 개수가 같으나, 십진법에 따르면 이전 수보다 더 큰수를 의미한다. 예를 들어 8이 주어진다면, 이진법으로 1000(2) 이고, 그 다음으로 큰 수는 10000(2) 즉, 16이 다음 큰 숫자가 되는 것이다. 일단 1을 카운팅하는 변수를 두고, 현재 숫자에 1을 더하고, 그것을 이진수로 ..

[Swift] 프로그래머스 피보나치 수(lv. 2) [내부링크]

[Swift] 프로그래머스 피보나치 수(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12945 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 피보나치 수는 항이 커질 수록 감당하지 못하는 수로 발전하는 측면이 있다. n이 10만까지 주어지기 때문에 이 부분을 잘 생각해야 한다. 문제에서는 1234567로 나눈 나머지를 반환하라고 했는데, 여기서 중요한 것은, 항상 An+1 항을 구할 때마다 1234567로 나누는 것과 구하고자 하는 An 항을 모두 구하고 나서 1..

[Swift] 프로그래머스 이진 변환 반복하기(lv. 2) [내부링크]

[Swift] 프로그래머스 이진 변환 반복하기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/70129 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 반복의 횟수는 모르겠지만, 주어진 조건 1, 2 대로 계속 숫자를 깎아서 결국 "1"이 될 때 까지 내부의 반복문을 몇 번을 거쳤는지만 파악하면 된다. while문을 활용하여 없어진 0의 개수를 count 하여 누적합 처리하고, 필터를 사용하여 "1"로만 구성되게 한 다음, 그 문자열의 길이를 다시 이진수로 변환하는 ..

[Swift] 프로그래머스 올바른 괄호(lv. 2) [내부링크]

[Swift] 프로그래머스 올바른 괄호(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12909 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 lv. 2 초반이라 lv. 1보다 쉬운 레벨의 것이 나오기도 한다. 스택의 개념을 잘 생각하면 풀 수 있는 문제이다. 스택으로 해서 직접 괄호를 넣었다 뺐다가 할 수도 있지만, count 개념을 넣어서 할 수도 있다. "(" 가 들어오면 +1을 하고, ")"가 들어오면 -1를 하는 것. 그런데 전체적으로 합쳐지면 ")("도 ..

[Swift] 프로그래머스 최솟값 만들기(lv. 2) [내부링크]

[Swift] 프로그래머스 최솟값 만들기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12941 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 열심히 만들면 된다. 한쪽은 오름차순으로 정렬하고, 한쪽은 내림차순으로 정렬해서 차례로 곱한 값을 누적하여 합하면 된다. 나는 주어진 A를 오름차순 정렬하고, B를 내림차순 정렬했다. innerA의 값을 직접 바꾸는 방법으로 메모리를 더 쓰는 것을 방지해보았다. enumarated()를 사용하여 인덱스와 원소를 함께 불러서..

[Swift] 프로그래머스 JadenCase 문자열 만들기(lv. 2) [내부링크]

[Swift] 프로그래머스 JadenCase 문자열 만들기(lv. 2) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12951 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 첫 문자만 대문자이고, 나머지는 소문자인 문자열을 만들면 된다. 숫자가 맨 처음 문자이면 숫자는 그대로 쓰면 된다. 문자열 처리하는 문제이기 때문에, components를 잘 활용하고, 첫 문자가 문자인지 숫자인지 구별해서 잘 처리해주면 된다. 만약 첫문자가 숫자라면, 단순히 lowercased()로만 해..

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 3. 특별한 점, 온라인 테스트편 [내부링크]

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 3. 특별한 점, 온라인 테스트 편 1. 특별한 점 지원서류를 마무리하고 나니 마지막으로 남은 것이 있었다. 250 단어 분량의 나의 특별한 점 소개하기. 이것은 제출하지 않아도 무방하다고 했지만, 솔직히 선택이라고 하는데, 적을 수 있는 거면 적어야 한다고 본다. 할 수 있는 것은 모두 해봐야 하지 않겠나... 그래서 이런 특이한 문항을 받아 들고, 무엇을 써볼지 고민해 보았다. 난 호기심이 너무나 많다. 많은 것들에 발을 담가보기도 하고 속칭 찍먹을 많이 하기도 하는 사람이다. 호기심을 가지고 재미있게 살아가는 사람이라는 것을 어필을 해보고자 했다. 개인적인 부분이 들어가 있어서 완벽하게 공개하지는 못하지만, 진심이 담긴 나..

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 2. 포트폴리오 편(포트폴리오 공개) [내부링크]

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 2. 포트폴리오 편(포트폴리오 공개) 0. 개발자 포트폴리오는 어떻게 써야 하나? CV를 다 썼으니, 이제 또 다른 제출서류인 포트폴리오를 작성해야 한다. 일단 포트폴리오, 어디서 많이 들어보긴 했는데 거기엔 무엇이 들어가고 어떻게 써야 하는 것일까...? 일단 작성에 들어가기 전에 개발자 포트폴리오를 구글링 해보았다. 디자이너 포트폴리오는 프로젝트 위주로 설명하듯이 하는 것이니까... 개발자 포트폴리오는 뭔가 다른가 해서 써어칭을 충분히 해보았다. 찾아보다 보니, 포트폴리오라는 게 그다지 직종별로 다른 것 같지는 않았다. 어떤 상황 별로 형식은 달라지는 것 같았다. 예를 들면 지원 회사가 원하는 양식, 분위기? 하지만 공통적으..

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 1. CV 편(CV 공개) [내부링크]

Apple Developer Academy 2기 '테크' 지원 합격 후기 - 1. CV 편(CV 공개) 0. Apple Developer Academy를 알게 되다. 2022년 10월이었다. 한창 멋쟁이 사자처럼 1기 백엔드 스쿨의 1차 팀 프로젝트를 끝내고 마지막 프로젝트를 하고 있었다. 자바 그리고 스프링부트와 친해치고 있었고, 이제 어색한 감이 갓 사라졌던 그 때, 팀 프로젝트를 했던 팀원 중에 한 분이 멋사 끝나고 뭐할꺼냐고 물어보았다. '잘 모르겠네요... 취업하지 않을까요?' 'SSAFY 삼수 해봐야 하나...?' '진짜 아무데나 취직을 해야하나...?' 팀원은 나에게 맥북과 아이폰을 쓰는 것을 보고 '애플 디벨로퍼 아카데미'라고 있는데 애플에서 하는 교육기관이라고 있는데 싸피랑 비슷하게 교육..

[Swift] 프로그래머스 개인정보 수집 유효기간(lv. 1) [내부링크]

[Swift] 프로그래머스 개인정보 수집 유효기간(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/150370 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 Swift 기준으로 가장 최근에 나온 lv. 1 문제이다. 2023 카카오 블라인드 채용 문제로 등장한 문제이다. 날짜 처리가 관건일 줄 알았는데, 그건 아니었고, 모든 달이 28일로 되어 있다고 가정을 하는 바람에 문제가 좀 더 쉬워졌다. 문자열을 마침표를 기준으로 분해하고, 오늘을 기준으로 문서 작성일로부터 ..

[Swift] 프로그래머스 신고 결과 받기(lv. 1) [내부링크]

[Swift] 프로그래머스 신고 결과 받기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/92334 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 '메일'이 보내진 횟수를 세야하는 것이 포인트이다. 한 사람이 동일 유저를 신고하는 것은 1회로 처리한다는 점도 유의해야 한다. 그래서 reportCount 딕셔너리에는 id를 key로, set을 value로 만들어 신고한 사람이 총 몇 명인지 셀 수 있게 해주었다. mailCount는 reportCount의 set의 크..

[Swift] 프로그래머스 햄버거 만들기(lv. 1) [내부링크]

[Swift] 프로그래머스 햄버거 만들기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/133502 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 무엇인가 쌓여가는 모습이기 때문에 스택을 활용하여 푸는 방법을 택했다. 스택에 4개 이상의 원소가 들어왔을 때, 순서대로 1, 2, 3, 1 인지를 보고, 만약 맞다면, 그 순서를 제외한 스택만을 남겨놓고 answer에 누적합을 더하게 된다. 모든 반복을 거치면 답변이 구해져 있을 것이다. 3. 코드 import Foun..

[Swift] 프로그래머스 문자열 나누기(lv. 1) [내부링크]

[Swift] 프로그래머스 문자열 나누기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/140108 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 두 가지를 세주면 된다. 특정 글자가 나오는 횟수, 특정 글자가 아닌 것이 나오는 횟수. 그리고 문자열을 분리할 때마다, 그 횟수를 다시 세는 것이 필요하다. 아래 코드에서 반복문의 첫 번째 if문은 s의 끝까지 모두 반복이 끝났을 경우, 남아있던 배열을 답변 배열에 넣어주는 역할을 한다. 두 번째 if문은 count1,..

[Swift] 프로그래머스 성격 유형 검사하기(lv. 1) [내부링크]

[Swift] 프로그래머스 성격 유형 검사하기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/118666 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr (문제가 개길다....) 2. 접근 문제가 너무 길어서 읽다가 포기할 뻔 했다. 하지만 천천히 읽어보다 보니, 그다지 어려운 것이 아니라, 딕셔너리를 활용해서 적절하게 값을 바꿔주고, 점수만 세주면 되는 것이었다. 4점 이라면, 패스를 하고, 4점 미만이라면, 4 - i 만큼의 숫자를 더해주고, 4점 초과라면 i - 4 만큼의..

[Swift] 프로그래머스 옹알이 (2)(lv. 1) [내부링크]

[Swift] 프로그래머스 옹알이 (2)(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/133499 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 lv. 0의 옹알이 (0)과 비슷한 문제인데, '연속해서 발음'하는 것을 하지 못한다는 것을 유의해야 한다. 그래서 옹알이 (0)에서는 replacingOccurrences(of: "aya", with: "1")로 모두 치환을 하였지만, 여기에서는 각각 1, 2, 3, 4로 치환해주었다. 아래 코드에서 반복문과 map 함..

[Swift] 프로그래머스 신규 아이디 추천(lv. 1) [내부링크]

[Swift] 프로그래머스 신규 아이디 추천(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/72410 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 주어진 대로 단계별 처리를 해주도록 필터나 맵을 써주면 되는 문제였다. 다만, 4, 5단계를 마치고 난 후 6, 7단계에서 특정 문자를 지웠는데, 마침표가 남아있어서 통과가 안 되었었다. 그래서 6, 7단계를 거치다가 마지막 문자가 마침표일 경우, 한 번 더 removeLast()를 해주는 것으로 보완을 하였다. 구현 ..

[Swift] 프로그래머스 기사단원의 무기(lv. 1) [내부링크]

[Swift] 프로그래머스 기사단원의 무기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/136798 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 약수의 개수를 세는 로직이 가장 중요하다. number가 10만이기 때문에 O(N) 시간으로 약수를 찾으면 타임 오바가 난다. 여기서는 루트까지만 약수의 개수를 셌다. 약수를 세려고 전체를 세지 않아도 되기 때문이다. 예를 들어보자면, 16의 경우 1, 2, 4, 8, 16 이렇게 약수가 존재하는데, 16을 1, 2, ..

[Swift] 프로그래머스 크레인 인형뽑기 게임(lv. 1) [내부링크]

[Swift] 프로그래머스 크레인 인형뽑기 게임(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/64061 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 포인트 1) 각 캐릭터는 숫자로 표시되며, 숫자가 같으면 같은 캐릭터이다. 이차원 배열로 입력이 주어지고, moves로는 특정한 열의 위치가 주어져 있다. 한 번의 반복마다 그 열로 가서 '인형을 뽑거나 허탕을 쳐야'한다. 포인트 2) 예시 설명에서 맨 오른쪽에 있는 부분이 스택과도 같다. 그렇다면, moves가 만..

[Swift] 프로그래머스 키패드 누르기(lv. 1) [내부링크]

[Swift] 프로그래머스 키패드 누르기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/67256 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 문제를 잘 읽어보면 왼쪽의 1, 4, 7은 왼손으로, 오른쪽의 3, 6, 9는 오른손으로 필히 누르게 되어 있다. 그렇다면, 2, 5, 8, 0을 누를 때의 규칙만 잘 정해주면 된다. 2, 5, 8, 0을 눌러야 할 때는 양손 중에 "그 버튼과 현재 가까이 있는 위치의 손으로 누른다"라고 하였다. 그러면 현재 위치를 계속 ..

[Swift] 프로그래머스 숫자 짝꿍(lv. 1) [내부링크]

[Swift] 프로그래머스 숫자 짝궁(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/131128 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 "두 수에서 공통된 숫자를 모아서 가장 큰 수를 만들어라" 요약하면 이렇게 된다. 그러면 0~9까지의 수만 하나씩 필터링 하면서 세면 되지 않을까? 그리고 나중에 이 숫자를 다시 내림차순으로 정렬해야 하는데, 그 개수를 index로 활용해서 세면 되지 않을까? 라는 생각이 들었다. 정렬의 방식 중 계수 정렬이 떠올랐고, 이를..

[Swift] 프로그래머스 명예의 전당 (1)(lv. 1) [내부링크]

[Swift] 프로그래머스 명예의 전당 (1)(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/138477 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 honorList 라는 배열의 크기가 k가 넘지 않게끔 조절해주면서, 매번 내림차순으로 정렬하면서 마지막 인덱스의 원소를 계속 구해주면 되는 문제였다. honorList의 크기가 3이 되는 순간부터, 마지막 숫자가 score[i] 보다 작다면, honorList의 마지막 수를 새로운 score[i]로 바꾸고 sort..

[Swift] 프로그래머스 체육복(lv. 1) [내부링크]

[Swift] 프로그래머스 체육복(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42862 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다. 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다. 이 두 가지 조건을 가볍게 보았다가 한 번 코드를 쓰고 엎었다. 여벌이..

[Swift] 프로그래머스 과일 장수(lv. 1) [내부링크]

[Swift] 프로그래머스 과일 장수(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/135808 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 처음 문제를 봤을 때 단순히 내림차순으로 하여 m개 만큼 쌍을 지어 묶으면 된다고 생각했다. 어느 쌍에서 [가장 작은 수 * m] 한 것을 누적합하면 result를 얻을 수 있을 것이라 생각했다. 아래 코드에는 sortedScore에 내림차순된 score가 들어가 있다. 그리고 순회를 돌면서 tempArray에 sortedS..

[Swift] 프로그래머스 로또의 최고 순위와 최저 순위(lv. 1) [내부링크]

[Swift] 프로그래머스 로또의 최고 순위와 최저 순위(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 0은 당첨 번호로 맞춰놓거나 틀린 번호로 할 수 있다. 다른 말로 바꿔보자면, 0이 있는지 없는지에 따라서 Rank가 달라질 수 있다는 것. 리턴할 최고 순위와 최저 순위는 0이 포함된 갯수를 빼거나 더해서 나오게 된다. 순위는 참고로 숫자가 낮을 수록 높은 것이다. 이를 고려해서 반복문을 구성해야 한다. ..

[Swift] 프로그래머스 가장 가까운 같은 글자(lv. 1) [내부링크]

[Swift] 프로그래머스 가장 가까운 같은 글자(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/142086 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 현재 인덱스와 이전 인덱스를 잘 구분해서 계산하면 된다. comeout 이라는 array에는 한 번이라도 등장했던 Character를 집어넣는다. 이것과 비교하여 index 차이를 answer에 집어넣거나, -1을 집어넣는다. 등장한 것과 등장하지 않은 것을 잘 구분하면 된다. 3. 코드 import Founda..

[Swift] 프로그래머스 [1차] 다트 게임(lv. 1) [내부링크]

[Swift] 프로그래머스 [1차] 다트 게임(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/17682 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 문제를 잘 이해하는 것이 중요했다. 1 ~ 9 사이의 순서에 따라 주어진 것을 정확하게 구현해내면 어려움 없이 구현할 수 있는 전형적인 구현 문제였다. dartResult를 한 Character로 끊어서 읽고, 숫자 또는 문자라면 그 안에서 적절하게 분기를 해주고, 만약 그 둘이 아니라면 * or # 이므로 그에 따라..

Github Readme Stats 버그 해결(file an issue at https://tiny.one/readme-stats) [내부링크]

Github Readme Stats 버그 해결(Something went wrong! file an issue at https://tiny.one/readme-stats) 어제부터인가 깃허브에 들어가서 프로필을 봤는데 갑자기 이런 오류문을 발견할 수 있었다. 몇 문제 풀었는지 어떤 언어를 제일 많이 쓰는지를 시각적인 정보로 알려주는 github-readme-stats에 어떤 버그가 생긴 것인가 하고 해결 방법을 알아보았다. 깃의 어떤 정책이 바뀐 것인가... 아니면 라이브러리 자체의 문제인가 했는데, 깃이슈에서 해결 방법을 알 수 있었다. 이 사람들도 깃의 문제이긴 한데 무엇이 문제인지는 잘 모르는 듯... ** 해결방법 1) readme stats가 있는 MD 파일을 연다. 레포에서 본인의 이름으로 만..

[Swift] 프로그래머스 푸드 파이트 대회(lv. 1) [내부링크]

[Swift] 프로그래머스 푸드 파이트 대회(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/134240 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 공정하게 왼쪽, 오른쪽이 구분되므로 먼저 왼쪽의 문자열을 먼저 구하고, 오른쪽의 배열은 왼쪽의 배열을 reversed() 한 다음 0을 기준으로 붙이면 되겠다는 생각을 했다. leftSideArray를 만들고 거기에 food[i]의 절반 만큼만 Character(String(i))를 append 해주었다. 순차적으로 ..

[Swift] 프로그래머스 실패율(2019 KAKAO Blind Recruitment)(lv. 1) [내부링크]

[Swift] 프로그래머스 실패율(2019 KAKAO Blind Recruitment)(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42889 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 실패율의 정의를 충분하게 읽으면 된다. "스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어의 수" 주어진 배열 stages는 현재 사용자가 멈춰있는 스테이지의 번호가 담겨있다. 그렇다면, 각 스테이지 별로 몇 명의 사람이 멈춰있는지를 세고,..

[Swift] 프로그래머스 - 모의고사(lv. 1) [내부링크]

[Swift] 프로그래머스 - 모의고사(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42840 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 다들 찍는 패턴이 다르기 때문에 하나의 패턴을 상수로 지정해주었다. 그런 다음 answer과 그 상수들을 비교하여 점수를 리턴해주고, 배열을 정렬해서 차례로 뽑아주면 되겠다는 생각을 했다. calculateScore 함수는 answers와 student를 인자로 받는다. answer는 전체 원소를 순회하고, student는 ..

[Swift] 프로그래머스 소수 찾기(lv. 1) [내부링크]

[Swift] 프로그래머스 소수 찾기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12921 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 소수를 판별하는 것이 아니라 주어진 수보다 작은 자연수 중에서 소수가 몇 개 인지를 구하는 문제이다. n개의 원소를 가지는 배열을 만들어서 차례로 올라가는 수를 numArray에 세팅해준다. 그런 다음 numArray를 순회하는데, 여기서 중요한 것은 전부를 순회하게 되면 시간초과가 난다는 점이다. n이 100만이기 때문에 n..

[Swift] 프로그래머스 콜라 문제(lv. 1) [내부링크]

[Swift] 프로그래머스 콜라 문제(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/132267 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 콜라를 먹으면서 글을 쓰고 있다. 콜라는 좀 기계들이 무한 생산하여 무료로 제공되었으면 좋겠다. 무튼 이 문제에서는 빈병과 먹은 콜라 수를 잘 나누어 갈라야 한다. 반복의 횟수를 알 수 없기 때문에 while문을 활용하면 될 것이다. 코드의 설명은 아래와 같다. 만약 빈 병의 개수가 a로 나누어 떨어진다면, 먹은 콜라는 (빈..

[Swift] 프로그래머스 2016년(lv. 1) [내부링크]

[Swift] 프로그래머스 2016년(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12901 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 여러 해를 구하는 것이 아니고 2016년 안의 일자를 구하는 것이기 때문에 상수만 잘 설정해주면 된다. 1월이면 totalDay(일자를 내부 변수로 받은 것)에 4를 더해서 7로 나눈 나머지를 구한다. weekArray의 인덱스에 따라 요일이 출력되는데, 1일이 목요일이었기 때문에 이렇게 설정하였다. 나머지 달의 경우, '요일..

[Swift] 프로그래머스 두 개 뽑아서 더하기(lv. 1) [내부링크]

[Swift] 프로그래머스 두 개 뽑아서 더하기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/68644 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 순서 상관 없는 두 수를 더한 값을 중복 없이 구하면 된다. Set을 사용하여 두 원소를 합한 값을 계속 집어넣고, 모든 배열 순회가 끝나면, Set을 Array로 바꿔주고 sorted() 하여 return 하면 된다는 생각을 하였다. 중복 없음 = Set 을 떠올리고 Set -> Array 변환이 용이하다는 사실을..

[Swift] 프로그래머스 숫자 문자열과 영단어(lv. 1) [내부링크]

[Swift] 프로그래머스 숫자 문자열과 영단어(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/81301 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 옹알이에서 사용했던 replacingOccurrences 그리고 dictionary를 사용하면 쉽게 풀 수 있다. 아래 코드에서는 dict를 두고 상수로 사용하고 있으며, innerS를 두어 내부의 문자들을 바꿀 수 있도록 하였다. 그러고 마지막에 리턴은 Int로 해주면 쉽게 할 수 있다. 문제만 길다; 3. 코드 ..

[Swift] 프로그래머스 K번째 수(lv. 1) [내부링크]

[Swift] 프로그래머스 K번째 수(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42748 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 어떤 배열을 i번째부터 j번째까지 잘라서 오름 차순 정렬을 하고 그 중 k번째 숫자를 구해라. 말 그대로입니다. 임시 배열을 반복문 안에 두고, 거기에 i번째부터 j번째까지 원소를 담고 정렬을 해서 k번째 수를 answer 배열에 담아서 최종 출력해주었다. 3. 코드 import Foundation func solution(_..

[Swift] 프로그래머스 문자열 내 마음대로 정렬하기(lv. 1) [내부링크]

[Swift] 프로그래머스 문자열 내 마음대로 정렬하기(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12915 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 일단 접근은 쉽다. n번째 인덱스를 기준으로 정렬하라는 것. 마지막 입출력 예를 보면 오름차순 정렬을 기본으로 해야 한다는 것을 알 수 있다. 그럼 먼저 오름차순 정렬을 하고, 그 다음에 새로 n번째 인덱스를 기준으로 정렬을 해주면 된다는 생각을 했다. sorted(by:) 함수는 파라미터에 쓰여있는 기준에 ..

[Swift] 프로그래머스 삼총사(lv. 1) [내부링크]

[Swift] 프로그래머스 삼총사(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/131705 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 삼총사... 세 개의 원소를 가지고 해야 한다. 주어지는 number의 배열의 길이가 최대 13이므로 4~5중 반복문도 상관없으니 삼중반복을 통해 3개의 원소를 고르는 경우의 수를 모두 찾아 더해주면 되는 '간''단'한 문제이다. 원소의 순서는 상관이 없으니 '조합'이다. 그렇기에 앞에서부터 차례로 반복문을 돌려주면 되고, 이중..

[Swift] 프로그래머스 비밀지도(lv. 1) [내부링크]

[Swift] 프로그래머스 비밀지도(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/17681 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 이 문제는 이해는 됐는데, 어떤 식으로 연산해야 할 지 생각하는데 오래걸렸다. 뭔 연산을 하면 있는곳 없는곳 나오는 그게 있으니까 문제를 냈을 껀데, 이게 그 비트연산인가 하는 개념어만 생각나고 어떻게 풀 지 감이 안왔다. 그래서 비트 연산을 구글 선생님을 통해 개념 정리를 하고, 그제야 쉽게 풀 수 있었다. 아래 코드 5번 라..

[Swift] 프로그래머스 최소직사각형(lv. 1) [내부링크]

[Swift] 프로그래머스 최소직사각형(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/86491 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 전체를 비교해봐야 하나 잠시 머리가 아팠지만, 이차원 배열로 주어져있고 명함은 가로로 꽂으나 세로로 꽂으나 상관없는 것이라는 것을 캐치했다. 주어진 배열은 가로, 세로로 주어졌지만, 결과값 뽑아내는 입장에서는 그게 가로인지 세로인지 전혀 중요하지 않다. 이차원 배열 내부의 원소로 있는 배열이 내림차순으로 정렬되어 있다면, s..

[Swift] 프로그래머스 시저 암호(lv. 1) [내부링크]

[Swift] 프로그래머스 시저 암호(lv. 1) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12926 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2. 접근 영어 대, 소문자, 공백밖에 없기 때문에 AsciiValue를 사용하면 되겠다는 생각을 했다. 대문자 A가 asciiValue int로 65이고, 소문자 a가 97이기 때문에, 이 수를 빼서 생각하면 되고, 나머지 공백은 -1로 하여 별도로 처리하면 되겠다는 생각을 했다. 아래 코드의 반복문에서는 input을 순환하여 돌면서 ..

[Swift] 프로그래머스 옹알이(1) (lv.0) [내부링크]

[Swift] 프로그래머스 옹알이(1) (lv.0) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/120956 0렙에서 가장 정답률이 낮은 문제이다. 문자열 처리를 요구하는데, Swift에 있는 replacingOccurrences() 함수를 활용하면 그렇게 어렵지 않게 풀 수 있다. 2. 접근 어떤 문자열이 주어지든 간에 말할 수 있는 발음은 네 가지 밖에 없고, 각 문자열에서 최대 한 번씩만 등장하기 때문에 replacingOccurrences(of:with:)를 활용하면 된다. https://developer.apple.com/documentation/foundation/nsstring/1412937-replacingoccurren..

[Swift] 프로그래머스 평행(lv. 0) [내부링크]

[Swift] 프로그래머스 평행(lv. 0) 1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/120875 2. 접근 두 점을 공통으로 지나는 '일차함수'를 생각해보았다. 선분을 일차함수로 생각해본다면, 두 점 사이의 기울기를 비교하고 그 기울기가 같으면 1을 리턴하고 그렇지 않으면 0을 리턴하면 된다. (x1, y1), (x2, y2) 좌표가 있을 경우, 그 기울기는 아래와 같다. 기울기 = (y1 - y2) / (x1 - x2) 모든 좌표를 서로 대조해보아야 하기 때문에, 반복문을 돌면서 모든 점들의 기울기 쌍을 구해본다. 아래에서는 tempDotsArray 라는 dots의 원소 타입을 Double로 바꾸어 배열을 만든다. 이중 반복문을..

[iOS] unrecognized selector sent to instance [내부링크]

셀렉터 인스턴스가 메서드에 제대로 전달되지 않을 때 생기는 오류이다. 특정 버튼을 만들거나 했을 때, 그 안에서 액션이 되어야 한다. 그런데 그 메서드 명이 정확하지 않거나, 아니면 IBAction 같은 메서드가 두 개가 중복해서 달려 있을 경우, 이러한 오류를 만나볼 수 있다. 실제로 View에 연결되어 있는 것은 btnLightOn 이지만, 나의 경우 메서드 명을 바꿔보았는데, 바로 빌드에 실패하였다. 다시 메서드명을 바꿔주니 잘 되었다. 위의 켜기 창은 뷰 화면에서 특정 문제가 되는 부분 위에 커서를 두고 우클릭을 하면 된다. 만약 걸려있는 액션이 두 개라면, 하나를 삭제해주면 실행이 잘 될 것이다.

부산시립미술관, 부산 여행기 [내부링크]

부산시립미술관, 부산 여행, 너무 늦은 방문기 너무나 늦은 방문기이다. 부산시립미술관에 방문을 하고 왔'었'다. 아무것도 모르는 내가 가서 봐도 굉장히 좋은 작품들이 많았어서 기록해보고자 포스팅을 해보고자 한다. 또한 늦은 꼽사리 부산 여행기도 같이... 1. 동해선이 개통한 어느 날.... 나의 홈타운은 돌고래가 넘실대며 화학 공장들이 산업의 결실들을 내뿜어 대는 울산이다. 얼마 전 갔을 때 부산과 이어지는 Metro가 이어지는 굉장히 감격적인 순간을 맞이했기 때문에 내가 안 갈 수가 없었다. 그래서 한 번 이용해보았다. 아아.. 그 빌런들이 가득한 수도권의 1모 호선과 같은 행색을 하고 있는 태화강역의 플랫폼을 볼 수 있었다. 내가 2013년에 해운대를 가려고 했던 그 플랫폼과 너무 달라져있었다. 2..

[retrospec] EatTwoGetter 프로젝트 종료...? [내부링크]

[retrospec] EatTwoGetter 프로젝트 종료...? 1. 프로젝트를 마치며...? 9월 30일, 프로젝트 발표가 끝났다. 배운 것들을 열심히 써먹어보고, 안 배운것도 수입해서 되게끔 맞춰가는 것을 경험하는 좋은 시간이었다. 더불어 협업, 협업 하던 것들도 실제로 부딪혀보고 어떤 충돌이 일어나는지, 무엇이 힘든 부분인지 경험할 수 있었다. 다 만들어놓고 나니, 생각해볼 것도 있고 기록해볼 것도 있어서 포스팅을 해보려고 한다. 그리고 '이것이 프로젝트의 끝일까...?'라는 생각도 해보고자 한다. 2. 프로젝트를 진행하며 일어났던 일 1) 서비스 아이디어 변경 처음 아이디어는 금융 용어 사전이었다. 한 이틀 간 이 서비스를 어떻게 구현할 것인지 고민하다가, 새로운 아이디어가 나오게 되었다. 지도..

[Github] Not possible to fast-forward, aborting [내부링크]

[Github] Not possible to fast-forward, aborting 첫 번째 프로젝트를 얼렁뚱땅 끝내 놓고 무엇을 했는가, 부족한 부분이 무엇이었나, 얻은 것은 무엇인가, 어떤 방향으로 나가 봐야 하나 생각하고 있는 중이다. 그 가운데 깃을 가지고 협업을 할 때, 무엇인가 꼬이고 자꾸 원격 레포에서 내 푸시를 안 받아주고, pull을 당겨오니 내 것이 사라져 있어서 복구를 또 하고 해야 했던 기억이 떠올랐다. 많은 삽질이 있었지만, 깃은 협업 도구이다. 내 코드를 더 양산해주지는 않기 때문에 "어 됐다!" 하면 넘어갔었어서 더욱 기억과 기록이 남지 않았던 부분이기도 하다. 희미하게나마 존재하던 에러들을 끌어모아 모아 문제를 해결할 수 있는 방법을 기록해보고자 한다. 세 가지 부분 모두 ..

[IntelliJ] 인텔리제이 깃허브 연동 사용 활용 방법 [내부링크]

[IntelliJ] 인텔리제이 깃허브 연동 사용 활용 방법 깃허브에 혼자 깃 작업을 진행할 때는 따로 신경을 쓰지 않는 깃 히스토리. 그렇지만 협업을 진행할 때는 남들이 얼마나 작업을 진행했는지, 병합이 어디에서 진행되었는지를 잘 알아야 협업에 있어서 충돌이 덜 할 수 있다. 초보 개발자들은 자바, 스프링, js, .... 할 것은 많고 배울 것은 너무나 많은 데, 깃 까지 배워가면서 협업을 해야 하는가... 회의감이 들 수 있다. 그렇지만, 이것을 간단하게 해주는 것이 있다. 인텔리제이를 쓰면, 소스트리와 같은 GUI 환경을 보여주는 프로그램을 사용하지 않아도, 이력을 확실히 볼 수 있고, 그 안에서 checkout, pull, fetch-merge 등이 가능하다. 또한 merge-conflict를 해..

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 3(Lightsail) [내부링크]

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 3(Lightsail) 이것이 마지막이다... 이번 편에서 다룰 것은 DB 연결 / SSL(HTTPS 연결) 이다. 이것만 끝나면, 정말 정상적인 웹 서비스를 배포, 구동할 수 있다. 먼저 쉬운 HTTPS 연결부터 해보자! 1. HTTPS 연결(Let's Encrypt 설치) HTTPS가 필요한 이유는 이 포스팅을 찾아들어온 사람들이라면 알 것이다. 데이터 암호화에 필요하며, 나 같은 경우에는 카카오맵 API를 가져다 쓰는 프로젝트를 했는데, HTTPS 연결이 되지 않으면 제대로 데이터를 가져다 쓸 수 없었기 때문에 꼭 필요하였다. 기타 소셜 로그인도 HTTPS 연결을 필요로 하는 것들이 많을 것이다. 그만큼 배포에 필요한 것이 HTTPS ..

[Apple Developer Academy] 오픈데이 신청 [내부링크]

[Apple Developer Academy] 오픈데이 신청 부트캠프가 끝나면 과연 무엇을 할 것인가를 고민해보았다. 과연 스프링, 코프링으로 확실하게 나의 길을 다져갈 것인가...? 취직은...? 아니 공부를 더 해야 되나...? 나 같은 경우에는 정말 짧은 개발 경험을 가지고 있고, 아직도 배워야 할 것이 너무나 넘쳐나며, 아직 배운 것을 매끄럽게 소화해서 적절한 코드를 짜낸다고 할 수도 없는 것 같다. 그러다 발견한 Apple Developer Academy 이번 부트캠프에서의 프로젝트를 진행하다보니, 생각보다 내가 백엔드의 수 많은 데이터 처리와 정리에 엄청난 흥미를 느끼는 것은 아니라는 결론을 가질 수 있었다. 그래서 좀 더 선택의 폭을 넓혀보고자 내년 3월부터 시작하는 Apple Develop..

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 2(Lightsail) [내부링크]

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 2(Lightsail) 이전 편에서는 정말 라이트세일에 가입하고, 서버를 생성하고 기본적인 연결을 해보았다. 이번 편에는 파일질라를 통해 스프링부트 jar 파일을 옮기고, MySQL 서버와 연동하고, ssl, 도메인등록까지 하여 https://(본인 도메인).com 으로 접속했을 때, 데이터베이스를 활용하는 스프링부트 홈페이지를 남들이 볼 수 있게끔 배포를 완성해볼 것이다. 내가 사용한 환경은 다음과 같다. 로컬 환경 : Mac OS 12.6 / Filezila 3.60.2 / Workbench 8.0.29 / InteliJ 서버 환경 : ubuntu 20.04 / java 17 / mysql 8.0.30 / 1. 서버로 파일 전송하고 실행..

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 1(Lightsail) [내부링크]

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 1(Lightsail) 1. 왜 EC2가 아닌 라이트세일인가? EC2는 회사에 인프라 관리자가 있거나 자신이 가상 서버, 네트워크, 디스크 볼륨, 보안 그룹 등의 관리를 하드하게 해야할 때 상대적으로 더 적합하다. 상세 설정을 통해서 비용이든 성능이든 이득을 얻을 수 있는 환경에서 일하고 있다면 EC2와 관련 서비스들의 유연한 환경설정은 큰 장점이기 때문이다. 또한 EC2는 네트워크 트래픽보다는 CPU 연산 위주의 프로젝트를 돌릴 때 더 유리하다. 무엇보다 서버를 껏다 켰다 하면서 과금되는 시간을 조절할 수도 있다는 온디멘드 방식은 매우 매력적인 옵션이다. 그러나 뒤집어 이야기하면 세팅 하려고 정작 개발을 못하고 인프라 관리하는 시간이 더 ..

[CentOS]MariaDB 도커 라이즈 간단한 방법 [내부링크]

[CentOS] MariaDB 도커 라이즈 간단한 방법 도커 학습을 하고, 간단히 정리해본 것이다. hostOS(CentOS) 안에 있는 도커에 세 가지를 넣는다. mysql, spring boot, nginx를 설치할 것이다. 만약 site3.com 이라는 요청이 들어오면, nginx가 sb로 토스를 해주고, 스프링 부트와 mysql을 host os 어딘가에 있는 포트를 경유해서 접근할 수 있도록 하는 방법을 학습해본다. 이 과정은 도커가 먼저 hostOS에 설치되어 있어야 한다. 1. 현재 서비스 삭제 OS 내부에 있는 DB 충돌을 없애기 위해 mariadb를 재설치한다. sudo yum remove mariadb sudo rm -rf /var/lib/mysql : 잔존 데이터 삭제 sudo rm -..

[UTM] M1 Mac에 Windows 11 설치하기 [내부링크]

[UTM] M1 Mac에 Windows 11 설치하기 나는 M1 macbook pro 13인치를 사용하고 있다. 이전에는 윈도우를 사용해야 하는 상황이 있었지만, 맥에 적응하고 나니 1년에 몇 번 정도만 윈도우가 필요했다. 거의 필요성을 못느낀다. PC 게임도 하지 않기 때문에 거의 윈도우와 마주칠 일이 없다. 윈도우는 까맣게 잊고 살았지만, 최근 인프라 수업을 들으면서 심심해진 내가 윈도우를 다시 불러냈다. UTM을 활용해서 CentOS를 깔았는데, 그럼 윈도우도 깔 수 있는거고... 오랜만에 윈도우 화면이나 한 번 볼까? 라는 생각에 이 뻘짓 아닌 뻘짓을 하게 되었다. 1. 기본 준비물 1번. UTM 그냥 설치만 하면 된다. 다운로드 링크 앱스토어로 다운받지 말고 내려 받기로 설치하면 무료이다. 2번..

[Java] 람다식과 함수형 인터페이스의 개념 [내부링크]

[Java] 람다식과 함수형 인터페이스의 개념 스프링 독서 스터디의 부록으로 java 8부터 등장한 람다식과 함수형 인터페이스 내용을 보면서 정리한 내용이다. 이 두 가지를 왜 알고 있어야 하는지, 어디에, 어떻게 쓸 수 있는지를 알아보고자 한다. 1. 함수형 인터페이스, 람다식의 등장 이유 람다식을 알아보기 전에 먼저 함수형 인터페이스가 왜 나오게 되었는지를 알아보자. 1) 옛날보다 많은 기술의 발전 세상이 발전해 나가면서 싱글 코어 CPU만 쓰다가 멀티 코어 CPU를 쓰기 시작했다. 컴퓨터의 하드웨어가 많이 발전하였다. 그리고 사람들이 일상에서 활용하는 IT 기술이 발전하면서 의미 있는 데이터들이 생산되기도 했는데, 이에 따라 다량의 데이터를 처리하는 프로그램이 필요했다. 이 두 가지 흐름이 1950..

mysql 완전 재설치 : The driver has not received any packets from the server. 오류 해결 [내부링크]

The driver has not received any packets from the server. 오류 해결(mysql 완전 재설치) 1. 문제의 발생 AWS를 활용하여 도커 배포를 실험을 한창 하고,,, 그다음 날. 인텔리제이를 켜고 평소처럼 localhost:8080의 세상으로 들어가려는 순간. 다음과 같은 오류를 만났다. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. a..

카카오맵 GPS 마커 중복 생성 해결방법 [내부링크]

카카오맵 GPS 마커 중복 생성 해결방법 이전에 포스팅한 대로 GPS 버튼을 만들면, 마커는 정상적으로 작동하지만, 새로 고침 했을 때, 꺼지지 않고 계속 생성되어 있는 부분이 마음에 걸렸고, 마커가 있을 때 버튼을 클릭하면 중복 생성되는 문제가 있었다. 이에 새로고침을 하면 GPS 마커가 사라지고 GPS 마커가 있는 상태에서 GPS 버튼을 누르면 더이상 마커가 생성되지 않게 만들어야 했다. 그래서 마커가 있을 때는 어떤 변수에 값을 1을 저장하고, 없을 때는 0을 저장하여서 로직을 다르게 구현하면 되겠다는 발상을 하였다. 처음에는 자바스크립트 코드 내부에 값을 저장해보려고 했지만, 전혀 값이 저장되지 않았다. // 2. 위치 수집, GPS 마커 표시 기능(GeoLocation) // 1) gpsButt..

카카오맵 API GPS 버튼 커스텀하기(Javascript) [내부링크]

카카오맵 API GPS 버튼 커스텀하기(Javascript) 카카오맵 API를 활용해서 웹 페이지를 만들면, 현재 위치 기능을 geolocation 객체를 활용해서 받아올 수는 있지만, 우리가 흔히 사용하는 스마트폰 카카오맵에서 활용하는 버튼 기능을 제공하지 않는다는 것에서 막힐 때가 있다. https://apis.map.kakao.com/web/sample/geolocationMarker/ 기본 공식문서를 보고 geolocation을 적용하면, 페이지에 접속했을 때 자동으로 현재위치로 이동되는 것을 쉽게 구현할 수는 있다. 그러나, 내가 원할 때, geolocation을 불러오고 싶다면, gps버튼을 커스텀해야 한다. GPS 버튼을 이제 만들어보자! 1. button의 형태를 먼저 만들어준다.(HTML..

[HTML/CSS] 브라우저 창 조절 시 스크롤바 떨림 현상 해결 [내부링크]

[HTML/CSS] 브라우저 창 조절 시 스크롤바 떨림 현상 해결 초기 페이지를 만들다가 스크롤을 축소시키면 위와 같은 현상이 일어났다. 일정크기 이하가 되면 페이지 안에서 드래그를 하거나, 페이지 창을 줄이면 스크롤바가 나타났다가 없어졌다가 하면서 떨리는 것 같은 현상이 일어났다. 무엇이 문제일까 생각하다가, GPS 버튼을 새로만들고 생긴 현상인 것을 알았고, GPS 버튼을 살짝 이동시켜보았다. gps 버튼이 축소되면서 스크롤에 걸릴 때 이와같은 현상이 일어난 것이었다. gps버튼의 css left 속성의 값을 %로 주고 있어서 위치가 바뀔 때 마다 변경이 되었다. 그러나 이는 완벽한 해결방법은 아니다. 현재 html 태그 안에서 gps버튼의 위치는 파란색 컨텐츠 안에 속해있다. 그래서 파란색 컨텐츠 ..

개발 이력 노트를 꼼꼼하게 기록해두자. [내부링크]

개발 이력 노트를 꼼꼼하게 기록해두자. 어느덧 첫 프로젝트가 완성되어 가고 있다. 이제 핵심 로직은 정리가 되었고, 미완성인 UI를 하나씩 완성하고 있는 중이다. 여기에 몰두하여 그동안 블로그에 어떤 트러블슈팅을 했는지 하나도 기록을 하지 못했다. 중간에 이 문제점을 인식하고 문제 해결과정을 기록하고 있었지만, 초반에 화면을 구성하고 api를 불러오면서 있었던 이슈들은 기억이 가물가물하다... 일명 삽질을 했던 기록들이 상당히 소실되었다. 최근에는 어설프게나마 버그 수정한 기록들을 리스트업 하고 이것들을 체크하는 방식으로 진행을 하고 있는데, 하나하나 블로그 기록으로 남기면 엄청 많은 분량인데, 미루고 미뤄서 결국 쌓인 부채가 이만저만...하다. 한 20개는 되는거 같다. 이 문제점들을 이제 하나씩 업로..

[Javascript] 로컬 스토리지 사용 방법 [내부링크]

[Javascript] 로컬 스토리지 사용 방법 1. 로컬 스토리지란? 자바 스크립트 메서드나 변수를 사용할 때, 새로 고침을 해도 그 값을 계속 저장해놓고 사용하고 싶을 때가 있다. 예를 들면, 카카오맵을 웹에서 사용하면, 드래그를 하면서 지도를 이동시키는데, 한 번 이동했던 장소를 새로고침 하거나 다른 페이지를 갔다 와도 원래 보았던 위치를 계속 보고 싶을 때를 들 수 있겠다. 자바스크립트는 브라우저를 새로고침 할 때마다 계속 새롭게 불러와지고, 변수도 초기화될 수밖에 없다. 그렇기 때문에 어딘가에 변수를 저장하고 싶다면, 로컬 스토리지를 활용하면 된다. 나는 지금 현재 프로젝트에서 로컬 스토리지를 활용하여 경도, 위도 값을 로컬 스토리지에 저장하고, 창을 닫으면 그 값을 지우는 방법으로 브라우저에게..

[Web] 8080 포트 중복 연결 에러 해결 방법 [내부링크]

[Web] 8080 포트 중복 연결 에러 해결 방법 Web server failed to start. Port 8080 was already in use. 거창한 에러는 아니다. 기존에 사용하던 포트가 사용 중이기 때문에 일어나는 에러이다. 터미널을 켜고 몇 가지의 명령어만 쳐주면 해결된다. 기존 프로젝트의 프로세스가 사용하는 포트가 사용중이기 때문에 뜬다. 프로젝트 실행을 해도 계속 실행이 유지가 안 되고 꺼질 것이다. 1. 일단 포트를 쓰고 있는 프로세스를 확인해본다. sudo lsof -i :8080 이 명령어를 치면 특정 포트를 사용하는 프로세스의 PID를 알 수있다. sudo : Super User Do의 약어 lsof : list open files의 약어 -i : TCP 네트워크로 열린 파일..

[Web] 쿠키, 세션 자세히 알아보기, 구현하기 [내부링크]

[Web] 쿠키, 세션 자세히 알아보기, 구현하기 스프링 시큐리티를 활용해서 프로젝트를 진행하고, 웹 서버 수업을 들으면서 최초의 로그인 기능을 알아보는 수업을 듣는 중이다. 예전에 교양 수준 정도로 쿠키와 세션을 정리해본 적은 있지만, 그때 당시에는 웹 서버가 무엇인지, 심지어 프로젝트 파일이 무엇인지도 자세히 몰랐기 때문에 그 '개념'과 비유적 표현 정도를 이해하는 정도였다. 이제는 실전에서 쿠키와 세션을 활용할 수 있을 정도로 파악해야 할 때가 왔다. 이전에 포스팅 한 것은 다음과 같다. 2022.07.02 - [IT 지식/Web] - [Web] 쿠키(cookie), 세션(session) 캐시(cache)의 정의 [Web] 쿠키(cookie), 세션(session) 캐시(cache)의 정의 [Web..

개발자 이력서 쓰는 방법(워니님 특강) [내부링크]

개발자 이력서 쓰는 방법(워니님 특강) 9월 1일(목), 멋사에서 이력서 특강이 있었다. 흔히 쓰는 자기소개서 문항을 어떻게 작성하느냐가 아닌, 내 소개를 하는 이력서를 어떻게 쓰는지, 꼭 있어야 하는 항목은 무엇인지 등을 자세히 들어볼 수 있었다. 강사님은 워니님이었다. 평소에 개발 관련된 유튜브를 보다 보면 자주 나오시는 분이어서 잘 알고 있었다. 많은 부분에서 도움을 받았고 처음 개발을 접할 때 도움을 받았던 부분이 많았어서 기대가 되었다. 아래에서는 이력서 항목을 어떻게 잘 채워나갈 수 있는지, 어떤 것들을 써야 하는 지를 간략하게 내가 이해한 것들을 간략히 정리해보려고 한다. 1. 이력서 제목 짓기 이력서 상단에 보면 ~~~ 하는 개발자 000 입니다. 이런 제목이 있는 이력서들이 있다. 과연 ..

[스터디] AOP의 정의와 활용 [내부링크]

[스터디] AOP의 정의와 활용 스프링의 기본 원리를 이제까지 알아보았는데, 마무리 과정에 이르렀다. AOP(Aspect-Oriented Programming)이 남았다. AOP는 스프링의 프로그래밍 모델 중 하나이다. 번역을 하면 관점 지향 프로그래밍이라고 할 수 있다. 관점이라는 말 보다는 실제 AOP가 왜 사용되는지, 어떻게 활용되는지를 알아가다 보면 이것이 어떤 모델인지를 충분히 이해할 수 있다. 1. AOP를 사용하는 이유(WHY) 스프링 프로젝트에 관심이 있다면, 누구든 이 에피소드는 한 번은 들어봤을 것이다. A 팀장 : B님 프로젝트 관련해서 해줘야 할 일이 있을 것 같은데... 간단한 거거든요? B 신입 : 네! 뭐든 말만해주세요(의욕 과다)! A 팀장 : 그래요. 우리 프로그램 성능 측..

알약 프로그램 오류 원인을 알아보자 [내부링크]

Window OS svchost.exe process 8월 30일 윈도우의 개인용 ‘알약' 프로그램이 독약으로 변하여 부팅이 되지 않게 하는 오류가 일어났다. 많은 사람들이 이 원인에 대해 모르고 잘못 대처하는 바람에 하지 않아도 될 컴퓨터 초기화를 무리하여 진행하기도 했다. 간단하게 이야기하면, 알약을 사용하여서 랜섬웨어에 감염이 될 우려가 있는 것이 아니라, svchost.exe 라는 윈도우 프로세스를 알약이 랜섬웨어로 감지하여 작동하지 못하게 한 것인데, 이것이 왜 OS를 띄우지 못하게 했을까? svchost.exe 에 대해 알아보고, 개발자 꿈나무로서 알아야 할 OS 관련 보안 지식에 대해 간략히 알아보고자 한다. 1. svchost.exe 1) svchost.exe란? 서비스 호스트라고 불리기도..

알약 랜섬웨어 오류 해결 방법 [내부링크]

알약 랜섬웨어 오류 해결 방법 알약 8월30일, 사망 팀프로젝트를 하던 중에 같은 조원이 알약 랜섬웨어 오류에 걸리게 되었다. 알약 업데이트로 인해 윈도우를 랜섬웨어로 인식하고 충돌이 일어나서 그런 것이라고 어디서 보았지만, 확실하지는 않았다. 나는 맥을 쓰고 있지만, 예전에 윈도우를 쓴 적은 많기 때문에 안전 모드 진입 -> 제어판 진입, 알약 삭제 -> 재부팅을 하게 되면 충돌이 해결되지 않을까 하는 생각을 했다. 1. 안전 모드 진입 컴퓨터에 따라 다르지만 F8 or F11을 누르거나, 강제 재부팅 3회를 하면 이런 창이 뜨고 특정 설정을 하면 안전모드로 들어갈 수 있다. 2. 제어판 진입, 알약 삭제 3. 삭제중... 알약 안녕! 4. 정상 부팅 완료 정상적인 화면을 볼 수 있다. 맥을 쓰자! 알..

[스터디] 스프링 삼각형과 설정 정보 1) [내부링크]

[스터디] 스프링 삼각형과 설정 정보 ~ 1)편. IoC/DI - 제어의 역전 / 의존성 주입 객체 지향의 기본 원리를 4주에 걸쳐 알아보았다. 이제 실제로 그것이 쓰이는 것을 직접 눈으로 확인할 차례이다. 그렇지만, 그 전에도 스프링이 어떤 특징을 가지고 있는지, 어떤 개념이 토대가 되어 스프링이 작동하는 것인지는 기본적으로 알아야 할 필요가 있다. 어떻게 돌아가는지도 모르면서 원숭이 마냥 코드를 부르는 대로 자판에 찍는 것이 아니라면, 내가 어떤 일을 하고 있는지, 무엇을 해야 하는지, 도구의 특징 중 어떤 것을 활용해서 최대의 효율을 낼 수 있는지 등을 알아야 하지 않을까? 그중에 첫 번째로 중요한 것이 '의존성 주입'이다. DI라고도 한다. 지금 읽고 있는 챕터에서 소개하고 있는 것을 크게 나누어..

[Spring] getmapping, postmapping 개념과 차이 [내부링크]

[Spring] getmapping, postmapping 개념과 차이 1. mapping Annotation이란? 스프링 부트 프로젝트를 하다보면 Controller class를 먼저 만들게 된다. 스프링 프로젝트를 실행시키고 나서 브라우저에 결과값을 한 번 띄워보려면, 메서드 위에 어노테이션을 붙이게 된다. @Controller @RequestMapping("/home") public Controller{ @ResponseBody public String showTest(){ retrun "hi" } } 처음 볼 때는 이 어노테이션이 무엇에 쓰이는 지, 어떤 상황에 쓰이는 지 잘 감이 안 온다. 컨트롤러...? 리퀘스트맵핑....? 리스폰스바디...? 그럼 System.out.println()을 하면..

[Project 1] 첫 프로젝트 EatTwoGetter 초기 구현 [내부링크]

[Project 1] 첫 프로젝트 EatTwoGetter 초기 구현 8월 초부터 첫 프로젝트를 시작했다. 내 아이디어는 선정이 되지 못했지만, 마음에 드는 아이디어를 선택해서 팀이 만들어졌다. 프로젝트의 핵심 아이디어는 '배달요금 절약을 통한 지역경제 활성화'이다. 근거리에 사는 사람들이 배달 요금으로 인해 먹고 싶은 음식을 시키지 않고 지갑을 닫는 부분을 해결하는 것이 프로젝트의 주요 목표이다. 1. 프로젝트의 목표 이 목표를 달성하는 과정에서 얻어지는 효과로는 소비자 소비 심리 진작과 지역 경제 활성화, 그리고 지역 커뮤니티의 활성화가 있을 것이다. 경제적인 것뿐만 아니라, 사회 자본이라고 할 수 있는 지역 커뮤니티 활성화를 통해 사람들의 1인 가구의 증가, 스마트폰 컨텐츠의 발달로 사라져가는 지역 ..

[Bootstrap] 카카오맵 활용한 홈페이지 만들기 (1) [내부링크]

[Bootstrap] 카카오맵 활용한 홈페이지 만들기 (1) 1. 프론트 삽질 첫 번째 귀여운 프로젝트를 진행 중이다. 현재 나는 카카오맵 API를 가지고 여러 기능들을 추가하고, 하나의 홈페이지로 구현을 해보는 것을 진행하고 있다. 현재 백엔드 과정을 진행 중이지만, html, css, js, jquery만 며칠 동안 봐서 어질어질하다. 그렇지만, 기본적인 것은 할 줄 알면 좋은 법. 익혀나가고 있다. 그냥 템플릿을 사용하지 않고 만들다가 정말 모니터를 부술뻔 했다. 컴퓨터는 아무 잘못이 없지만, 내가 준비한 카카오맵 API 구현 코드와 부트스트랩을 적용한 UI가 충돌하고, 내가 준비한 카카오맵 코드도 기능을 추가하다 보니 엉켜서 엉망진창이 되어 버렸다. 구현한 코드 중 일부는 아래와 같다. 여기에서 ..

2022년 8월부터 12월까지의 작은 계획 [내부링크]

2022년 8월부터 12월까지의 작은 계획 점점 해야 할 것은 많아지고, 근데 소화는 못하는 상황이 와버렸다. 요즘 상황은 이렇다. 한 4월쯤에 태어난 개발자 라마스떼는 7월 즈음에 자바라는 걸음마를 떼었더니, 갑자기 JSP, Servlet이라는 요즘 잘 볼 수도 없는 쌀집 자전거를 한 번 타보지 않겠냐고 권유를 받았고, 못 타다가 spring boot라는 네 발 자전거를 타보라고 권유를 받았다. 일단 페달을 굴리면 간다는 것은 알지만, 어떻게 하면 빨리 가는지, 안전하게 탈 수 있는지는 모르는 상황이다. 그런 상태에서 spring이라는 자전거의 부품인 DB라는 부품 제작과정에 대해 슬쩍 건네 듣고, 그것을 과학상자 5호를 가지고 만들어보는 실험을 하기도 했다. 어 그런데, 이 자전거가 따릉이처럼 공유가..

[스터디] 객체 지향 디자인 패턴 [내부링크]

[스터디] 객체 지향 디자인 패턴 3주 차까지 공부했던 객체지향 4개 특성, SOLID에 이어 디자인 패턴을 알아보았다. SOLID 원칙의 특성을 담아 어떤 프로그램을 짜야할 것이다. 사람들이 SOLID라는 원칙에 따라서 프로그램을 설계하기 시작했는데, 마치 맛있는 음식을 만드는 방법처럼 하나의 패턴, 공식이 보이는 것이다. 그래서 이것들을 정리해보았고 디자인 패턴으로 불리게 된 것이다. 디자인 패턴은 하나만 있는 것은 아니다. 마치 백종원씨가 '김치찌개'를 여러 가지 재료와 조리 방식을 활용해서 만드는 것처럼. 7분 동안 돼지김치찌개를 만들면 새마을식당의 7분돼지김치찌개가 될 것이고, 자취생이 해 먹는 간단 김치찌개를 만들 수도 있다. 그렇지만, '맛'은 항상 평타 이상을 친다. 맛에도 공식이 있어서 ..

[Spring] Framework, Library, API [내부링크]

[Spring] Framework, Library, API 수업 과제로 주어지는 영상들을 보고 간략히 정리하였다. 1. 프레임워크 개발할 때 빈번히 쓰여지는 범용 기능을 한꺼번에 제공해 개발 효율의 향상을 목표하는 소프트웨어 환경이다. 집짓기로 비유하면 기본 틀(평면도), 장비를 제공하는 것이다. * 특징 - 공통적인 개발환경을 제공한다(편의성) - 개발할 수 있는 범위가 정해져 있다. - 제어의 역전이 발생한다.(어플리케이션 동작이 수동적으로 동작한다) - 스프링, 장고, 노드js 등이 있다. 2. 라이브러리 재사용 가능한 코드의 집합이다. 집짓기 예시로 치자면, 집안의 가구, 집기들이라고 할 수 있다. * 특징 - 개발하는데 필요한 것을 모아놓은 저장소 - 필요할 때 호출해서 사용한다 - 코드의 흐름..

[Java] 불변 객체(Immutable Object) [내부링크]

[Java] 불변 객체(Immutable Object) 개발자인 우리는 불변이라고 하면 final이 먼저 생각날 것이다. 자바의 final은 한 번만 할당이 가능하다는 것을 알고 있을 것이다. 재할당을 하려고 하면 컴파일 오류가 당연히 생길 것이다. 이것은 변하면 안 되는 변수, 메서드, 클래스에 예약어로 붙어서 우리가 코드를 구현할 때 실수하지 않게, 로직에만 집중할 수 있도록 도와준다. 1. 불변 객체(Immutable Object)란? 그렇다면 이번 포스팅에서 설명할 불변 객체는 무엇일까? 이해를 쉽게 하기 위해서는 반대 개념이 있는지를 먼저 살펴보는 것도 좋다. 그렇다고 하면, '가변 객체'가 있는 지를 짧게 생각해보자. 우리는 클래스를 만들기도 하고, 만들어져있는 클래스를 가져와서 객체로 만들기..

[Database] 물리적 데이터 모델링(Physical Data Modeling) [내부링크]

[Database] 물리적 데이터 모델링(Physical Data Modeling) 실제 프로젝트에서는 물리적 데이터 모델링을 수행하는 경우는 드물다고 한다. 개념적인 부분에서 배경지식을 얻기 위해, 나중에 읽어볼 만한 글을 개인적으로 남기기 위해 본 포스팅을 진행한다. 아래의 글은 발췌한 글로 약간의 수정을 가하였다. 이 다음에는 정규화와 역정규화에 대해 알아볼 것이다. 물리적 데이터 모델링이란. 물리 데이터 모델이란 논리적 모델을 특정 데이터베이스로 설계함으로써 생성된, 데이터를 저장할 수 있는 물리적인 스키마를 말한다. 데이터 모델의 엔터티와 서브타입은 논리적인 집합이며, 만약 관계형 데이터베이스로 설계한다면 이 단계에 와서 물리적인 테이블(Table)로 확정된다. 하나의 논리적 집합(엔터티 혹은 ..

[SQL] SQL 기본 문법 [내부링크]

[SQL] SQL 기본 문법 데이터베이스를 사용하면 Structured Query Language를 무조건 알고 있어야 한다. 관계형 DB를 다루기 위해서 Oracle이든 MySQL이든 공통적으로 사용하는 표준 언어이다. 하나를 배우면 열을 알 수 있는 언어라고 할 수 있겠다. 1. SQL 문법 분류 분류 설명 데이터 정의어(DDL) - 데이터를 정의하는 언어 - 테이블이나 관계의 구조를 생성하는 데 사용 - CREATE, ALTER, DROP, TRUNCATE 문이 있음. 데이터 조작어(DML) - 데이터베이스에 저장된 자료들을 CRUD(입력, 수정, 삭제, 조회)하는언어 - SELECT, INSERT, UPDATE, DELETE 문이 있다. - SELECT 문은 특별히 질의어(Query)라고 부른다...

구글 검색 잘 하기(site: 검색 연산자 활용법, baeldung) [내부링크]

구글 검색 잘 하기(site: 검색 연산자 활용법, baeldung) 예수, 부처, 알라 등 많은 신들이 있다. 그 신들은 전지전능하며 소원을 들어주기도 하고, 인생이란 무엇이며 사람들에게 어떻게 살지를 알려주기도 한다. 신은 인간이 신을 중심으로 모여 사회를 형성하게 했고, 삶의 의미를 만들어주었고 폭발적인 기술 성장에 밑거름이 되었다. 신은 인간을 창조하였다. 그 인간은 구글을 만들었다. 구글은 인간이 만든 것이지만, 우리에게 다시 신처럼 작용하고 있다... 구글을 통해 많은 정보들을 얻고, 삶의 의미를 찾으며, 사회를 형성한다. 구글은 2010년 이후 우리에게 신과 다름없는 기능을 우리에게 제공하고 있다. 한 기업이 신으로 등극하는 것 같아 무섭긴 한데... 아무튼 개발자들은 구글이라는 개발의 신이..

[InteliJ] maven dependency 추가 후 바로 import 안 될때 [내부링크]

[InteliJ] maven dependency 추가 후 바로 import 안 될 때 우리는 외부 라이브러리를 쓰려면 의존성 설정을 하고, 각 클래스에서 import를 해서 쓴다. 그런데, pom.xml에 dependency를 추가했음에도 계속 import가 안 된다면...? 어떤 것을 의심해야 할까? 가장 기본적인 것은, 외부 라이브러리가 불러와졌는지를 의심해야 한다. 당연히 라이브러리가 없기 때문에 불러올 클래스가 없다고 인식하는 것이다. 프로젝트 창에서 아래 '외부 라이브러리'에 사용하고자 하는 라이브러리가 들어와 있는지 보아야 한다. 만약, 라이브러리가 없다면, 외부 라이브러리의 소스들이 아직 내 로컬에 없다는 뜻이 된다. 이것을 방지하기 위해서는 다음과 같은 작업을 꼭 수행하자. 1. depen..

[mac] mac 숨김폴더, 파일 보기 [내부링크]

[mac] mac 숨김폴더, 파일 보기 mac에서 작업을 하다보면, .git, .gitignore와 같은 숨김 폴더를 보고 싶을때가 있다. 당연히 숨김 폴더, 파일이기 때문에 숨겨져 있는데, 우리는 전지전능한 컴퓨터 주인이 아니겠는가. 어떻게 하면 숨김 폴더, 파일을 한번에 볼 수 있을까? 답은 "command + shift + . "이다. 마침표 "." 이다. 이렇게 되어 있는 폴더에서, shift + command + . 을 누르면 다음과 같이 변한다. 만약, 다시 숨김 폴더와 파일을 숨기고 싶다면, shift + command + . 을 다시 한 번 더 눌러주면 된다.

[Database] 개발 세계에서 데이터베이스란 무엇일까? [내부링크]

[Database] 개발 세계에서 데이터베이스란 무엇일까? 많은 사람들은 자기가 경험하지 못한, 잘 알지 못하는 새로운 것을 볼 때, "저게 뭐야?" "이건 또 뭐야?" 의문을 가진다. (돌고래도 호기심 많은 동물 중에 하나라고 한다.) 어떤 개념이나 기술을 배울 때, 우리는 그것에 대한 추상적인 정의를 이해하고 지식을 가지고 있어야 한다. 그것이 무엇에 쓰이는 것인지, 어떤 것과 비슷한 것인지, 어떤 형태를 하고 있는지, 즉, 용도와 개념 비유, 물리적 외형을 알고 있어야 한다는 것이다. 데이터베이스를 처음 배우는 사람이라고 한다면, DB가 무엇에 쓰이는 지, 무엇과 비슷한지, 어떤 형태를 하고 있는지는 알고 있어야 그다음의 깊은 개념인 논리적 데이터 모델링, 관계형 DB, ... 등등을 이해할 수 있..

[Database] 논리적 데이터 모델링(Logical Data Modeling) [내부링크]

[Database] 논리적 데이터 모델링(Logical Data Modeling) 개념적 모델링 이후 이루어지는 단계이다. 개념적 모델링의 개념은 아래에 포스팅 되어 있다. 2022.07.29 - [IT 지식/Database] - [Database] 개념적 데이터 모델링(Conceptual Data Modeling) [Database] 개념적 데이터 모델링(Conceptual Data Modeling) [Database] 개념적 데이터 모델링(Conceptual Data Modeling) 1. 데이터 모델링이란? 앞의 글에서 예시를 든 치킨집 예시를 다시 살펴보자. 2022.07.27 - [IT 지식/Database] - [Database] 개발 세계에서 데.. masterpiece-programming..

[Database] 개념적 데이터 모델링(Conceptual Data Modeling) [내부링크]

[Database] 개념적 데이터 모델링(Conceptual Data Modeling) 1. 데이터 모델링이란? 앞의 글에서 예시를 든 치킨집 예시를 다시 살펴보자. 2022.07.27 - [IT 지식/Database] - [Database] 개발 세계에서 데이터베이스란 무엇일까? 정말 치킨집 정보를 데이터베이스로 관리하고자 한다면, 어떤 과정을 거쳐야 할까? IT 지식 기반으로 생각하지 않아도, 우리는 어떤 카테고리, 어떤 기준을 가지고 치킨집의 정보를 분할할지를 직감적으로 떠올리게 된다. 또한 우리에게 필요한 정보를 기반으로 카테고리를 생각한다는 것이다. 예를 들어 우리가 필요한 정보가 "저렴한" 치킨집이라면, 그것만 알려면 항목으로 상호명과 메뉴, 가격만 있으면 된다. 그렇지만 저렴한 치킨집의 전화..

[Java] 내부 클래스와 익명 클래스 그리고 람다 [내부링크]

[Java] 내부 클래스(Inner Class)와 익명 클래스(Anonymous class) 그리고 람다(Lambda) 1. 들어가며, 내부 클래스는 왜 필요한가? 하나의 클래스 안에서만 쓰이는 객체를 생성하고 싶을 때가 있다. 혼자 개발을 한다면 다른 곳에 구현을 한 번 하고 다른 클래스에서는 구현을 안하는 방법으로 사용하면 된다. 그렇지만, 2명, 3명, ... 100명이 개발을 같이 한다면...? 주석을 꼼꼼히 남기지 않는 한 그것을 다른 곳에서 구현하는 사람이 나타날 것이다. 그래서 단발적으로 사용하고, 확장할 필요가 없는 객체를 구현해야 할 때 내부클래스를 사용한다. 클래스의 메서드 안에서 구현을 하고 끝내는 내부클래스가 생겨난 것이다. 사용 이유 정리 1. 프로그램 안에서 일시적(단발적)으로 ..

[Web] OSI 7 Layer [내부링크]

[Web] OSI 7 Layer OSI란, Open System Interconnection으로, 개방형 시스템 상호 연결이라는 뜻을 가지고 있다. 이 모델은 다양한 통신 시스템이 표준 프로토콜을 사용하여 통신할 수 있도록 국제 표준화 기구가 만든 개념 모델이다. 사전적 정의이기 때문에 와닿지 않을 수 있다. 그래서 조금 더 이해를 하고자 재정의를 해보면 다음과 같다. 컴퓨터와 컴퓨터가 통신을 시도할 때, 발생하는 과정을 기능별 일곱 가지로 나눈 것이 OSI 7 Layer라고 보면 되겠다. 다시 말해, 통신을 함에 있어서 어떤 일이 일어나는 지를 정리한 것이 OSI이고, 그것이 7단계여서 OSI 7 Layer라고 하는 것이다. OSI의 계층을 나눌 수 있는 이유는 무엇일까? 계층은 섞이지 않는 기준을 가..

[Web] 인증(Authentication)과 인가(Authorization) [내부링크]

[Web] 인증(Authentication)과 인가(Authorization) 인증과 인가는 일상생활 속에서도 많이들 듣는 개념이다. 인증은 본인인증, 성인인증 등의 용어에서 많이 보았을 것이다. 내가 '누구인지'를 확인하는 절차를 뜻하는 것으로 일상에서도 사용된다. 한편, 인가의 경우, 법률용어로 활용이 되기도 하는데, '학교 설립 인가', '국토교통부 장관 인가' 등 행정법 상의 용어로 많이 활용된다. 정확히 이야기하면, 행정기관이 어떤 사람이 하려는 행위를 OKay 해주어서 법적으로 효력이 있게 만들어주는 절차라는 뜻을 가진다. 어감에서도 드러나듯, 인증과 인가는 어떤 프로그램을 설계하는데 필요한 것이 아니라, 누군가와 소통을 하는데 있어서 필요한 '확인 절차'에 쓰이는 개념이라고 할 수 있다. h..

[CS] Multi Process, Multi Thread 개념과 구현 [내부링크]

[CS] Multi Process, Multi Thread 프로세스와 스레드에 대해서는 이전에 한 번 정리를 한 적이 있다. 2022.07.06 - [IT 지식/CS] - [CS] 프로세스와 스레드 [CS] 프로세스와 스레드 프로세스와 스레드 1. 프로세스의 개념 어떤 작업을 위해 실행할 수 있는 파일을 '프로그램'이라 한다. 그 프로그램이 컴퓨터에서 연속적으로 실행될 때, 그것을 프로세스라고 한다. 메모리에 올 masterpiece-programming.tistory.com 하지만 개념적인 측면에서 프로세스가 무엇인지, 스레드가 무엇인지 정도만 정리를 했기 때문에, 지금 와서 스레드를 사용한 프로그램을 구현하라고 하면...? 말하는 감자에 불과해진다. 그래서 프로그래머스 자바 중급 강의와 여러 참고 자..

[Spring] Servlet Container [내부링크]

[Spring] Servlet Container 서블릿 컨테이너를 알아보기 전에 복습해야 할 개념이 있다. 웹 서버 개념이다. 2022.07.07 - [IT 지식/Web] - [Web] 웹 서버 : apache, NginX, Tomcat [Web] 웹 서버 : apache, NginX, Tomcat [Web] 웹 서버 : apache, NginX, Tomcat 1. 웹이 우리에게 오기까지 HTML, CSS, JavaScript 등의 파일은 페이지를 구현하기 위해 필요한 문서들이다. 이 문서들은 클라이언트에 있는 것이 아니라, 그 정보를 저 masterpiece-programming.tistory.com 웹 서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용한다. 웹 서버는 웹페이지 리소스들을 서버 데..

[스터디] 객체 지향 설계 5원칙 - SOLID [내부링크]

[스터디] 객체 지향 설계 5원칙 - SOLID 2주간 객체 지향의 개념과 4대 특성을 완전하게 살펴보았다. 그렇다면 객체 지향 언어를 이용해서 객체 지향을 올바르게 설계해 나가는 방법, 원칙을 배워볼 차례이다. 객체 지향의 설계 중 정수는 SOLID다. SOLID는 위의 그림에서 보이는 것과 같이 두문자를 따서 만들어놓은 개념어이다. 좋은 소프트웨어 설계를 위해서 결합도를 낮추고, 응집도를 높이기 위한 방법들이 SOLID에 응축되어 있다고 보면 된다. SOLID는 개념이다. 다양한 곳(아키텍처, 프레임워크 모듈, 클래스, 속성 등등)에 다양하게 적용되기 때문에 보는 사람의 관점에 따라 다르게 해석될 수도 있다. 그렇기 때문에 개념을 이해만 하고 실제로 어떻게 활용되는 지를 알아보고, 소프트웨어에 자연스..

[Spring] MVC Pattern [내부링크]

[Spring] MVC Pattern 1. MVC란? 기초적인 동적 웹은 php 파일과 같이 한 형태의 파일 안에서 데이터베이스에 접속하고, html을 구현하고 css를 구현하고 해서 나타낼 수가 있다. 하지만, 간단한 게시판 정도가 아니라 거대한 Naver, Daum과 같은 페이지를 관리해야 한다면? 요소와 기능들이 많아지고 구조가 이것저것 얽히면서 하나의 파일 안에 든 코드들이 난잡하게 되어 버린다. 거대해지고 복잡해질 때는 분리, 모듈화를 해주어야 한다. 하나의 모듈이 하나의 일을 하고 그것들이 합쳐져서 전체적 서비스로 보이게 해야 하는 것이다. 국가의 기능은 입법, 사법, 행정으로 나뉘듯이, 웹 사이트에서는 기능을 "Model, View, Controller" 세 가지로 나눌 수 있다. Sprin..

[Web] Web Request, Response(웹의 요청과 응답) [내부링크]

[Web] Web Request, Response(웹의 요청과 응답) 웹이라는 단어는 인터넷을 사용하는 우리에게는 참 친숙한 단어이다. 웹 사이트, 웹 서버.... 그렇지만, 정확하게 웹이라는 단어의 의미와 뜻을 알고 있는가에 대해 반성을 해볼 필요가 있다. 웹(World Wide Web, WWW)은 인터넷을 지칭하는 개념이 아니다. 하위 개념이라고 할 수 있다. 컴퓨터와 컴퓨터를 연결하는 기술이 인터넷 기술이고, 웹은 그 인터넷 위에서 동작하는 서비스 중에 하나이다. 인터넷이라는 네트워크 인프라 위에서 동작하는 것이 웹 1. 웹의 존재 이유 그럼 웹은 왜 존재하는 것일까? 무엇을 위해 있는 기술일까? 팀 버너스리는 WWW의 창시자이다. 이 사람은 컴퓨터로 어떤 정보를 공유하고 싶은 마음이 있었다. 그렇..

멋쟁이 사자처럼 백엔드 스쿨 25% 회고 [내부링크]

멋쟁이 사자처럼 백엔드 스쿨 25% 회고 현재 글을 쓰는 시점은 7월 24일이다. 백엔드 스쿨이 시작된 지 한 달 하고도 10여 일 정도가 지났다. 그동안 26번의 수업을 들었으며, 그중 결석은 개인적인 사정으로 한 번 정도 했으니 25% 정도를 들은 셈이다. 25%라고 하니까 벌써...? 라는 생각이 먼저 든다. 시간이 뭐 이렇게 빠른가 싶기도 하다. 빠른 시간은 망각을 불러온다... 사라지는 기억들을 붙잡아 놓기 위해 그동안 배웠던 것들과 일상에서 있었던 여러 가지 깨달음들을 정리해보기로 했다. 1. 프로그래밍 학습과 개념에 대한 깨달음과 변화. 1) 개념이나 기술이 생소하지는 않게 되었다. 한 달 간은 생소한 세계에 던져지고 익숙해지는 과정의 연속이었다. 웹과 관련된 용어를 들으면 생소하고, 네트워..

[Spring] Observer Pattern [내부링크]

[Spring] Observer Pattern 한 없이 유약한 공격력 0의 유닛이다. 그렇지만 프로토스에게 중반 이후 클로킹을 쓰는 유닛에 대처하기 위해 필수적으로 생산해야 하는 유닛이다. 옵저버는 관찰자이다. 공격을 하지 않고 들키면 뚜드려 맞아야 하고, 가려진 맵과 클로킹 된 유닛을 보여주기만 한다. 그렇다면 옵저버 패턴은 무엇일까? 옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다. Observer Pattern도 옵저버와 ..

[Spring] Servlet과 Spring [내부링크]

[Spring] Servlet과 Spring 1. 서블릿이란? 서버 어플리케이션 조각 -> Server Application Let -> Servlet 처음 웹서버는 클라이언트의 요청에 따라 정적인 페이지로만 응답할 수 있었다. 웹 서버에 동적인 프로그램을 붙여서 페이지를 보여주는 것이 서블릿 방식이다. 1) 서블릿이 생겨난 이유 http 요청과 응답은 다음과 같다. //request GET /api/products HTTP/1.1 Content-Type: application/json User-Agent: PostmanRuntime/7.28.0 Accept: */* Postman-Token: abfcbcf8-9317-430c-86b9-c00020eb736e Host: localhost:8080 Acce..

[Spring] Singleton Pattern [내부링크]

[Spring] Singleton Pattern 객체지향 디자인패턴 중 싱글턴 패턴은 객체의 인스턴스를 오직 1개만 생성한다. 이것이 싱글턴 패턴의 정의이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 것을 인스턴스를 여러 개 만들어 사용하게 되면 불필요한 메모리 자원 낭비가 되는데, 이럴 때 사용하는 것이다. 이런 싱글턴 패턴을 구현하기 위해서는 반드시 객체 생성을 위한 new에 제약을 걸어야 한다. 또한 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다. 그래서 아래의 세 가지 조건이 필요하다. - new를 외부에서 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다. - 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다. - 유일한 단일 객체를 참조할 정적 참..

[Spring] Factory-Method Pattern [내부링크]

[Spring] Factory-Method Pattern 팩토리는 공장을 의미한다. 공장은 물건을 생산하는데 객체 지향에서 팩토리는 '객체'를 생성한다. 팩터리 메서드는 결국 객체를 생성하고 반환하는 메서드를 말한다. 여기에 패턴이 붙으면 하위 클래스에서 팩토리 메서드를 오버라이딩해서 객체를 반환하게 하는 것을 의미한다. 팩토리 메서드 패턴은 생성할 객체 타입을 예측할 수 없을 때 활용한다. 객체 생성의 책임을 하위 클래스에게 위임시키고, 어느 하위 클래스에게 위임했는 지에 대한 정보를 은닉할 때 활용한다. 정리하면 다음과 같다. - 팩토리 메서드 패턴은 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때 사용한다. - 팩토리 메서드 패턴은 생성할 객체를 기술하는 책임을 자신의 서브클..

백신 접종 1년차의 코로나 확진 격리 일기 [내부링크]

백신 접종 1년차의 코로나 확진 격리 일기 그렇다. 슈퍼 면역자인줄 알았다. 하지만, 작년 7월, 8월에 맞았던 백신은 유효기간이 지난 것일까. 몇 번의 드립에도 살아남았던 나는, 저번주 12일, 화요일에 확진판정을 받았다. 그 주 금요일에 서울대입구에서 맛있게 조개구이를 먹고 달려달려 2차 3차를 갔다가 온전히 걸려온 것 같다. 주말 동안은 괜찮았지만, 월요일 아침에 일어나자마자 코로나와의 동거를 시작할 수 밖에 없었다. 7월 11일(월), 아침 8시 30분 알람이 3번째 울리고 있다. 하지만, 일어날 수가 없다. 평소와는 다르게 몸이 2배는 무겁고 머리도 미칠듯이 아프기 때문이다. 느낌인 것 같지만 열도 나는 것 같고, 목도 갑자기 뜨겁게 아프다. 그렇지만, 온라인 수업에 결석을 할 수는 없어 일단 ..

[스터디] 객체 지향 원리의 이해(총정리) [내부링크]

[스터디] 객체 지향 원리의 이해(총정리) 스터디가 2주차에 접어들었다. 저번주에는 객체 지향의 전신인 절차/구조적 프로그래밍에 대해서 알아보았다면, 이제는 본격적으로 객체 지향이란 무엇인지, 어디까지 발전해있는지를 알아보는 시간을 가진다. 라는 책은 자바의 객체 지향의 개념을 안다고 생각하는 입문자들에게 '너 확실하게 이해한 것 맞니?' 라는 생각을 하게 만들고, 다시 제대로 이해하게 만든다. 한 달 여간 자바의 여러 면면을 알아왔고, 객체 지향의 개념에 대해서 80% 정도는 이해하고 있다고 생각했는데, 책을 읽으며 반성하게 되었고, 더 나아지는 과정을 얻을 수 있었다. 또한 객체 지향 속의 개념어의 의미를 더 명확히하고 친숙히 하는 데에 있어서 많은 도움이 되었다. 클래스부터 super까지 모두 훑어..

[Java] Wrapper 클래스 [내부링크]

[Java] Wrapper 클래스 1. Wrapper Class 기본 자바는 기본 타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 생성할 수 있다. 이런 객체를 래퍼 객체라고 하는데, 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문이다. 이런 포장 객체는 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다. 기본 타입별 포장 클래스는 다음과 같이 매칭된다. 기본 타입 포장 클래스 byte Byte char Character short Short int Integer long Long float Float double Double boolean Boole..

[C언어] 구조체 배열, 구조체 포인터 배열 [내부링크]

[C언어] 구조체 배열 1. 구조체 배열의 필요성 만약 2차원 좌표를 10개 만들어야 한다면? struct Point2D{ int x; int y; }; // 구조체 변수 10개 선언 struct Point2D p1; struct Point2D p2; ... struct Point2D p10; 이렇게 반복 노가다를 하는 방법도 있겠지만, 수 천개의 구조체는 만들다가 인생이 다 가버릴지도 모른다. 일반 자료형과 같이 배열로 구조체를 만들면 되는 일을 굳이 이렇게 할 필요가 없다. struct Point2D p[3000]; // 요소가 3,000개인 구조체 배열 선언 2. 구조체 배열 선언하기 #include struct Point2D { int x; int y; }; int main() { struct P..

[Java] equals()와 ==의 차이점 [내부링크]

[Java] equals()와 ==의 차이점 equals()는 Object 클래스의 메소드이다. public boolean equals(Object obj) { ... } equals()는 리턴값으로 boolean 형식을 가진다. 모든 객체를 인자로 받을 수 있다. 자바에서는 두 객체를 동등 비교할 때 equals() 메서드를 사용한다. equals()는 두 객체를 비교해서 논리적으로 동등하면 true를 리턴하고, 그렇지 않으면 false를 리턴한다. 여기서 논리적 동등성은 같은 객체든 다른 객체든 객체가 저장하고 있는 데이터가 동일함을 의미한다. 즉, 객체의 메모리 번지를 비교하는 것이 아니라, 문자열이나 숫자가 같은지를 비교하는 것이다. == : 동치성 비교. 달이라고도 하고 moon이라고도 하지만,..

[Java] ArrayList의 정의, 직접 구현해보기 [내부링크]

[Java] ArrayList의 정의, 직접 구현해보기 1. ArrayList에 대하여 1) Array와의 차이 ArrayList는 List 인터페이스의 구현 클래스이다. ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다. 일반 배열과 ArrayList는 인덱스로 객체를 관리한다는 점에서는 유사하다. 하지만, 배열은 생성될 때의 크기로 고정되는 반면, ArrayList는 저장 용량을 초과한 객체가 들어오면 저장 용량이 자동으로 늘어난다. 객체 생성 시 다음과 같은 구조로 힙에 데이터 공간이 확보되게 된다. 2) ArrayList 생성하기 생성을 위해서는 저장할 객체 타입을 “타입 파라미터”로 표기하고 기본 생성자를 호출하면 된다. List list new ArrayList(); 이렇게 하면, ..

[스터디] 자바와 절차적/구조적 프로그래밍 [내부링크]

[스터디] 자바와 절차적/구조적 프로그래밍 5주간 라는 책을 가지고 스터디를 진행하게 되었다. 기본적인 자바 사용법을 알고 있지만, 객체 지향의 개념이라던지, 디자인 패턴이라던지 하는 것이 와닿지 않고 실제 프로그램의 코드를 계획하고 직접 쓸 때 전반적인 개념을 활용하지 못하는 사람에게 적절한 책이다. 1장은 서문과 같은 느낌이다. 다만, 좀 더 상세한 부분이 있다. 이번 글에서는 2장 절차적/구조적 프로그래밍을 중심으로 다룰 예정이지만, 짤막하게 정리하고 넘어가고자 한다. 1. 1장 간략 정리 1) 기술의 발전사 기술은 사람이 필요한 것들을 품으면서 발전해왔다. 기계어에서 어셈블리어, 어셈블리어에서 C언어 계열, C언어에서 C++, C++에서 Java 여기에 빠진 언어들이 있겠지만 대표적인 언어들로 하..

[C언어] 문자열을 활용한 여러 함수 만들기 [내부링크]

[C언어] 문자열을 활용한 여러 함수 만들기 1) 주어진 문자열이 원래 문자열의 시작점부터 일치하는 지 확인하는 함수 구현 // start_with #include // c언어의 타입 정의 typedef int bool; // 이렇게 하면 타입을 정의할 수 있다. #define true 1 // 값에 대한 별명 #define false 0 int get_length(char* b){ int length = 0; while(1){ if(b[length] != '\0'){ length++; continue; } break; } return length; } bool starts_with(char* a, char* b){ for(int i = 0; i < get_length(b); i++){ if(a[i] !..

[CS] 결합도와 응집도 [내부링크]

[CS] 결합도와 응집도 좋은 도구를 가지고 요리를 하는 방법은 너무나도 많다. 직접 화로에 고기를 굽는 방법도 있고, 스테인리스 팬에 고기를 튀기듯 굽는 방법도 있다. 그런데 멀쩡히 가스레인지가 있음에도, 화로를 피워서 그 위에 스테인리스 팬을 두고 고기를 굽는 것은 정말 비효율적인 방법이라고 할 수 있다. 도구를 올바르게 사용하는 법이 있듯, 객체 지향의 특성을 올바르게 사용하는 방법, 즉 객체 지향 언어를 이용해 객체 지향 프로그램을 올바르게 설계해나가는 방법이 있다. 많이 알려진 원칙은 SOLID(객체 지향 설계 5원칙)이다. 이것을 알아보기 이전에 결합도와 응집도를 먼저 알아보고자 한다. 다섯 가지의 원칙들도 결합도를 낮추고 응집도를 높이는 과정에서 모두 만들어진 것이라고 볼 수 있다. 그렇기 ..

[C언어] C언어 구조체(struct) [내부링크]

C언어 구조체(struct) Goal. : 구조체의 기본 활용방법부터 포인터를 이용한 구조체 값 변경방법까지 이해한다. 1. 구조체가 만들어진 이유. C언어는 자료를 체계적으로 관리하기 위해 구조체라는 문법을 사용한다. 코드를 구현하다보면 많은 변수들이 선언이 되는데, 이 중 중복적으로 사용되는 코드들이 있다. void introduce(int age, char* name, char* hometown, char* favorite_food); void talk(int age, char* name, char* hometown, char* favorite_food); int main() { int person1_age = 20; char* person1_name = "홍길동"; char* person1_hom..

애써 힘 주지 않아도 되는 부분 [내부링크]

[생각정리] 애써 힘주지 않아도 되는 부분 (feat. 인스턴스와 객체의 차이) 주말을 맞아 토요일 하루를 쉬고 일요일 아침, 한 주간 공부했던 것을 정리하고, 포스팅할 것들을 다듬고 있을 때였다. 객체와 인스턴스라는 단어를 치다가, 과연 내가 이것에 대해 정확하게 쓰고 있는지 의문이 들었다. 데이터화 된 것이 인스턴스, 현실로 이야기할 수 있는 것이 객체라고 했던가...? 그러니까 변수에는 인스턴스가 담기는 것이 맞는 이야기가 되는 거지...? 슬쩍 자신이 없던 나는 코리안 티스토리를 뛰어넘어 스택 오버플로우로 흘러들어 갔다. difference between an Instance and an Object? 약 12년 전, 이런 생각을 하고 있던 개발자가 있었을 것이다. 짧은 질문에 대한 답변 중 가장..

[C언어] 문자열 활용하기 [내부링크]

[C언어] 문자열 활용하기 1. 문자와 문자열 C언어에서 문자와 문자열은 다른 자료 구조이다. 문자(character) : ‘a’, ‘b’, ‘$’ ‘@’ 등과 같은 단일의 기호를 말한다. 작은따옴표 안에 기호를 쓴다. 정수나 실수 데이터도 작은따옴표 안에 있으면 문자로 인식된다. ‘13’은 문자 처리가 되지 않아 오류가 생길 수 있다. 문자열(String) : “nice”, “안녕” 등과 같이 두 개 이상의 문자 결합 구조를 가진다. 큰따옴표 안에 기호를 쓴다. 1) 문자의 선언 방법 C언어의 문자 자료형은 메모리 한 칸에 하나의 문자만 삽입될 수 있다. char 변수명 = '변수값'; 메모리 안에 변수의 값이 들어가게 된다. 2) 문자열의 선언 방법 메모리 한 칸에 하나의 문자만 들어갈 수 있기 때문..

[Java] 생성자와 NullPointerException [내부링크]

[Java] 생성자와 NullPointerException 생성자를 공부하다가 NullPointerException을 만났다. 초보 개발자들은 누구나 이 예외문을 만나보았을 것이다. 그렇다면, 이 예외를 어떻게 해야 만나지 않을 수 있을까. 어떤 부분을 신경써서 보아야 하는 것일까? 1. NullPointerException의 정의 실제 값이 아닌 null을 가지고 있는 객체 또는 변수를 호출할 때 발생하는 런타임 오류이다. null 값을 가지고 있는 것을 가지고 toString을 한다 던지, 어떤 객체 안에 있는 null 값을 가지고 있는 변수를 호출한다던지 할 때 발생한다. String data = null; System.out.println(data.toString()); // ~~~~(NullPo..

[CS] 객체지향 디자인패턴 [내부링크]

[CS] 객체지향 디자인패턴 Java의 객체 지향을 공부하다 보면, 어떻게 객체 지향 프로그램을 잘 '설계'하고 개발해나갈 것인가를 고민하게 된다. 이 때 우리에게 답을 주는 것이 "객체 지향 디자인패턴"이다. 그림을 그리는 것 같은 디자인도 사람의 영감을 받아 어떤 디자인이나 기호, 캐릭터를 만들어내는 것 같지만, 그림을 그리는 디자인에도 일정한 패턴이 존재한다. 다른 말로 하면, '성공의 공식' 같은 것....! 마찬가지로 소프트웨어 설계 부분에서도 일정한 성공의 공식 패턴이 있다. 프로그램을 설계할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴을 의미한다. 디자인 패턴을 참고하여 개발을 할 경우 개발의 효율성과 유지보수성, 운용성 등의 품질이 높아지며, 프로그램의 최적화에 도움이 된다. 구성..

[Java] Random 함수의 작동원리 [내부링크]

[Java] Random 함수의 작동원리 갑자기 그런 생각이 들었다. Random은 정말 랜덤하게 난수를 생성할까? Java에서 랜덤을 활용하는 방법은 대표적으로 두 가지가 있다. Math 클래스의 random() 메소드를 활용하는 것과 Random 클래스의 next 메소드 시리즈를 사용하는 것. 숫자 놀이가 재미있어서 여기까지 오게 되었다... 이전에 만들어본 자바 로또 번호 추출기를 이용해서 Random 클래스의 작동원리에 대해서 알아보겠다. import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; import java.util.Random; public class Lotto { public static voi..

[Java] 접근제한자(public, default, protected, private) [내부링크]

[Java] 접근 제한자(public, default, protected, private) 객체 지향적 설계를 할 때 개발자들은 메인 메소드를 가지지 않는 클래스를 만들어낼 것이다. 외부 클래스에서 이용할 목적으로 설계되었기 때문에 외부 클래스에서 쓰지 않아야 하는 변수도 있을 수도 있고, 섞이면 곤란한 메소드들도 있을 것이다. 객체 생성을 막기 위해서 생성자를 호출하지 못하게 하거나, 특정 데이터를 보호하기 위해 필드에 접근하는 것을 막아야 할 때도 있다. 이럴 때, 접근 제한자를 사용한다. 접근 제한자는 네 가지 종류가 있다. public 접근 제한자는 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버를 만든다. protected 접근 제한자는 같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버를..

[Java] static 활용 [내부링크]

[Java] static 활용 intelliJ를 사용하다보면, psvm이라는 단축어를 쓸 때가 있다. 메인 메소드를 만들 때 쓰는 것이다. 메인 메소드는 다음과 같은 코드를 써야 만들 수 있다. public static void main(String[] args){ } public은 그렇다 치고, main은 메소드 이름이고, void는 메소드 타입이고, 그럼 static은 무엇인가? static은 ‘고정된’이라는 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 의미한다. 각각 정적 필드, 정적 메소드라고 부른다. 정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다. 쉽게 이야기하면, 하나의 클래스..

[CS] 테스트와 TDD [내부링크]

[CS] 테스트와 TDD 개발자의 필수 역량은? 기능을 빠르게 구현하는 것. 기능에 해당하는 테스트를 작성하는 것. 두 가지라고 할 수 있다. 빠르게 구현을 했다 하더라도, 그것이 신뢰가 없는 코드면 개발자는 쓸모 없는 에너지 드링크를 마시며 쓸모 없는 시간을 낭비한 것이라고 봐도 될 듯하다. 내가 쓸모 없는 시간을 보내지 않기 위해 나를 도와주는 것, 구현을 하고 나서 그것이 신뢰가 있는지를 확인해 볼 수 있는 것. 그것은 바로 '테스트 케이스'이다. 테스트란 무엇인가? 개발자 세상에서 테스트란, 소프트웨어 테스트를 말한다. 제품(함수, 특정기능, UI, 성능, API 스펙 등)이 예상하는 대로, 원하는 대로 동작 하는지 확인하는 것이다. 제품 또는 서비스의 품질을 확인하고 소프트웨어의 버그를 찾는 것..

[Web] 웹의 진화과정(SSR, CSR, SSG, JAM Stack) [내부링크]

[Web] 웹의 진화과정(SSR, CSR, SSG, JAM Stack) 20여년 간 웹 기술은 폭발적으로 성장해온 것 같다. 위와 아래를 비교해보면 우리는 그 변화를 실감할 수 있다. 예전에는 서버에서 모든 문서를 가지고 있고, 구현을 할 것이 있으면 구현을 해서 사용자의 컴퓨터에 그 데이터를 쏴주었다면, 지금의 애플 공식 홈페이지와 같은 것은 서버단에서 구현을 해서 보내주는 것이 아니라, 이런 식으로 브라우저에서 구현을 하라는 코드를 쏴준다. 기술이 많이 발전했기 때문에, 무엇인가 스르륵 움직이는 것도 구현이 가능해진 것이다. 어케했냐를 물어볼 때에는, 과거를 살펴보고 발자취를 들여다보는 것이 좋을 때가 있다. 웹의 발전사가 그러하다. 이번 포스팅에서는 SSR SSG JAM Stack(CSR, SEO,..

[Java] 상위 클래스의 타입으로 변수 선언을 하는 이유 [내부링크]

[Java] 상위 클래스의 타입으로 변수 선언을 하는 이유 - 다형성 추가. 1. 다형성에 대한 의문점 발동 이전에 다형성에 대해 알아본 적이 있다. 그 때는 이해했지만, 무엇인가 알기 어려운 '왜'라는 질문을 자꾸 품게 되었다. 2022.06.13 - [프로그래밍 언어/Java] - [Java] 다형성(Polymorphism) 알아보기 [Java] 다형성(Polymorphism) 알아보기 [Java] 다형성(polymorphism) 알아보기 칼은 참 다양한 종류가 있다. 요리할 때만 해도, 과일칼, 채소자르는 칼, 고기 다지는 칼, 빵칼 등등등.. 요리 용도가 아니라 도축, 수술 등등 많은 곳에서 쓰는 masterpiece-programming.tistory.com (1) 굳이 상위 부모클래스의 타입으..

로또 번호 추출기 3탄(자바) [내부링크]

로또 번호 추출기 3탄(자바) 인간의 욕심은 끝이 없고 무한한 성능 향상을 꿈꾼다. 자바의 문법들을 다시 상기하고, 메모리 구조에 대한 것들을 하나씩 배우는 요즘, 공부를 하다가 잠깐 쉬고 싶어서 딴 짓을 하고 싶어졌다. 현재 그냥 무난하게 장난 치면서 가지고 놀 수 있는 것은 로또 추출기다... python에서 루프의 횟수가 1억번인 것을 10억번으로 늘려서 해보기로 했다. '더 빠르지 않을까...?'라는 생각에 import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; public class Lotto { public static void main(String[] args) { System.out.println(..

백엔드 초보 개발자 공부 순서 [내부링크]

백엔드 초보 개발자 공부 순서 어디로 가야할 지 모르는 개발자 나는 컴퓨터공학과는 전혀 관련이 없는 학과를 전공했고, 1년 전까지만 해도 컴퓨터를 잘 다루긴 했지만, 프로그램이니 데이터베이스니 하는 것은 들어보기나 했지 할 줄은 전혀 몰랐다. 여기서 들어보았다는 것도, 그 '이름'을 들어봤다는 것이지, 그것이 무엇이고 어떻게 작동하는 것인지는 관심도 없었고 알아볼 생각도 전혀 하지 않았다. 이유야 어찌됐든 직업으로서 백엔드 개발자를 생각하고 공부하는 나는 무엇을 할 지 모르고 이것 저것 찾아보다가 python을 알게 되었고, print("hello world")를 따라 적어보았다. 데이터 타입과 반복문, 조건문 등을 학습하며 VS Code에서만 돌아가는 은행 입출금 프로그램을 만들었고, 로또 번호 추출기..

[Web] Content Delivery Network(CDN) [내부링크]

[Web] Content Delivery Network(CDN) 1. CDN의 필요성 CDN는 컨텐츠를 서버에서 사용자에게 전송하는 네트워크이다. CDN이 없이도 온라인 서비스들이 동작은 하지만, 서버도 결국 컴퓨터다. 어떤 클라이언트가 사이트에 접속하면, 그 요청에 따라 서버는 컨텐츠를 찾아 보내주는 어떤 '일'을 해야한다. 그것의 트래픽이 엄청나게 증가한다면...? 서버의 용량 또는 성능이 좋지 않고서는 주저 앉고 말 것이다. 그렇다 컴퓨터도 컴퓨터다! 자기 자신의 능력만큼만 일할 수 밖에 없는 기계! 이것의 과부하를 줄여주기 위해서 CDN이 있는 것이다. 현재 사용자가 10명이어도, 잠재적 사용자는 이 순간에도 늘어나고 있다. 우리 나라에서 만들어진 서비스여도, 다른 곳에서 그 서비스를 원할 수도 ..

[Web] 웹 서버 : apache, NginX, Tomcat [내부링크]

[Web] 웹 서버 : apache, NginX, Tomcat 1. 웹이 우리에게 오기까지 HTML, CSS, JavaScript 등의 파일은 페이지를 구현하기 위해 필요한 문서들이다. 이 문서들은 클라이언트에 있는 것이 아니라, 그 정보를 저장하고 있는 어느 서버에 들어있다. 자사 서비스를 제공하는 네이버의 경우 네이버의 서버실에 그 문서가 들어있을 것이고, 어떤 클라우드에 그 문서를 올려놓았을 경우, 예를 들어 깃허브 저장소를 사용할 경우 깃허브 서버 어딘가에 그 문서가 들어있는 것이다. 그 서버에 있는 문서 파일들은 특정 디렉토리에 넣어두는데, 이 디렉토리를 외부에서 접근 가능하도록 개방해서 서버에 지정된 웹 사이트 주소로 접속하면 이것들을 받아갈 수 있도록 하는 것이 웹 서버이다. 이 구동 방식은..

갤러리에서 작품을 바라볼 때. [내부링크]

[제목] 갤러리에서 작품을 바라볼 때. 문화생활을 즐길 때, 어떤 전시 공간에 갔다. 당신은 그 전시 공간에 있는 작품들을 보면서 어떤 생각을 하는가? 당신이 예술에 대한 조예가 없어도 예술 작품을 즐길 수 있다. 우리는 아래와 같은 생각을 전시장에서 하지 않는가?! (지루하다는 현재 상태에 대한 생각 제외하고...) 예쁜 작품이다...! 우와 엄청나게 역사적 가치가 있는 작품이네...! 인스타그램 스토리에 딱인 게시물이다...! 옛날에 내가 했던 생각이 떠오른다...! 이 작가는 왜 이런 작품을 만들었을까...? 나는 모든 생각을 다 해보았다. 하얀 벽 또는 어떠한 벽, 천장, 바닥으로 되어 있는 전시 공간은 우리가 이런 생각을 하게끔 만들어 준다. 그런데 그 공간에서 느껴야 할 생각, 더 가치있게 즐..

예술이란 무엇인가....! [내부링크]

예술이란 무엇인가....! 박물관은 현장체험학습으로 다녀보았지만, 미술관이라고는 다녀보지도 않았고, 예술이라는 것과는 거리가 멀었던 사람이... 아니 예술에 대한 모독을 입에 담고 달던 사람이... 미술과 관련된 학과에 몸을 담게 되었고, 어찌하다 보니 졸업을 하게 되었다. 그런데, 전혀 다른 길을 걷게 되었고, python을 흡수하고, java를 흡수하며 웹이라는 공간에서 새로운 삶을 찾아나가고 있다. 나는 정말 미술, 예술과는 정말 동떨어진 삶을 대학 입학 전까지는 살았었다. 아니 저게 무슨 예술이야, 점 하나 찍어놓은 것이 무슨 예술이냐고. 내가 똥 싸놓고 미술작품이라고 하면 미술 작품이냐고. 앤디 워홀은 이런 말을 한 적이 있다. "일단 유명해져라. 그러면 당신이 똥을 싸더라도 사람들은 박수를 칠..

[C언어] 배열과 포인터의 관계 [내부링크]

[C언어] 배열과 포인터의 관계 배열과 포인터는 매우 긴밀한 관계를 맺고 있다. 어떤 부분에서는 서로를 대체할 수도 있다. 일반적으로 다른 언어를 배우면 배열이 다음과 같다는 것을 이미 알고 있을 것이다. int arr[5] = {1, 2, 3, 4, 5}; int b = arr[1]; // b는 2라는 값을 가지게 된다. 변수들이 모여 있는 것이 배열이 아닌가? 라고 생각할 것이다. 맞다. 그것도 옳은 말이다. 그런데 그 근본에는 '포인터'가 있다. 배열에 인덱스로 접근하는 자바의 문법도 '포인터'를 쉽게 사용하게끔 바꾸어 놓은 것에 불과하다. 아래에서는 포인터 상수 개념과 포인터로 배열에 접근하는 방법에 대해 알아볼 것이다. 1. 포인터 상수(배열의 이름) 포인터 상수(Constant Pointer)..

[C언어] call-by-reference vs call-by-value [내부링크]

[C언어] call-by-reference vs call-by-value 정말 배우면 배울 수록 멱살을 잡고 흔들어 재끼고 싶은 C언어. 포인터 변수 / 포인터 상수 / 상수 포인터 등등등 무슨 비슷한 말은 많고 뜻은 전혀 다르고 처음들어보고... 하지만 살살살 알아가는 것이 공부의 재미 아니겠나... 이번 포스팅은 저번에 scanf를 다루다가 알게된 call-by 시리즈에 대해 알아보고자 한다. ️ call by value는 값에 의한 호출이라고 하며, ‘인자’로 받은 값을 ‘복사’하여 처리한다. ️ call by reference는 참조에 의한 호출이며, ‘인자’로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. 그림으로 쉽게 보는 두 가지 개념 Call by value(값에 의한 호출) 실제..

[C언어] scanf가 변수의 주소(&)를 매개변수로 넘겨주는 이유 [내부링크]

[C언어] scanf가 변수의 주소(&)를 매개변수로 넘겨주는 이유 키보드로 프로그램 내에 어떤 변수를 첨가하는 함수. java에는 대표적으로 Scanner, BufferedReader가 있고, python에는 input(), sys.stdin.read~~() 시리즈가 있다. C언어에는 scanf가 있는데, 이것이 어떻게 작동하는 지 알아볼 것이다. int main(){ int input; printf("정수를 입력해주세요. :"); scanf("%d", &input); return 0; } 위의 코드는 아래와 같이 콘솔창을 만들 수 있는 코드이다. input이라는 변수 안에 사용자가 키보드로 입력한 값을 담는 것이다. scanf의 첫번째 인자는 받아올 데이터의 타입을 입력하고, 두번째 인자에는 변수의 ..

[Web] 쿠키(cookie), 세션(session) 캐시(cache)의 정의 [내부링크]

[Web] 쿠키(cookie), 세션(session) 캐시(cache)의 정의 2022.07.01 - [IT 지식/Web] - [Web] HTTPS와 HTTP의 차이 이전 글에서 HTTP는 stateless 하다는 이야기를 했다. 이전에 접속한 것과는 별도로 HTTP가 통신을 한다는 이야기였는데, 일반적으로 홈페이지 안에서는 매번 페이지가 바뀔 때마다 로그인을 할 수는 없는 노릇이다. 또한 장바구니에 담아놓은 상품들이 없어지고 하는 등의 불편을 겪을 수 있다. 그래서 쿠기와 세션, 캐시가 사용되는 것이다. 1. 쿠키(cookie) 사용자의 브라우저에 저장되고, 통신할 때 HTTP 헤더에 포함되는 텍스트 파일이다. 이름, 값 만료기간, 경로 정보가 있고 키와 벨류로 구성이 되어 있다. 사용자의 컴퓨터를 사..

[CS] 프로세스와 스레드 [내부링크]

프로세스와 스레드 1. 프로세스의 개념 어떤 작업을 위해 실행할 수 있는 파일을 '프로그램'이라 한다. 그 프로그램이 컴퓨터에서 연속적으로 실행될 때, 그것을 프로세스라고 한다. 메모리에 올라와서 실행되고 있는 프로그램의 인스턴스를 가리키기도 한다. 프로세스는 CPU 시간, 운영되기 위해 필요한 주소공간, code-data-stack-heap의 구조로 된 독립된 메모리 영역을 자원으로 할당받는다. 여러 프로세스를 함께 돌리는 작업은 동시적, 병렬적, 또는 이 둘의 혼합으로 이루어 진다. 동시성은 프로세서 하나가 이거 조금 하고 이거 조금 하고 이거 조금 하고, 이렇게 여러 작업을 돌아가면서 일부분씩 진행하는 것이다. 이 과정이 빠르게 돌아가면 사람들은 이 프로세스들이 동시에 진행되는 것처럼 느낄 수 있다..

[CS] 동기와 비동기의 개념 차이 [내부링크]

[CS] 동기와 비동기의 개념 차이 우리는 이 개념어를 처음 들어보았을 수 있다. 하지만, 이 개념은 우리 일상속에 깊숙히 자리하고 있다. 평일 동안 열심히 일을 하거나 학교를 다니거나, 열심히 학원을 다니거나 해서 집안일에 소홀해져 집안이 엉망이 되었다고 하자. 주말을 맞이해서 우리는 집안을 원래대로 복구시켜 놓아야 한다. 밀린 빨래부터 널부러져 있는 옷가지, 수북히 쌓인 설거지 더미, 버리지 않아 초파리가 하나 둘 씩 생겨가고 있는 음식물 쓰레기 봉투, 방바닥에 널린 머리카락... 생각만 해도 3시간은 치워야 할 것 같다. 집안일은 어려운 것이 아니라 귀찮은 것이다. 그렇다면 귀찮은 일은 후딱 해치우고 다른 여가생활을 즐겨야 하지 않겠는가. 그럼 집안일을 시작해보자. 집안일을 빨리하고자 하는 사람은 ..

[JavaScript] Scope란 무엇인가? [내부링크]

[JavaScript] Scope란 무엇인가? 자바스크립트를 하다 보면 스코프라는 단어를 많이 접할 수 있다. 스코프는 우리말로 '범위'라는 뜻을 가지고 있다. 즉, 스코프는 변수에 접근할 수 있는 범위를 의미한다. global(전역)과 local(지역)이 그 예가 될 것이다. 전역 스코프는 전역에 선언되어 있어 어느 곳에서든지 해당 변수에 접근할 수 있다는 의미이고, 지역 스코프는 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에서는 참조 또는 접근 할 수 없다는 의미이다. 함수 스코프가 지역 스코프의 한 예이다. 이것은 자바의 특수한 변수 체계 때문에 더욱 알아야 되는 개념인데, 아래에서는 var, let의 차이점을 중심으로 Scope가 무엇인지를 알아볼 것이다. 1. 레벨 스코프 var a = 1..

[Web] REST API와 GraphQL [내부링크]

[Web] REST API와 GraphQL ~목차~ RESTful API GraphQL REST API와 GraphQL의 비교 1. RESTful API 1) REST API 간단 요약 RESTful API는 HTTP 요청을 사용하여 데이터에 액세스하고 사용하는 애플리케이션 프로그램 인터페이스(API)의 아키텍처 스타일이다. GET, PUT, POST 및 DELETE 등의 메소드를 활용하여 서버에 있는 리소스에 접근하고, 그것을 json 등의 파일 형태로 받아오는 방식인 것이다. 하는 데 데이터를 사용할 수 있다. 쉽게 설명하면 다음과 같다. 소프트웨어가 다른 소프트웨어로부터 지정된 형식으로 요청, 명령을 받을 수 있는 수단을 API(Application Programming Interface)라고 한다..

[Web] 암호화 해시함수에 대한 이해 [내부링크]

[Web] 암호화 해시함수에 대한 이해 이전에 해시 테이블 포스팅에서 해시 함수에 대해 다루어 본 적이 있다. 2022.05.15 - [프로그래밍/자료구조] - [자료구조] hash table(해시 테이블) python class 구현하기 [자료구조] hash table(해시 테이블) python class 구현하기 [자료구조] hash table(해시 테이블) python class 구현하기 살펴볼 주요 개념: 더보기 - 해시 테이블의 개념, 특징, 용도 - 해시 함수 - 해시 충돌 회피 - 해시 테이블 클래스 구현(python) 1. 해시 테이. masterpiece-programming.tistory.com 해시는 자료구조에만 쓰이는 것이 아니라, 보안이 필요한 통신에서도 사용이 된다. 해시 함수는..

[Web] HTTPS와 HTTP의 차이 [내부링크]

[Web] HTTPS와 HTTP의 차이 ️ HTTPS란 무엇인가? (Hyper Text Transfer Protocol Secure) HTTP에 S, 즉 데이터 암호화가 추가된 프로토콜이다. HTTPS를 설명하기 위해서는 전신인 HTTP를 설명하지 않을 수가 없다. HTTP는 클라이언트(사용자)가 요청(request)을 서버에 보내면 서버는 HTTP 응답(response)을 해주는 구조에서 작동한다. 그리고 stateless 한데, state(상태)를 저장하지 않는다는 뜻이다. 바늘로 찌르면 그 부분의 몸이 움찔할 뿐, 다른 부분을 움찔하지는 않는 것 처럼, 어떤 요청이 오면 어떤 요청에만 응답을 하고, 다른 응답과는 연관되어있지 않다는 이야기이다. 이 때문에 클라이언트가 요청을 보내고 응답을 받은 후..

[C언어] 배열 기초개념과 포인터로 배열 참조하기 [내부링크]

[C언어] 배열 기초개념과 포인터로 배열 참조하기 C언어의 변수와 포인터를 알았다면, 이제 배열에 대해 알아나가고 배열을 활용하여 자료구조도 공부하고 데이터도 공부하고... 막 그러는 것이 아닐까 싶다. 생기초를 들여다 보았다면, 배열부터는 이제 정말 기초 개념이라고 할 수 있다. 아래에서는 배열을 사용하는 이유와 포인터로 배열을 참조하는 방법, 그리고 C언어의 배열이 메모리를 어떻게 사용하는 지에 대해 알아볼 것이다. (배열 문법을 사용하는 것은 여타 다른 언어들과 다른 점이 거의 없기 때문에 다루지는 않을 것이다.) ️ 배열을 사용하는 이유 순서있는 데이터 관리 관련된 데이터를 모아서 관리 변수 1개로 공간 여러 개를 컨트롤 할 수 있다. index로 접근하여 빠르게 탐색을 할 수 있다. ️ 포인..

[Git 블로그] 블로그 제작 시 볼 수 있는 오류 [내부링크]

[Git 블로그] 블로그 제작 시 볼 수 있는 오류 "Generating development JavaScript bundle failed" 어떤 개발 환경이 npm run start가 된 상태에서 바뀐 다음, 정지를 시키고 다시 run start를 하면 자주 일어나는 오류이다. 그럴 경우, 아래의 터미널 명령어를 입력해주면 해결될 수 있다. npm rebuild node-sass 블로그 제작을 위해 IDE 상에서 npm run start를 해놓은 상황이라면, 버전 업데이트라던지, 설정 변경, 새로운 개발 도구 설치 등을 지양해야 할 것이다. 안 그러면 이러한 충돌 또는 오류가 일어난다.

Homebrew not in your PATH 오류 해결 방법 [내부링크]

Homebrew not in your PATH 오류 해결 방법 homebrew를 설치 했는데도 brew -v를 하면 버전이 뜨지 않거나 아래와 같은 오류문이 뜬 적이 있을 것이다. Warning: /opt/homebrew/bin is not in your PATH 패스 설정이 되어 있지 않아서 발생하는 오류이다. 패스를 설정하면 되는 부분이기 때문에, 간단한 명령어 하나면 충분하다. vim 에디터에 들어가서 수정을 해주면 되지만, echo 명령어 한 줄로 더 간단하게 등록할 수 있다. echo 'export PATH=/opt/homebrew/bin:$PATH' >> ~/.zshrc 이거 한 번이면 등록이 된다. 바로 이제 버전 명이 뜨는 것을 알 수 있다.

Xcode 애플 개발자 페이지에서 다운로드, 설치하기(m1) [내부링크]

Xcode 애플 개발자 페이지에서 다운로드, 설치하기(m1) 깃을 요즘 한참 배우다가 깃허브 블로그를 만드는 수업을 들었다. gatsby를 활용한다고 하여 이것 저것 챙겨보던 중에 xcode의 무엇인가를 필요로 한다는 내용을 보았다. https://www.gatsbyjs.com/docs/tutorial/part-0/#nodejs Part 0: Set Up Your Development Environment | Gatsby Introduction Welcome to the Gatsby Tutorial! We’re excited you’re here. Before you start building your first Gatsby site, you’ll need to familiarize yourself wi..

[C언어] 다중포인터 구현해보기 [내부링크]

[C언어] 다중포인터 구현해보기 포인터는 이제 어느 정도 이해를 하고, 어떤 것을 가리키든 그것이 무엇인지 알 수 있다면? 다중포인터를 알아보는 것이 좋겠다. 다중 포인터는 다른 것이 없다. 그냥 포인터가 여러 개 겹겹이 쌓인 것이라고 할 수 있다. p -----> a -----> b -----> 10 이렇게 변수들이 서로를 가리키고 있다고 하자. int b = 10; int *a = &b; int *p = &a; 이렇게 있다고 볼 수 있다. 하지만 이런 식으로 코드를 작성하면 오류를 경험할 수 있다. int b = 10; int *a = &b; int **p = &a; == int *(*p) = &a; 이렇게 나타내야 한다. (*p)가 가리키는 곳이 &a이다라고 설정을 해주어야 한다. 그래서 **이 쓰..

[C언어] 포인터를 사용하는 진짜 쉬운 이유. [내부링크]

[C언어] 포인터를 사용하는 진짜 쉬운 이유. 포인터는 초급 개발자의 뇌를 심각하게 트레이닝 시킨다. 이중 삼중으로 들어가는 포인터에 메모리 구조를 상기시켜야 하고, 이게 어디들어가는지, 누구를 참조하는 지 참 복잡하고 헷갈릴 때가 많다. 현재 나 또한, 그 과정 어디엔가 있는 것 같다. 이번 포스팅에서는 이전까지 다루어왔던 메모리 구조, 포인터의 정의에서 나온 말들을 하나씩 디스크 조각모음을 하여 왜 우리가 포인터에 대해서 알고, 어떻게 활용해야 할 지를 이야기 해 볼 것이다. C언어는 개발자가 원하는 대로 메모리를 관리할 수 있다고 누구든 이야기를 한다. 그런 이점을 활용해서 메모리를 아낄 수 있고, 효율적인 프로그램을 개발자가 만들 수 있다고 많은 사람들은 결론을 짓는다. 그렇다. 그렇기 때문에 '..

[C언어] 포인터 기본 개념 알아보기 [내부링크]

[C언어] 포인터 기본 개념 알아보기 c는 매뉴얼이 많다. 자바가 일반 자동변속기 승합차라면, c는 90년대 대형버스라고 할 수 있다. 많은 것들을 내가 스스로 조작할 수 있다. 변속이라던지, 가속이라던지, 문을 열고 닫는다던지, 저단 기어를 넣어서 느리지만 힘을 가지고 갈 지 등등, 많은 것들을 개발자가 조종할 수 있다. 그래서 Low 레벨 언어라고도 한다. 포인터는 메모리 주소와 연관되어 있는 문법이다. 메모리는 이전 글에서 살펴봤듯, 힙과 스택 영역에 위치한다. 이전글 : 2022.06.27 - [프로그래밍 언어/C\C++] - [C언어] C언어의 메모리 관리 그 스택 영역은 고유한 주소값을 가지고 있고, 포인터를 쓰면 변수가 저장된 메모리 주소를 불러올 수 있다. 메모리 주소를 불러온 것을 가지고..

zsh, bash 그리고 shell script [내부링크]

zsh, bash 그리고 shell script 쉘은 리눅스에서 명령어와 프로그램을 실행할 때 사용하는 인터페이스이다. 커널과 사용자 사이에 위치하면서 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 돌려주는 아주 고마운 친구이다. 쉘은 커널에서 분리된 별도의 프로그램이어서 다양한 종류의 쉘이 존재한다. 각각의 쉘 들은 제공하는 기능이 살짝식 다르다. 1) bash(배쉬) 리눅스의 표준 쉘이다. 우분투와 페도라도 배쉬 쉘을 사용한다고 한다. sh(Bourne Shell, 유닉스 쉘의 오리지널)을 전신으로 두고 있어서 sh와 호환되어 쓰일 수 있다. 맥 OS X, 그리고 윈도우에도 이식이 되었으며 mac의 경우 최근 기본 제공을 zsh로 하고 있다. 배쉬는 프로그래밍 언어이긴 하지만, 유닉스 운영체제의..

[Java] 자바의 메모리 사용 구조 [내부링크]

[Java] 자바의 클래스와 메모리 사용 구조 자바는 메모리를 관리해준다. Garbage Collector가 개발자가 만들어놓고 사용하지 않는 객체들을 수거하고 stack은 변수가 들어왔다 나갔다 하면서 stackoverflow가 일어나지 않게 만들어준다. 그렇지만, 내가 만든 변수가 어디에 저장되고 어떤 식으로 동작을 하는지는 알아야 한다. 그래야 컴퓨터의 성능을 최대한 활용하는 프로그램을 만들 수 있으니까. 이번 포스팅에서는 아래와 같은 클래스와 변수들이 존재할 때, 자바는 메모리를 어떻게 사용하는 지를 알아본다. 상속, 다형성의 개념도 함께 다룰 것이기 때문에, 상속 또는 다형성이 잘 이해가 되지 않는다면, 아래의 이전 글을 참조하는 것이 좋을 것 같다. 2022.06.13 - [프로그래밍 언어/J..

[Java] 클래스 제대로 알아보기 [내부링크]

[Java] 클래스 제대로 알아보기 앞선 포스팅에서 클래스 변수와 인스턴스 변수만 이야기하고, 클래스에 대한 이야기는 하지 못했다. 그래서 다음 포스팅인 메모리 사용구조와 더불어서 클래스에 대해 알아보는 시간을 가지려고 한다. 클래스는 사용자가 자주 활용하는 변수, 메소드, 생성자 타입 등을 모두 보관해놓은 문서이다. 메인 클래스 하나로만 코딩을 하는 것은 절차 지향이고, 클래스를 여러 개 나누어서 모듈화시켜 놓은 것을 객체 지향 프로그래밍이라고 한다. 만약, ‘비빔밥 식사’라는 행위를 ‘프로그래밍’에 비유한다고 하면, 비벼놓은 비빔밥이 절차지향이고, 비빔밥들의 재료들만 깔끔하게 손봐놓은 것이 객체지향 방식의 취식 방법이라고 할 수 있겠다. 클래스는 아래와 같이 따로 존재한다. ++ : 보통 클래스는 다..

[C언어] C언어의 메모리 관리 [내부링크]

[C언어] C언어의 메모리 관리 함수가 사용될 때 메모리가 얼마나 필요한가? 메인 함수를 구성하고 있는 지역변수와 사이즈를 보면 된다. 운영체제는 메인함수가 실행될 때, 메모리 공간을 확보해둔다. 몇 바이트가 필요한지는 실행해봐야 알 수 있을까? 소스코드 -> 컴파일 => 실행파일 => OS에 의해 실행 컴파일 타임 런타임 컴파일에 의해 미리 알 수 있다. 컴파일러는 정적 분석을 통해 int가 몇 개 있는지를 확인할 수 있다. 그렇기 때문에 런타임 시에 그 함수가 실행될 때, 메모리 안에 그 함수가 필요한 크기 만큼의 집을 마련해준다. 함수라는 집 공간 안에 int i, int j 등의 방이 만들어진다. 그러고 printf 라는 함수가 더해진다고 하면, printf를 위해 만들어 지는 집이 따로 만들어진..

운영체제 32비트와 64비트의 차이점 [내부링크]

운영체제 32비트와 64비트의 차이점 운영체제의 비트(32bit, 64bit) 32비트 os, 64비트 os의 차이가 무엇일까? 32비트 os는 32비트 cpu에 맞춰진 os이고, 64비트 os는 64비트 cpu에 맞춰진 os이다. 레지스터가 cpu에서 사용하는 기본 저장 단위이다. 16, 32, 64비트 등이 있는데, 메모리 주소 레지스터라고 있다. 메모리의 주소를 담는 레지스터가 있는데, 이 크기의 차이인 것이다. 메모리 주소의 기본 단위가 다른 것이다. 2022.06.27 - [분류 전체보기] - [컴퓨터구조] CPU와 운영체제 그리고 메모리 램은 hdd와 cpu간의 속도 차이를 보완해준다. 램은 하드디스크로부터 일정량의 데이터를 임시로 저장하고 느린 하드디스크를 대신해서 램과 cpu과 데이터를 교..

[컴퓨터구조] CPU와 운영체제 그리고 메모리 [내부링크]

[컴퓨터구조] CPU와 운영체제 그리고 메모리 1. CPU의 구조 CPU는 Control unit, ALU, 레지스터 세 가지로 구성되어 있다. Control unit은 어떤 일을 진행하는 것을 계획하는 등 총괄하는 것 ALU는 계산만 한다. 빠르게 처리. 레지스터는 기억력을 담당한다. cpu에 내장되어 있는 용량이 작은 기억장치이라고 보면 된다. 상세 구성, 비유 Control Unit : 매니저 ALU : 계산 레지스터, 프로그램 카운터 : 현재 실행중인 소스코드 라인을 가리킴. 레지스터, 명령어 레지스터 : 현재 실행중인 명령어를 실질적으로 가져온다. 레지스터, 메모리 주소 레지스터 : 타켓(목표하는 데이터가 있는 메모리의 주소) 레지스터, 메모리 데이터 레지스터 : 타겟에서 가져온 데이터 혹은, ..

[HTML/CSS] Flex 활용방법 [내부링크]

[HTML/CSS] Flex 활용방법 플렉스는 정렬을 위한 CSS 도구이다. 줄을 바꾸어 배치할 지 등을 선언하고, 내 마음대로 위치를 바꾸어 쓸 수 있다. 예전에는 float를 어떻게 해서 XX발광을 하면서 코드를 스파게티로 만들었다가 씻어서 짜장면으로 만든 다음에 짜장 튀김을 만드는 과정을 겪고 크기가 다른 사진들을 아주 보기좋게 가운데에 차례로 정렬한다던지 했는데, 플렉스는 그게 필요없다. 모든 요소들이 다 들어가있다.사진 1개만 특별한 위치에 가있다던지 하는 것이 가능한 것이다. (align-self) (처음 나왔을 때 프론트 개발자들은 저러지 않았을까...) 아래에서 활용법을 자세히 알아보자. Flexible box 레이아웃 배치 전용 기능으로 고안되었다. display: inline-block..

[HTML/CSS] SPA가 무엇인가? [내부링크]

[HTML/CSS] SPA가 무엇인가? react, vue, angular 등 요즘 핫한 프레임워크 들이 많다. 동적 웹을 구현할 때 사용하는 도구들이다. 하나의 페이지를 가지고 동적으로 화면이 바뀌면 서버에서 어떤 화면을 클릭해서 탭을 넘기지 않아도, 유려하게, 즉각적으로 반응하는 UI를 만들 수 있다. 그럼 모두 SPA를 쓰면 되지 않을까? 실버 불렛은 없는법,,, 장단점을 알아보자! SPA(Single Page Application) 어떤 웹 사이트의 전체 페이지를 하나의 페이지에 담아 동적으로 화면을 바꿔가며 표현하는 것. 무엇인가를 클릭하거나 스크롤하면, 상호작용하기 위한 최소한의 요소만 변경이 일어난다. 복잡한 UI 구현 시에 사용한다. react, vue, angular가 SPA 프레임워크로..

[HTML/CSS] 드롭다운 2차메뉴 만들기 [내부링크]

[HTML/CSS] 드롭다운 2차메뉴 만들기 홈페이지를 들어가보면 메뉴 탭에 마우스를 가져가면 하위 메뉴가 아래로 내려가면서 보이는 탭이 있다. 위의 메뉴는 디자인이 되지 않아 볼품없지만, 오늘 다룰 코드들을 활용해서 모든 페이지들이 만들어진다고 보면된다. 자바스크립트를 이용해서 더 유연하게 내려온다던지 하는 것을 아래의 코드들을 변형 또는 발전시켜서 만드는 것이다. 아래에서는 html과 css만 사용해서 메뉴를 구현하였다. 코드들을 살펴보자. 1. html 구성 1차 메뉴 아이템 1 2차 메뉴 아이템 1 2차 메뉴 아이템 2 2차 메뉴 아이템 3 1차 메뉴 아이템 2 2차 메뉴 아이템 1 2차 메뉴 아이템 2 2차 메뉴 아이템 3 1차 메뉴 아이템 3 2차 메뉴 아이템 1 2차 메뉴 아이템 2 2차 메..

[Web]정적 웹과 동적 웹(static web, dynamic web) [내부링크]

[Web]정적 웹과 동적 웹(static web, dynamic web) 정적웹, 동적웹 각각의 개념과 두 가지 방식의 차이를 알아볼 것이다. 정적 웹 : 언제 접속해도 같은 리소스를 건네주는 웹사이트. 서버는 프로그래머가 작성해놓은 파일들을 브라우저에 전달해준다. 자바스크립트를 활용해서 현재 시간 등을 받아와서 실시간의 것을 구현을 해주는 것도 있다. 그렇지만, 정적 웹의 기준은 접속할 때마다 받게 되는 문서들이 항상 같은지를 판단해보면 된다. 회사 홈페이지의 소개글이 정적 웹 중에 하나이다. 동적 웹 MVC 모델인 정적 웹의 한계를 극복하기 위해 만들어졌다. 즉각적인 반응이 가능하다(아이폰 imessage를 전송할 때 화면 깜빡임이 없이 모션이 나타나면서 바로 보내지는 것 처럼) 정적 웹은 사용자의 ..

[C언어] char 타입으로 배열 만들기 [내부링크]

[C언어] char 타입으로 배열 만들기 char 형식은 -128부터 127까지의 정수를 표현할 수 있는 정수 형식이다. char 형식은 문자 하나를 표현할 때 많이 사용한다. 형식 지정자는 ‘%c’이다. char 자료형은 1바이트로, 한 글자만 저장된다. 여러 글자를 담기 위해서는 배열을 이용해야 한다. ex) char a = ‘ab’; => b만 변수에 담기게 된다. int i = ‘a’ 도 된다. ‘a’가 아스키코드로 값이 97이기 때문이다. 여러 글자를 변수에 담기 위해서는 char ch[5] = {‘a’, ‘b’, 0, ‘c’, ‘d’}; 이런 식으로 문자를 담아야 한다. c에서는 끝을 알려주는 것이 0인데, 컴퓨터가 0을 보면 문자열의 끝이라고 인식하게 된다. (c, d)는 출력되지 않는다. ..

[C언어] 데이터 타입별 메모리 크기 [내부링크]

[C언어] 데이터 타입별 메모리 크기 메모리 관리는 아주 중요하다. 변수에 담고자 하는 값의 크기에 따라 변수의 타입을 선언해주는 것이 좋다. 속도에 있어서 민감하기 때문이다(그렇지만 요즘은 기술이 워낙 발달해서 대충.. 쓰기도 한다고...). 아무튼 타입별 메모리 크기를 알아야 많은 에러에서 벗어날 수 있다. 더불어 다른 언어도 이와 메모리 크기, 이름은 같거나 비슷하니 여기서 알아놓으면 된다. 아래에서는 자료형 별로 차지하는 메모리의 크기를 알아볼 것이다. 1) 정수형 타입 정수형 자료형 크기 자료형 값의 범위 char 1byte -128이상 +127이하 short 2byte -32,768이상 +32,767이하 int 4byte -2,147,483,648이상 +2,147,483,647이하 long 4..

[C언어] 사용자 정의 함수, void와 return [내부링크]

[C언어] 사용자 정의 함수, void와 return 기본 기능만 주구장창 사용할 것이 아니라면, 사용자 정의 함수를 알아야 한다.그렇게 해야 내가 원하는 대로 코드를 마음대로 가지고 놀고 일부 코드를 가지고 엄청난 계산 괴물을 만들어 낼 수도 있다.아니면 서비스 공룡을 만들어낼 수도 있고. 사용자 정의 함수는 그러기 위해 만들어졌다. '더 간편하고', '복사하기 붙여넣기를 하지 않고', '더 고도의 능력을 구현하기 위해' 아래에서는 C언어에서 사용자 함수를 정의하는 법과 실행하는 법, 그리고 void형 함수와 void가 아닌 함수의 차이점을 알아볼 것이다. 1. 기본 정의 방법 /* 함수 타입 함수명(매개변수){ 실행 코드 return 0; } */ void a() { for(int i = 0; i <..

[C언어] 반복문 활용하기(while, for) [내부링크]

[C언어] 반복문 활용하기(while, for) 반복문은 코드 라인을 획기적으로 줄여준다. 반복해서 실행해야 할 함수들을 삽입해서 일정 조건이 일어날 때 종료하는 방법으로 조건문을 종료할 수 있다. 아래에서는 C언어에서 쓸 수 있는 while문과 for문의 기본형에 대해 알아본다. 1. while 1) 기본구조 #include int main(){ while(조건문){ 수행 코드 } return 0; } while은 조건문 특별한 변수가 조건문 안의 조건을 만족할 때까지 반복을 수행하는 것이다. 일반적으로 반복의 횟수를 알지 못할 때, 고정하기 애매할 때 사용한다. 조건문 안에 true를 써놓으면 무한 반복문을 만들 수 있으며, 수행 코드 내에서 조건문을 두고 break;를 통해서 while문을 탈출할 ..

[Web] IP란 무엇인가?(공인, 사설, 고정, 유동) [내부링크]

[Web] IP란 무엇인가?(공인, 사설, 고정, 유동) 1. IP란? 컴퓨터가 연결된 네트워크의 끝단의 주소. 기기가 인터넷에 접속한 곳의 네트워크상 위치이다. 그렇기 때문에 아이피는 바뀔 수도 있다. 컴퓨터가 트레일러이면, 아이피는 이 트레일러가 자리잡은 곳의 도로명 주소이다. 이동할 때 아이피가 바뀌지만, 가만히 있어도 바뀌기도 한다. 그 이유는 다음과 같다. 우리는 IPv4형식의 ip를 쓰고 있다. ~~~.~~~.~~~.~~~ 이런식으로 세 자리수가 4번 반복되는 숫자들을 가지고 주소를 부여하고 통신을 진행하는 것이다. 이렇게 하면 42억여 개 정도의 주소가 만들어지는데, 지금 인구와 가지고 있는 스마트기기를 생각해보면 턱없이 부족하다. 그래서 사람들은 하나의 ip 개념을 더 생각하는데, 공인 i..

컴퓨터의 기본 메모리 구조(순차접근, 임의접근) [내부링크]

컴퓨터의 기본 메모리 구조(순차접근, 임의접근) 순차접근(sequential access) vs 임의접근(random access) 순차접근 리스트에 접근하는 것처럼 순차적으로 접근을 한다. 1~100번의 주소가 있다면, 1부터 시작해서 읽어나가는 것이다. 하드디스크(Hard Disk Drive)가 순차접근의 방법을 취한다. 임의접근 램의 경우 이름에 걸맞게 임의접근의 방법을 취한다(Random Access Memory). 그렇기 때문에 전원이 꺼지면 데이터가 유실된다. SSD(Solid State Drive)의 경우, 임의접근을 해서 필요한 공간의 데이터를 바로 가져올 수 있다. 그러나 HDD 보다는 덜 안정적이다. 데이터를 연속적으로 받아올 때 HDD보다 효율이 떨어진다. ++ 디스크 조각모음 요..

[Web] DNS가 뭘까? 도메인, A Record, CName [내부링크]

[Web] DNS가 뭘까? 도메인, A Record, CName (Domain Name System) www.naver.com naver.com이 도메인이다. www는 호스트네임이라고 한다. 호스트 네임은 mail, blog 등 다양하게 있을 수 있다. 도메인은 IP 주소를 쉽게 활용하기 위해서 만들어진 네임 태그와 같은 것이다. 도메인과 IP 주소는 매칭되어서 숫자로 어딘가로 전송이 된다. 그렇다면, 특정 IP - 특정 도메인 쌍이 어딘가에 데이터로 저장이 되어야 브라우저에 도메인으로 쓸 때 IP로 변환이 되어서 서버에 연결될 것이 아닌가? 그 쌍은 어디에 저장되어 있는가? 바로 DNS에 저장되어 있다. system이라는 말을 자세히 생각해보면, 어디 한 군데에 모두 저장되어 있는 것이 아니고 분산 저..

[Web] 서버란 무엇인가? [내부링크]

서버란 무엇인가? ‘서버 점검 중입니다.’ 서버도 하나의 컴퓨터이다. 서버는 ‘역할’의 의미를 가지고 있다. 한 컴퓨터가 다른 컴퓨터와 내 컴퓨터를 연결해주는 역할을 하면 서버 역할을 한다고 볼 수 있다. 아니면, 어떤 컴퓨터에서 어떤 정보를 나(클라이언트)에게 내려주면 서버 역할을 한다고 볼 수 있다. 클라이언트 - 서버 - 클라이언트의 구조가 된다. 서버도 클라이언트가 될 수도 있다. 다른 서버에서 정보를 가져온다면, 정보를 가져오는 서버의 경우, 클라이언트가 될 수도 있다. 내 컴퓨터도 서버로 만들수 있다. 예를 들면 P2P 서비스. 내 컴퓨터가 서버처럼 되어서 다른 사람에게 특정 파일을 전송해주게 된다. AWS와 같은 클라우드 서비스를 활용하면 더 쉽게 내 컴퓨터를 서버화 할 수 있다.

[HTML/CSS] 노멀라이즈(normalize) [내부링크]

[HTML/CSS] 노멀라이즈(normalize) : 브라우저 간 유저 에이전트 스타일의 오차를 줄이고 HTML 요소의 기본 스타일을 브라우저 별이 아닌 공통으로 일관되게 유지하도록 돕는 CSS 파일이다. 버그만 줄이는 방향으로 스타일을 재지정하는 것. body에는 기본 css가 설정되어 있다. body에는 기본 css가 설정되어 있다. 마진, 패딩의 기본값은 0으로 들어가있으며, width 등이 auto로 설정되어 있다. 태그 별로 문서 시작 전에 노멀라이즈를 해주는 것이 좋다. 공통적으로 그 태그의 형식을 지정해주면 브라우저 별로 다르지 않게 형태가 나올 수 있으니 해주는 것이 좋다. 노멀라이즈 시 CSS 값 설정시 유의할 하나의 정보(노멀라이즈 내용은 아님) ++ auto와 직접 값 설정의 차이점 ..

[CSS] 가상선택자, 에밋(emmet) [내부링크]

[CSS] 가상선택자, 에밋(emmet) 1. 가상 선택자(가상 클래스 or 추상 클래스) 선택자 뒤에 ':가상이벤트'를 붙이면 특정 이벤트마다 적용 할 스타일을 설정 할 수 있으며, 이를 가상 (추상)클래스라 한다. 가상 선택자를 쓰면 CSS와 HTML의 코드의 양을 줄이며 가독성을 향상시킬 수 있는 장점이 있다. nav > div:nth-child(N){ color: red; } 이렇게 있다고 하면, css는 nav의 N번째 자식만 골라서 효과를 주는 것이다. 만약 N의 자리에 1을 넣는다면, 첫번째 div 엘리먼트만 폰트 색깔이 빨간색으로 바뀐다. 가장 필수적으로 알아야 하는 요소 :nth-child(N) = 부모안에 모든 요소 중 N번째 요소 A:nth-of-type(N) = 부모 안에 A라는 요..

[HTML] 태그와 엘리먼트의 차이 [내부링크]

[HTML] 태그와 엘리먼트의 차이 한 줄 요약 : 태그는 '' 하나를 의미하고 엘리먼트는 즉 태그 쌍을 의미한다. 1. 태그(tag) 다음과 같이 생긴것을 태그라고 한다. 즉""로 묶인 일련의 명령어이다. 태그에는 세 가지 종류가 있다. 시작태그 : 종료태그 : 빈태그 : , , 등 태그의 구성 시작태그는 "속성(attribute)"과 "값(value)"을 가질 수 있다. 위에서 시작태그는 속성과 값을 가지고 있는데 "href"는 속성이라고 하며 "https://masterpiece-programming.tistory.com/"를 값이라고 한다. 2. 엘리먼트(element) 다음과 같이 생긴것들을 엘리먼트라고 한다. 내용이다. 즉 내용을 포함해 시작태그와 종료태그까지를 엘리먼트라고 합니다. 또 이런것..

[HTML/CSS] display 속성 알아보기 [내부링크]

[HTML/CSS] display 속성 알아보기 display 종류 정리 종류 inline-block, inline block none 너비 너비가 설정되어 있지 않다면, 최소한으로 줄어든다. 너비가 설정되어 있지 않다면, 최대한으로 넓어진다. 없어진다. 높이 높이가 설정되어 있지 않다면, 최소한으로 줄어든다. 높이가 설정되어 있지 않다면, 최소한으로 줄어든다. 없어진다. 본질 글자화 블록화 - line 사용 한 줄에 최대한 여러개가 나온다. 한 줄을 무조건 혼자 쓴다. - 정렬 부모의 text-align에 의해서 정렬 스스로 margin-left, margin-right를 사용해서 정렬 - 대표되는 태그 img(inline-block 종류) a, span(블록 아닌 inline 종류) div, nav(..

컴퓨터의 기본 구성 장치와 동작 원리 [내부링크]

컴퓨터의 기본 구성 장치와 동작 원리 20세기의 천재 폰 노이만은 현대 컴퓨터의 구조를 만들었다. 이전 까지의 컴퓨터(계산기라고 하는 것이 더 맞음)는 인풋, 아웃풋 디바이스의 경계도 모호했다. 이전까지는 CPU와 메모리가 같이 합쳐져 있었다. 그렇지만, 폰 노이만의 설계에 의해 새롭게 탄생된 컴퓨터는 현재 70년이 지난 지금에 있어서도 기본 컴퓨터 구조로 사용되고 있다. 알아볼 것들 1. 컴퓨터의 기본 구성 장치 2. 운영 체제와 부팅 과정 3. 이진법의 활용 1. 컴퓨터의 기본 구성 장치 CPU cpu는 중앙처리장치이다. 프로그램의 명령어를 해석하고 돌아가도록 제어하는 부분, 칩이다. 컴퓨터에서 기억, 해석, 연산, 제어라는 4대 주요 기능을 관할한다. 우리 뇌의 기억과 사고를 담당하는 부분이 있다고..

은탄환은 없다. [내부링크]

은탄환은 없다. 개발 공부를 시작한지 얼마되지 않은 나는 처음 들어본 말이었다. 소프트웨어 개발을 하는 사람 사이에서는 유명한 말이라고 한다. 새로운 기술, 방법을 활용해 문제점을 모두 해결할 수 있다고 생각하는 것이 잘못되었다는 이야기이다. 소프트웨어는 복잡하다. 100% 완결성을 가지고 있는, 신뢰성있는 소프트웨어는 없을 것이다. 결점은 0.01%라도 가지고 있고, 거기에서 언젠가는 버그나 결점이 발생할 수 있다. 소프트웨어 개발 과정이 탑다운 형식이라고 생각하면, 그 최정상의 설계점은 완벽할 수 없다. 완벽하려고 하면, 끝이 없고 결국에는 시작하지 못하고 문제를 해결하지 못한다. 설계도와 그 하위에서 쓰여지는 각종 개발 도구는 우리가 직면할 수 있는 '문제'를 완벽하게 없애지 못하는 것이다. 문제는..

html5up 템플릿으로 나만의 페이지 만들기 [내부링크]

[HTML/CSS] html5up 템플릿으로 나만의 페이지 만들기 html 페이지를 만들어 놓은 것이 여러 개 있어서 그것을 묶어보는 복습활동을 하고 싶었다. 그렇지만, 제대로 만들기에는 아직 초기 버전의 홈페이지 밖에 못만들 것 같았다. 더 나은 디자인, 인터페이스를 가진 홈페이지로 나의 결과물을 보고 싶다...는 열망은 "html5up"을 만나게 해주었다. html5up? html5up은 다양한 홈페이지 템플릿을 무료로 제공한다. 상업적으로도 활용할 수 있다. https://html5up.net HTML5 UP Responsive HTML5 and CSS3 site templates designed by @ajlkn and released under the Creative Commons license..

[GIT] github 저장소 원격 연결하기(CLI) [내부링크]

[GIT] github 저장소 원격 연결하기(CLI) git은 버전관리, 백업, 협업이 가능한 툴이다. github는 유명하고도 유명한 백업저장소이다. 그렇다면, 우리는 여기에 어떻게 접근할 수 있을까? GUI 환경으로 github에 접근할 수도 있고, 터미널과 같은 CLI 환경으로도 접근할 수 있다. GUI 환경으로 접근하는 방법으로는 VS Code로 커밋을 하고, 백업, 협업을 하는 방법이 있다. 하지만 로컬이 아닌 다른 장소에서 작업을 할 때 터미널을 사용하는 것이 더 간편하다. 개발환경과 무관하게 터미널로 커밋하는 방법은 모든 곳에서 공통적으로 사용할 수 있기 때문이다. 컴퓨터에 git이 설치되어 있는지는 터미널에서 git --version 명령어를 입력해보면 확인할 수 있다. 설치가 안 되어 있..

[Markdown] README.md 작성하는 방법 [내부링크]

[Markdown] README.md 작성하는 방법 요즘 Notion에 수업 들은 것을 집어넣고 있는데, markdown을 접하고 있었다. 마침 또 내가 만들어 놓은 페이지들을 깃허브를 통해서 배포하고 싶었고, 이것도 프로젝트라면 프로젝트라 readme가 필요해졌다. readme를 markdown으로 작성하는 방법을 알아보자. 1. README란? 프로젝트를 소개하는 문서이다. 관련된 링크, 개발을 위해 갖춰야 되는 실행환경, 사용 라이브러리, 가이드라인, 특정 코드 설명 등등을 쓴다. 이 프로젝트를 진행한 구성원이 아니라도 이것을 보고 수정, 보완을 할 때 도움이 될 수 있도록 도움이 되는 설명서와 같은 것이다. 2. Markdown 문법 '#'과 '>', '*', ''' ~~~ ''', 등을 활용하면..

새로운 것을 받아들인다는 것은... [내부링크]

새로운 것을 받아들인다는 것은... 익숙하지 않은 그림이다. 우리는 익숙한 대상을 가지고 낯설게 바라볼 수 있다. 이렇게 우리는 때때로 익숙하지 않은 새로운 무엇인가를 만난다. 새로운 사람, 장소, 업무 분야, 학습 분야, 취미, 도구와 같은 것들. 심지어 익숙했던 대상에 대해 새로움을 느끼기도 한다. 갑자기 머리를 싹둑 자른 연인, 군대를 다녀오고 나서 무엇인가 변한 친구, 단골 맛집에서 새로운 메뉴에서 느껴지는 맛과 같은 것들 말이다. 새로운 것 속에서 해방과 긴장을 동시에 느낀다. 새로움을 마주할 때, 기존의 삶의 경계에서 한 발 짝 더 나아갔다는 해방감을 가짐과 동시에 무엇인지 모르기에 조심스러운 긴장감을 함께 가진다. 이렇게 삶의 외연의 확장을 통해서 기존의 루틴에서 가졌던 권태를 극복하기도 하..

[Bootstrap] Bootstrap이란? [내부링크]

[Bootstrap] Bootstrap이란? 정말 기본만 알아볼 것이다. Bootstrap이란? : HTML, CSS, JS 프레임워크 : 프론트엔드 개발을 빠르고 쉽게 할 수 있는 프레임워크이다. : HTML과 CSS 기반의 템플릿 양식, 버튼, 네이게이션 및 기타 페이지를 구성하는 요소를 포함한다. : 자바스크립트를 선택적으로 확장 할 수 있다. Bootstrap의 특징 드롭다운 메뉴, 버튼, 탭, 리스트 등등 웹 페이지에서 많이 쓰이는 요소를 내장하고 있다. 관련 이미지만 설치하고 미리 지정된 CSS 클래스나 JavaScript 함수만 불러오면 디자인이 완성된다. Bootstrap의 활용 반응형 웹 디자인을 만들 때 쓰는 것이다. 반응형 웹 디자인 : 장치의 종류에 상관없이 모든 브라우저에서 잘 보..

[jQuery] jQuery 기본 문법 이해하기 [내부링크]

[jQuery] jQuery 기본 문법 이해하기 1. jQuery 정의 : HTML 클라이언트 사이드 조작을 단순화 하도록 설계된 크로스 플랫폼의 자바스크립트 라이브러리. : 부트스트랩도 의존도를 줄여간다고 하고, 요즘은 점유율이 낮아지고 있는 추세이다. 2. jQuery 호출 html 문서 내부에 script로 추가한다. jQuery 홈페이지에서 코드를 복사할 수 있는데, 그것을 html 문서 내에 붙여넣기 하면 jQuery를 사용할 수 있다. 3. 기초 문법 1) 선택자 : DOM을 통해 HTML 요소를 선택하여 가져와서 쉽게 제어할 수 있다. $(선택자).메소드(); id 선택을 위해서는 ‘#id', class 선택을 위해서는 ‘.class’로 쓰면된다. 지정 태그와 일치하는 요소를 선택하기 위해서..

[JavaScript] JavaScript 기본 문법 [내부링크]

[JavaScript] JavaScript 기본 문법 console 창으로만 확인할 수 있는 언어를 학습하고 있었는데, 수업을 따라가다가 JavaScript를 마주하였다. 이전까지는 신기한 생각을 가지고 있었다. '이건 나에게 '필요없는 언어'이다.' 나중에 안하니까? 전혀 잘못된 생각을 하고 있었다. 일단 전체가 대강이라도 어떻게 돌아가는지, 내가 구현한 코드가 어디에 써먹히는지, 눈으로는 어떻게 나와서 서비스가 어떻게 나오는지를 알아야 되지 않나. 전문가는 아니더라도 '알고는' 있어야 하는 것인데 외면하고 있지 않았나 하는 반성을 해본다. (물론 뭐 지금까지 얕은 공부를 했기 때문에 필요가 없다고 느꼈을 수도 있다) 아무튼 이번에는 자바스크립트 문법에 대한 기초적인 것을 파악해보겠다. 정말 생기초! ..

[JavaScript] DOM(Document Object Model) 이해하기 [내부링크]

[JavaScript] DOM(Document Object Model) 이해하기 DOM(Document Object Model)의 정의 : XML이나 HTML 문서에 접근하기 위한 일종의 인터페이스이다. : 문서 내의 모든 요소를 정의하고 각각의 요소에 접근하는 방법을 제공한다. : W3C의 표준 객체 모델이며, 다음과 같은 계층구조로 표현된다. DOM 활용 자바스크립트는 이러한 객체 모델을 이용하여 다음과 같은 작업을 할 수 있다. : 새로운 HTML 요소나 속성을 추가 : 존재하는 HTML 요소나 속성을 제거 : HTML 문서의 모든 HTML 요소를 변경 : HTML 문서의 모든 HTML 속성을 변경 : HTML 문서의 모든 CSS 스타일을 변경 : HTML 문서에 새로운 HTML 이벤트를 추가 : ..

[VS Code] Live Server로 html 문서 확인하기 [내부링크]

[VS Code] Live Server로 html 문서 확인하기 VS Code에서는 html, css, js 작성 편집이 가능하다. 하지만 IDE 안에서 코드를 바꾸었을 때, 즉각적으로 바뀐 부분을 확인하기 어렵다. 물론 새로고침을 하면서 localhost를 활용하는 방법도 있지만, VS Code를 쓰고 있다면, extension 하나를 설치하는 것만으로도 편리함을 얻을 수 있다. 우클릭 후 'Open with Live Server'를 누르거나, cmd + l -> cmd + r을 누르는 것으로 html 문서를 열어볼 수 있다. 아래에서는 Live Server로 html 문서를 확인하는 방법과 기본 브라우저 세팅을 바꾸는 방법에 대해 알아볼 것이다. 1. Live Server extension 설치 2...

[Python] 기념일 계산기 [내부링크]

[Python] 기념일 계산기 그 날로부터 얼마나 지났을까를 어떻게 계산할 수 있을까가 문득 궁금해졌다. python으로 그것을 구현하는 방법을 알아보자. import datetime birth = list(map(int, input().split())) today = datetime.date.today() target_date = datetime.date(birth[0], birth[1], birth[2]) d_day = today - target_date print(f"오늘은 일자로 부터 {int(d_day.days) + 1}"+"일 째 입니다.") datetime을 활용해서 그 날로부터 오늘이 몇 일 째인지를 계산해주는 식이다. 그 혹시 그녀와 함께한 날, 혹은 내가 살아온 날이 얼마나 지났는지를 ..

[VS Code] Java 개발환경 구축(Mac) [내부링크]

[VS Code] Java 개발환경 구축 Mac에서 이클립스를 쓸 때면 느끼는 불편함이 있다. 바로 한글 주석을 달 때, 백스페이스를 하고 나면 글자가 하나씩 사라지는 것. 아니 백스페이스를 안해도 한글자씩 사라지는 문제가 있다. 구글링을 한 결과 해결 방법이 없다고 한다. 이클립스로 처음 자바 클래스 문서를 생성하고 작성해왔지만, python, c, c++, java를 하나의 IDE로 돌려보고 싶다면 VS Code를 추천한다. (나는 근데 곧 IntelliJ를 쓸거다...) 아래에서는 VS Code로 자바 개발환경을 세팅하고 클래스를 만드는 것 까지 해볼 것이다. 1. VS Code Java 개발환경 세팅 (1) JDK 설치 https://www.oracle.com/kr/java/technologies..

[VS Code] C/C++ 개발환경 세팅, 리셋하기(Mac) [내부링크]

[VS Code] C/C++ 개발환경 세팅하기 수업에서 manual 본좌 C를 만나게 되었다. https://replit.com/으로 코드를 쓰고 하는 것이 익숙하지가 않아서 기존에 쓰던 VS Code를 IDE로 쓰고 싶어졌다. 세팅하는 과정이 순탄치 않았다. 리셋도 한 번 했더니 기존에 쓰던 서체와 글꼴색이 다 날아가서 다시 만져주기도 했다. 여기서는 개발환경 세팅과, 리셋하는 방법을 알아보겠다. 1. C/C++ 개발환경 세팅 (1) VS Code 설치 VS Code 세팅을 위해서는 당연히 VS Code가 있어야 한다. visualstudio.microsoft.com/ko/ Visual Studio: 소프트웨어 개발자 및 Teams용 IDE 및 코드 편집기 Visual Studio 개발 도구 및 서비스..

[HTML/CSS] github hosting [내부링크]

[HTML/CSS] github hosting HTML의 태그와 CSS 선택자, 속성을 정리하고 대강 페이지를 만들어보았다. 한 장 짜리 HTML 문서이지만, HTML/CSS를 모르는 사람에게도 보여주고 싶다면, Hosting을 해야 한다. github는 commit한 자료들을 hosting 해주는 써어비스를 해주고 있다. git 활용법을 어제 대강 습득한 나는 두 가지 지식을 융합시켜보고자 호스팅 방법을 탐구하였다. 커밋을 마치고 push를 하면 위와 같이 repository에 파일들이 저장된다. 이 때 주의할 것은, html 파일의 경우, index.html 파일이 꼭 있어야 한다. 브라우저는 이 파일을 우선적으로 읽고 나머지 html 파일을 들여다보는데, 이것이 없다면 404 not found를 만..

[HTML/CSS] 필수 CSS 선택자, CSS 속성 모음 [내부링크]

[HTML/CSS] 필수 CSS 선택자, CSS 속성 모음 CSS에는 선택자와 속성이 있다. div { font-size: 20px; } 여기서 div가 '선택자'가 되는 것이고, font-size가 속성이 된다. 속성은 특정한 값을 가진다. 선택자 { 속성: 값; } 이런 식으로 CSS 문서가 구성이 된다. 아래에서는 아주 잘 쓰이는 CSS 선택자와 속성을 알아볼 것이다. 1. CSS 선택자 선택자 설명 상세 설명 * 페이지 전체 요소 스타일시트 전체가 요소를 공유한다. .X X class의 요소 class는 여러 번 쓸 수 있다. #X X id의 요소 id는 한 번만 쓸 수 있다. X X 태그의 요소 html 문서의 특정 X 태그가 요소를 공유한다. X Y X 태그 내부의 모든 Y 태그의 요소 Des..

[HTML/CSS] HTML 태그 모음 [내부링크]

[HTML/CSS] HTML 태그 모음 html의 대부분의 태그는 여는 태그와 닫는 태그가 있다. 로 시작하면 닫는 이 꼭 있어야 한다. 하지만 과 같이 닫는 태그가 없는 태그도 있다. 잘 구분해서 쓰면 좋을 것 같다. 태그 기능 활용방법 or 비고 웹 문서의 유형을 html로 지정 태그 위(문서 최상단)에 씀 문서를 html로 시작한다는 선언 라고 하면 언어를 한국어로 지정한다는 뜻 브라우저의 정보를 입력 , , 등이 주로 이 부분에 들어감. 메타데이터 입력 이라고 하면 문서 내에서 한글을 사용할 수 있음. 문서 제목 브라우저 탭 상에 나타나는 제목 외부 문서 참조 다른 문서를 참조할 때 사용(CSS 파일 등) 형식으로 씀. 문서의 내용을 입력 페이지의 모든 태그들을 body 라인 내에 입력함. 헤더 ..

[HTML/CSS] HTML/CSS란? [내부링크]

[HTML/CSS] HTML/CSS란? HTML/CSS는 생각을 컴퓨터에 구현하는 시각화 도구이다. 자바스크립트, 자바, 파이썬 등등으로 만들어진 로직들을 직접 눈에보이게 끔 구현하는 도구인 것이다. (작가가 그린 그림이 HTML/CSS로 구현된 페이지, 그것을 움직이게끔 하는 것이 자바스크립트 등이다.) HTML/CSS만 들어간 페이지는 정적이다. 마우스를 위에 올려놓으면 움직이는 모션들은 자바스크립트 등의 언어를 통해 로직을 구현해줄 때 동적으로 구현이 가능하다. HTML/CSS로 만들어진 페이지는 누구나 접속이 가능하다. Chrome, Safafi, firefox, edge 등등 다양한 웹 브라우저 또는 모바일 기기를 통해 누군가의 생각이 들어간 컴퓨터 언어를 하나의 그림과 같이 볼 수 있는 것이다..

[GIT] Branch, Merge, Rebase 기본 개념 [내부링크]

[GIT] Branch, Merge, Rebase 기본 개념 동일한 소스 코드를 활용해서 여러 개발자가 각자의 업무를 진행할 때가 있다. 어떤 개발자는 버그를 수정하고, 어떤 개발자는 새로운 기능을 만드는 역할을 하는 것처럼 말이다. 이 때 서로 다른 작업을 할 때는 서로 다른 버전의 코드가 생겨날 수 밖에 없다. 이럴 때 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어주는 기능이 깃의 '브랜치(Branch)'이다. 각자 독립적인 저장소 안에서 마음대로 소스코드를 변경하고, 분리된 작업 영역에서 변경된 내용은 원 버전과 비교해서 하나의 새로운 버전으로 만들어 낼 수 있다. 이번 포스팅에서는 세부 기술적인 부분이 아니라, 전반적인 깃의 브랜치와 머지, 충돌을 이해하기 위해 개괄적으로 개념을 살펴보..

[GIT] 버전 관리의 개념과 필요한 명령어 알아보기 [내부링크]

[GIT] 버전 관리의 개념과 필요한 명령어 알아보기 깃의 가장 큰 존재이유 중 하나인 버전 관리. 버전을 관리하기 위해서는 로컬에서 진행해야 하는 과정이 있고, 원격으로 쏘기 위해 해야하는 과정이 있다. 그 전에 위의 그림부터 살펴보자. 로컬 영역에서는 세 가지로 분류를 해서 볼 수 있다. working area / : 버전으로 만들기 전 단계(수정한 파일들) staging area / : 수정 한 것 중 선별된 단계(버전을 만들려고 하는 파일들) repository : 버전으로 만들어진 파일들 이렇게 보면 되는데, 하나의 공간을 올려가면서 commit에 대한 준비를 하고 그 다음 로컬 repository에 올라갔을 때, push를 할 수 있게 된다. 막연히 그냥 폴더 안에 있는 것을 push 해서 깃..

[Linux] POSIX CLI 명령어 [내부링크]

[Linux] POSIX CLI 명령어 portable operating system interface command line interface 평범한 컴퓨터의 사용자라면 터미널을 사용해서 컴퓨터를 조작할 일이 많이 없다. GUI OS가 브라우저 실행 파일까지 친절하게 안내해주고, 그 창을 띄워줘서 인터넷에 접속할 수 있게 해주니까. 또한 어떤 텍스트 문서를 만든다고 할 때에도 윈도우는 메모장, 맥은 텍스트 편집기를 활용해서 내용을 입력하고 저장을 하면 파일이 만들어진다. GUI 환경이 아닌 터미널에서 명령어로 파일을 조작하는 이유는 무엇일까? GUI 환경이 아닌 곳에서 활용할 일이 있기 때문이다. 서버를 조작한다던지 할 때 사용이 되는 것이다. 그렇다면 이러한 대용량의 서버들은 GUI 환경을 쓰지 않는..

[Java] throws [내부링크]

[Java] throws 메서드 안에서 예외가 발생할 수 있는 코드를 작성할 때, try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 그 메서드를 호출할 곳에서 예외를 처리하도록 예외를 떠넘길 수도 있다. 이때 사용하는 것이 throws이다. throws 뒤에는 쉼표로 구분하여 처리해야 하는 예외 클래스를 병기할 수도 있다. public void method1() throws Exception{ } 이제 method1()은 예외를 자기 자신이 책임지지 않는, 아주 무책임한 메소드가 되었다. 이런 무책임한 메소드를 부른 method2()는 다음과 같은 행위를 해야 한다. public void method2(){ try{ method1(); catch(Exception e) { } ..

[Java] Resource를 다룰 때 예외처리(finally, AutoCloseable) [내부링크]

[Java] Resource를 다룰 때 예외처리(finally, AutoCloseable) 1. finally를 쓰는 이유 자바가 프로그램 외부에 있는 데이터에 액세스 할 때 생기는 문제들이 있다. 외부에 있는 데이터는 DB, Network, File 등이 있다. 이것들을 Resource라고 하는데 리소스는 자바 내부의 변수나 객체들과 비교해보았을 때, 다양한 예외적 상황이 생길 수 있다. 리소스를 자바로 사용할 때, 데이터를 붙잡고 있는 행위를 하고 있다가 놔주는 것이 close()이다. FileWriter f; // => f가 전역 변수여야 finally에서 f 사용이 가능해진다. try{ f = new FileWriter("data.txt"); f.write("Hello"); //f.close();..

[Java] Error와 Exception, 예외 처리 [내부링크]

[Java] Error와 Exception, 예외 처리 에러는 숙명, 예외는 운명 초보 개발자에게 누군가는 이렇게 이야기를 한다. 숙명은 static한 것, 운명은 dynamic 한 것이다. 어떠한 것을 집어넣는다고 해도, 숙명은 바뀌지 않고, 운명은 내가 어떤 변수와 로직을 넣느냐에 따라 좌지우지 할 수 있다. 오류는 시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제를 의미한다. 개발자가 예측하여 방치할 수 없는 것이다. 위의 블루스크린도 그와 같다. 반면 예외는 개발자가 구현한 로직에서 발생한 것이거나 사용자가 이렇게 사용할 것이라고 생각 못하고 개발해놓은 것에서 발생된다. 개발자가 미리 방지할 수 있기 때문에, 상황에 맞게 예외 '처리'를 해주어야 한다. 1. 예외 클래스의 계..

[Java] 인터페이스의 다형성 [내부링크]

[Java] 인터페이스의 다형성 인터페이스를 만들어놓고 클래스를 만들 때, 원래 설정해놓은 함수와는 다른 매개변수를 주고 싶다면...? 원래 2개를 설정할 수 있게 인터페이스에 써놓았는데, 매개변수를 3개 설정하고 싶다면 어떻게 해야할까? 메소드를 그대로 물려받았기 때문에, 원래 함수를 구현하지 않고도 오버로딩이 가능할까? 라는 생각에 이번 포스팅을 진행하게 되었다. 긴 이야기 필요없이 바로 인터페이스를 만들어보고 인터페이스를 implements한 클래스를 만들어보겠다. 1) 인터페이스 package exercise; public interface Calculate { int sum(int v1, int v2); } Calcutate라는 인터페이스를 만들었고, 그 안에는 sum()이라는 함수가 들어있다...

[Java] this와 super [내부링크]

[Java] this와 super this와 super. 많이 보긴하는데, 헷갈릴 때가 있다. 또한 this와 this(), super와 super()의 차이. 더 상세하게 알아보고 기억하기 위해 기록한다. 아래의 코드는 정보관리 시스템을 할 때 사용한 코드이다. 2022.06.13 - [프로그래밍 언어/Java] - [Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 public Student(String name, int age, int height, int weight, String studentId, int grade, double gPA) { //상속받은 클래스의 매개변수를 가진 super 생성됨. super(name, age, height, weight); this.stu..

[Java] Overloading, Overriding [내부링크]

[Java] Overloading, Overriding 오버로딩과 오버라이딩 말은 비슷하지만 다른 것이다. 오버로딩은 매개변수를 다양하게 받아오기 위해서 생성자든 메소드든 '과적'을 하는 것이고, 오버라이딩은 상속과 연관된 개념으로 부모 클래스의 메소드를 덮어쓰고 새로운 메소드로 활용하는 것이다. 1. Overloading public class Over{ public Over(int a){ ... } public Over(int a, int b){ ... } public Over(int a, int b, String c){ ... } } Over o1 = new Over(1); Over o2 = new Over(1, 2); Over o3 = new Over(1, 2, "야호"); 위와 같이 Over 클..

[GIT] 프로젝트의 시작 GIT [내부링크]

[GIT] 프로젝트의 시작 GIT commit의 시작 git. 1일 1커밋의 생활도 여기에서부터 시작된다. git은 프로그램의 버전의 수정의 전과정을 기록하고 있고, 이전 버전에서 어떤 것이 달라졌는지를 알려주는 도구이다. 당연히 어떤 부분이 달라졌는지를 알 수 있다면 '백업'의 기능도 한다고 할 수 있고, '백업'을 할 수 있으니 공동작업이 가능해진다. 이제까지는 기본 언어, 알고리즘 등의 기초 공부만을 했다면, 실무에 필요한 기술들을 하나씩 알아나가 볼 것이다. (그렇지만 아직 기초도 탄탄하지 못하다...) 이번 포스팅은 깃은 어디에 써먹는가, 어떻게 써먹는가에 대한 기초를 간단히 기록해놓는 목적으로 한다. 1. 깃은 어디에 써먹을까 위에서 말했듯 버전 관리, 백업, 협업 이 세 가지에 활용하려고 깃..

[Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 [내부링크]

[Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 상속은 객체 지향에서 중요한 개념이다. 매번 클래스에 같은 내용을 넣지 않고, 기존의 클래스에 추가하고 싶은 내용이 있는데, 각기 다른 특성을 가질 경우 예를 들어 S클래스라는 자동차의 외관 설계를 하는 클래스가 있다고 치자. 외관은 공통인데 엔진이 다를 수 있지 않은가. 디젤 엔진을 가진 S클래스와 가솔린 엔진을 가진 S클래스를 각각 만들고 싶다면, 디젤 S클래스 extends S클래스 가솔린 S클래스 extends S클래스 해서 엔진 부분만 각각 바꾸어 주면 된다. 이렇게 해서 얻는 이득은, 각각의 디젤 S클래스, 가솔린 S클래스의 내부 코드에서 S클래스의 외관 설계를 하는 코드가 들어가지 않아도 된다는 코드 작성의 효율성과 외..

[Java] 다형성(Polymorphism) 알아보기 [내부링크]

[Java] 다형성(polymorphism) 알아보기 칼은 참 다양한 종류가 있다. 요리할 때만 해도, 과일칼, 채소자르는 칼, 고기 다지는 칼, 빵칼 등등등.. 요리 용도가 아니라 도축, 수술 등등 많은 곳에서 쓰는 것이 칼이다. '칼'이라는 것이 만약에 클래스라면, 또는 인터페이스라고 이해를 해보자. 칼은 '스테인리스'로 되어 있고, '손잡이'가 있으며, '한 면이 날카롭거나 두 면이 날카로워야' 한다. 이렇듯 다형성은 :같은 타입이지만 실행 결과가 다양한 '객체'를 이용할 수 있는 성질 을 의미한다. 과일칼과 수술용 메스도 어찌보면 같은 타입인데, 과일 칼은 과일 깎을 때 사용하고, 메스는 개복에 사용한다. 실행 결과 자체가 달라지는 것이다. 자바에서는 다형성을 위해 부모 클래스 타입의 참조 변수로..

[Java] Java 자바 final [내부링크]

[Java] Java 자바 final 자바에서 final 키워드는 여러 컨텍스트에서 단 한 번만 할당될 수 있는 entity를 정의할 때 사용된다. 메모리에 한 번 할당되면 변경할 수 없다. 즉, int 타입의 경우 상수처럼 활용되고, 메소드에서 final을 쓸 경우, 그 메소드가 들어있는 클래스를 다른 클래스에서 상속했다면, 다른 클래스에서 그 메소드를 오버라이딩해서 쓸 수 없다. final을 쓰면 뭐든 간에 다른 곳에서는 '변경'할 수 없다. final은 아래와 같이 쓸 수 있다. public class Final { public static void main(String[] args) { // number가 상수가 된다. final int number = 10; System.out.println(n..

[Java] 추상, 인터페이스 [내부링크]

[Java] 추상(abstract), 인터페이스(interface) 추상(abstract) 그리고 인터페이스(interface)는 "~을 하겠다"라는 계획서와 같다. '하겠다'라고 하면 너무 추상적이지 않은 계획서이지 않나? 그렇다. 그 부분 때문에 추상 또는 인터페이스를 쓰는 것이다. ~~을 해야 한다를 기억해 놓을 수 있기 때문에, 그 때 그 때 ~~을 상황에 맞게 해결해 나가면 되는 것처럼, 완벽하게 구현해놓지는 않았지만, 추상 클래스 또는 인터페이스를 상속하여 그 부분을 상세하게 클래스 안에서 구현하고 싶을 때, 추상 또는 인터페이스를 사용하는 것이다. 1. 추상(Abstract)으로 동물 클래스 만들기 각각의 동물의 울음소리를 각각의 클래스마다 다르게 설정해보는 것이다. '울음' 이라는 것은 동..

[Java] 클래스 변수와 인스턴스 변수의 차이 [내부링크]

[Java] 클래스 변수와 인스턴스 변수의 차이 객체 지향에서 가장 중요한 클래스와 상속. 클래스는 정말 기본 중에 기본이다. 상속에서 클래스를 비유해보았는데 참고하면 좋을 것이다. 2022.06.13 - [프로그래밍 언어/Java] - [Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 [Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 [Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 상속은 객체 지향에서 중요한 개념이다. 매번 클래스에 같은 내용을 넣지 않고, 기존의 클래스에 추가하고 싶은 내용이 있는데, 각기 다른 masterpiece-programming.tistory.com 클래스를 여러 개 쓰면서 전국의 아빠들이 만드는 다 때..

[Java] 원 찍기 [내부링크]

[Java] 원 찍기 반복문을 하면서 알게된 원찍기 별찍기는 많이 해봤지만, 원찍기는 해보지 않아서 해보았다. x^2 + y^2 = r^2을 아래의 코드에 구현했다. final static int N = 15; public static void main(String[] args) { for (int i = -N; i

[Java] 배열, 다차원 배열 [내부링크]

[Java] 배열, 다차원 배열 파이썬의 리스트, 자바의 배열 무엇이 다른지는 자료구조 학습을 통해 알게 되었다. 배열은 메모리를 할당받아 길이가 정해져있다는 것, 리스트는 각 데이터 마다 노드와 링크로 이어져 길이 제한이 없다는 것. 배열은 길이를 한 번 정하면 바꾸기 어렵다. 새로운 배열을 만들어 그 속에 기존의 데이터를 넣고, 새로 데이터를 추가하는 방법을 써야 한다. 이러한 배열을 다시 자바 식으로 리마인드 해본다. 1. 배열 import java.util.Scanner; public class ArrayMaxValueFind { public static int max(int a, int b) { return (a > b) ? a : b; } public static void main(String..

[Java] 반복 함수, 재귀 함수 [내부링크]

[Java] 반복 함수, 재귀 함수 반복 또는 재귀 함수는 DP, DFS, BFS 등의 알고리즘에서 흔히 쓰이는 함수이다. 수학적 감각이 약간 필요한 친구라고 할 수 있겠다. 자기 자신을 또 호출하는 재귀함수는 처음에 볼 때는 이해하기 어려운 측면이 있는데, 누가 호출되고, 언제 그 계산이 되는지를 생각해보면 쉽게 이해할 수 있다. 이 두 가지 함수를 이해하기 위해서는 '팩토리얼'과 '피보나치'를 구현해보면 된다. 1-(1). 팩토리얼 반복문 사용 // 반복문 활용 public static int factorial(int number) { int sum = 1; for(int i = 2; i < number; i++) { sum *= i; } return sum; 팩토리얼은 n!으로 나타내며, 1부터 n..

[Java] 사용자 정의 함수 [내부링크]

[Java] 사용자 정의 함수 객체 지향에서 개발자가 정의하는 메소드는 아주 기본 중에 기본이다. 메소드를 활용해서 데이터를 통제할 수 있기 때문이다. 그렇게 해서 사용자가 어떤 데이터를 집어 넣으면 메소드를 통해서 정보가 저장이 되고 기존에 있는 데이터를 불러와서 매치 시켜보고, 맞으면 돈을 인출해준다던지 (볼드체가 메소드를 통해 이루어지는 행위들이다.) 아무튼 가장 기본중에 기본이다. 그럼 사용자 정의 함수가 있으면, 사용자가 정의하지 않는 함수도 있다? 그렇다. 기본으로 내장되어 있는 함수가 그러하다. 앞서 봤던 substring();이라던지, 제일 처음 자바를 마주할 때 쓰는 System.out.println(); 이것들이 사용자가 정의하지 않는 기본 함수 즉, 내장함수이다. 세 가지의 활동을 통..

[Java] 증감 연산자, 거듭제곱, 삼항 연산자, 파일 입출력 [내부링크]

[Java] 증감 연산자, 거듭제곱, 삼항 연산자, 파일 입출력 1. 증감 연산자 public class Main { public static void main(String[] args) { // TODO Auto-generated method stub int a = 10; System.out.println("현재 a는 " + a + "입니다." ); a++; System.out.println("현재 a는 " + a + "입니다." ); // 출력 전에 ++ 연산 System.out.println("현재 a는 " + ++a + "입니다." ); // 출력 후에 ++ 연산 System.out.println("현재 a는 " + a++ + "입니다." ); System.out.println("현재 a는 " +..

[Java] 자바 데이터 타입, 사칙연산, substring [내부링크]

[Java] 자바 데이터 타입 어쩌다 보니 다시 자바를 공부하게 되었다. 자바를 위주로 알고리즘 공부도 진행하게 되지 않을까 싶다. Hello World는 한참 전에 찍어봤기 때문에 데이터 타입부터 리마인딩 한다는 생각으로 강의를 듣고 왔다. 동빈나님의 강의인데 아주 간결하고, 기존에 지식이 있는 사람이 듣기에 아주 좋다고 생각한다. 객체 지향 프로그래밍까지의 기억을 되살려줄 수 있는 강의라고 보면 된다. https://youtu.be/wjLwmWyItWI https://youtu.be/wjLwmWyItWI 동빈나님은 코딩테스트 책을 알아보다가 알게 되었고, 강의를 하나씩 들어보니 아주 간결하고 알아듣기 좋았다. 그래서 이번 자바 리마인딩도 동빈나님의 자바 강의가 있어 들어보았다. 강의 포스팅은 강의에서..

SSAFY 삼성 청년 SW 아카데미 8기 지원후기 [내부링크]

작년 11월 한참 전직을 마음먹고 몇 가지 찾아보던 중 프로그래밍을 생각하고 있던 중에 친구가 소개해줬던 대한민국의 소프트웨어의 미래를 이끄는 SSAFY 7기에 지원했었지만, 적성시험이 익숙하지 않았고 그렇다고 열심히 공부할 수 있는 상황도 아니었다. 더군다나 CT 문제는 인생 초면이었기 때문에 결국 1차 광탈하고 말았었다. 지금은 깔짝 이긴 하지만 알고리즘을 완벽하게는 아니지만 이해할 수 있는 정도는 되었고, 적성시험도 시간을 두면서 천천히 실력을 올려갈 수 있는 상황이 되었다. 무튼 싸피는 이번이 마지막 지원이 되지 않을까 싶다. (교육기관 말고 어디든 가야 되니까...) 싸피의 지원자격과 지원절차 홈페이지에 들어가면 볼 수 있긴 한데, 간략히 이야기하면 다음과 같다. 지원자격 : 만 29세 이하이며..

멋쟁이사자처럼 백엔드 스쿨 1기 합격 후기 [내부링크]

포스팅을 한동안 하지 못했다. 여기 저기 교육 프로그램에 지원하고 무엇을 해보고 싶은지를 생각해보느라 기록을 미뤄두고 덮어뒀던 것 같다. 5월 중순 이후부터 SSAFY 지원을 하고 나서 적성 준비, 에세이 준비 그리고 싸피 오픈채팅방에서 알게된 코드라이언 백엔드 스쿨 지원, 42서울 지원 등등을 해보았다. 일단 SSAFY는 할 얘기가 많지만 결과가 나오지 않아 나중에 포스팅하기로 하고,,,, 코드라이언 백엔드 스쿨 1기 지원후기 부터 이야기 하고자 한다. SSAFY를 준비하던 중 알게된 므째이 사자스쿨 백엔드 1기. 프론트 엔드는 많이 모집했던 것을 알고는 있긴 했지만, 백엔드 1기를 모집한다기에 관심이 갔다. 아직 내가 하고 싶은 일이 백엔드인지는 모르겠지만, 백엔드와 관련된 것이 나의 흥미와 비슷하다..

[자료구조] Union-find 자료구조 python [내부링크]

[자료구조] Union-find 자료구조 python 살펴볼 주요 개념: Union find란? Union find 구현(python) 1. Union find란? 서로 중복되지 않는 부분 집합들로 나눠진 원소들에 대한 정보를 저장하고 조작하는 자료 구조. 다수의 노드들 중에 연결된 노드를 찾거나 노드들을 합칠 때 사용하는 알고리즘이다. union find는 서로소 집합(disjoint set)을 찾아내는 것에 활용된다. union find와 비슷한 것은 python에서는 set()이 있다. set은 membership 연산(어떤 원소가 집합에 속하는 지를 T/F로 알려주는)과 합집합(union), 교집합(intersection), 여집합(difference) 등의 연산을 제공한다. 하지만 파이썬의 se..

[자료구조] Balanced BST(균형이진탐색트리)의 정의와 종류 [내부링크]

[자료구조] Balanced BST(균형이진탐색트리)의 정의와 종류 살펴볼 주요 개념: Balanced BST의 정의 Balanced BST의 종류 1. Balanced BST의 정의 Balanced BST(균형이진탐색트리, 이하 BBST)는 BST(이진탐색트리)가 위의 사진처럼 데이터 추가로 인해 길이가 과도하게 길어진 편향적인 이진 탐색트리를 방지하기 위해 만들어졌다. 높이는 탐색, 삽입과 삭제 연산에 영향을 미치게 된다. 노드의 탐색 시간이 많이 걸릴 수록 삽입과 삭제연산도 이에 영향을 받아 수행시간이 오래 걸릴 수 있다. 그렇기 때문에 높이는 최소한으로 하면서 트리에 데이터를 삽입, 삭제하는 것이 필요하다. 위의 사진의 경우를 보면 왼쪽의 BST에서는 15에서 8까지 가는 것에 에지를 4번 거쳐야..

[백준] 1918 후위 표기식 python 알고리즘 문제 [내부링크]

문제 1918. 후위 표기식 1. 나의 코드와 발상 과정 최근 자료구조 공부를 하다가 기본 자료구조인 스택을 배웠는데, 대표적인 활용 예시로 괄호와 계산기에 적용을 연습하였다. 연산자와 피연산자, 이항연산자, 단항연산자, infix 수식, postfix 수식을 알 수 있었는데, infix 수식에서 postfix 수식으로 바꿀 때, 연산자 스택과 피연산자 스택을 따로 두고 섞어 담아 출력하면 postfix 수식이 된다는 것을 알 수 있었다. 그 기억을 살려 아래와 같이 두 개의 스택을 놓고 코딩을 진행했다. n = list(input()) stack = [] outstack = [] operator = {'(' : 0, '+' : 1, '-' : 1, '*' : 2, '/' : 2} for i in n: ..

python 로또 번호 추출기 2탄 [내부링크]

python으로 로또 추출기를 만든지 한 달 넘게 지났다. 자바로 했던 것을 파이썬으로 옮겨 놓는 것이 1탄이었다면, 무식했던 방법을 새로운 정렬 알고리즘을 통해 다시 만들어보고자 한다. 기존의 코드의 단점은 1000만 개 이상의 번호를 만들면 과도한 시간이 걸리는 것이었다. 2022.04.18 - [프로그래밍/재미있는 코딩놀이] - python 로또 번호 생성기 그래서 최근에 배운 계수정렬을 활용하면 딕셔너리를 활용하지 않고 충분히 많이 만들어진 로또 번호를 6개 골라낼 수 있을 것 같았다. 왜냐하면 계수 정렬에 필요한 리스트의 크기가 45이면 충분했기 때문이다. 메모리 용량도 그렇게 많이 잡아먹지 않고, 빠르게 연산할 수 있다고 생각했다. 바로 실행에 옮겼다. ** 기존 코드 import random..

[자료구조] Binary Search Tree(BST, 이진탐색트리) 정의와 python 구현 [내부링크]

[자료구조] Binary Search Tree(BST, 이진 탐색 트리) 정의와 python 구현 살펴볼 주요 개념: 더보기 - Binary Search Tree의 정의 - Binary Search Tree 구현 방법 1. Binary Search Tree의 정의 이진탐색 트리는 탐색에 효율적인 트리이다. 이진트리의 규칙은 다음과 같다. 각 노드의 왼쪽 subtree의 값은 노드의 key값 보다 작거나 같아야 하고, 오른쪽 subtree의 값은 노드의 key값 보다 커야 한다. 12의 자리에 1이 올 수는 없다. 왜냐하면, 1이 부모 노드인 13보다 작은 수 이더라도, 10의 오른쪽 subtree이기 때문에 10보다 큰 수가 와야 하기 때문이다. 즉, 12 노드 자리에는 10~13까지만 key값으로 사용..

[자료구조] Binary Tree(이진트리) 구현과 traversal(순회) 구현 python [내부링크]

[자료구조] Binary Tree(이진트리) 구현과 traversal(순회) 구현 python 살펴볼 주요 개념: 더보기 - Binary Tree 구현 방법 - Tree traversal의 종류와 구현 방법 1. Binary Tree 구현 방법 리스트, 재귀적 리스트, 노드 클래스 구현의 방법이 있다. 노드 클래스 구현만 살펴본다. class Node: def __init__(self, key): self.key = key self.parent = self.left = self.right = None def __str__(self): return str(self.key) 2. Tree traversal의 종류와 구현 방법 Traversal(순회) : 노드들을 순서에 따라 방문하며 key 값을 출력하는 것..

[자료구조] Heap 기초 개념 알아보기(python) [내부링크]

[자료구조] Heap 기초 개념 알아보기(python) 살펴볼 주요 개념: 더보기 - 힙이란? - 힙을 충족하는 트리 형태 - 힙 직접 구현 1. 힙이란? 힙 성질(heap property)을 만족하는 이진트리(Binary Tree)이다. * 힙 성질 - 모양성질 : 레벨 별로 모든 노드가 꽉 차있고, 마지막 레벨의 노드만 왼쪽에서부터 차있는 형태 - heap 성질 : 모든 부모노드의 key값이 자식노드의 key값보다 작지 않다. 힙 성질을 만족하는 트리를 리스트화 해서 표현하면 다음과 같다. A = [15, 12, 6, 11, 10, 2, 3, 1, 5] 루트 노드에는 리스트에서 가장 큰 값이다. 힙은 insert와 remove(최대값 삭제), maxHeapify 연산을 지원한다.(max heap) 각..

[자료구조] Tree 기본 개념 알아보기 [내부링크]

[자료구조] Tree 기본 개념 알아보기 살펴볼 주요 개념: 더보기 - 트리의 개념 - 트리의 표현법(python) 1. 트리의 개념 트리(tree)는 부모 - 자식 간의 관계의 노드로 구성되어 있다. 한 방향 연결리스트와 비슷하다. 한 방향 연결리스트의 경우, 한 부모에 한 자식 밖에 없는 트리구조인 것이다. 트리는 두 개 이상의 자식 노드를 가질 수 있다. 세 개 이상의 자식을 가지는 2, 3, 4 트리와 같은 것도 존재한다. 각각의 노드에는 key값이 들어가 있다. 각각의 용어 설명을 해보자면 다음과 같다. 루트 노드 : 맨 꼭대기에 위치한 조상과 같은 노드 링크 or 에지 : 부모 노드와 자식 노드 사이를 이어주는 선 리프 노드 : 더 이상의 자식 노드가 없는 노드 형제 노드 : level이 같고..

[자료구조] hash table(해시 테이블) python class 구현하기 [내부링크]

[자료구조] hash table(해시 테이블) python class 구현하기 살펴볼 주요 개념: 더보기 - 해시 테이블의 개념, 특징, 용도 - 해시 함수 - 해시 충돌 회피 - 해시 테이블 클래스 구현(python) 1. 해시 테이블의 개념, 용도, 중요 요소 (1) 해시 테이블의 개념 : 해시 테이블이란 키값에 데이터를 저장하는 데이터 구조이다. key를 통해 데이터(value)를 받아올 수 있으므로 삽입, 삭제, 탐색 연산이 획기적으로 빨라진다. 파이썬에서는 딕셔너리 타입이 해시 테이블의 특징을 가지고 있다. : 해시 테이블은 테이블 사이즈 만큼 배열을 생성하여 사용한다. 특정한 함수(해시 함수)를 통해 key를 인덱스로 mapping을 하고, 테이블 내의 공간에 데이터를 저장하는 것이다. : 파..

[자료구조] 배열, 한 방향 연결리스트, 양 방향 연결리스트 시간복잡도 [내부링크]

[자료구조] 배열, 한 방향 연결리스트, 양 방향 연결리스트 시간복잡도 배열 (Array) 한 방향 연결리스트 (Singly Linked List) 양 방향 연결리스트 (Double Linked List) search O(1) O(n) O(n) pushFront pushBack O(1) O(1) O(1) popFront popBack O(1) O(1) O(1) insert O(n) O(n) O(1) ※ splice 연산 활용 remove O(n) O(n) O(1) ※ splice 연산 활용 데이터의 접근, 탐색이 중요하다면 배열을 쓰는 것이 좋다. 데이터의 추가, 삭제가 중요하다면 연결리스트를 쓰는 것이 좋다.

[자료구조] Double Linked List(양 방향 연결리스트) python class 구현하기 [내부링크]

[자료구조] Double Linked List(양 방향 연결리스트) python class 구현하기 살펴볼 주요 개념: 더보기 - 양 방향 연결리스트의 특징 - 양 방향 연결리스트 클래스 구현(Node, Double Linked List) 1. 양 방향 연결리스트의 특징 양 방향 연결리스트는 이중 연결 리스트, 원형 연결 리스트로 나누어 진다. 여기서는 원형 연결 리스트만을 살펴볼 것이다. 양 방향 연결리스트는 tail 노드를 알지 못해도 순차적인 탐색 연산이 필요 없다. 삽입될 앞 뒤의 노드만 알고 있다면, 상수 시간 내에 삽입 또는 삭제 연산이 가능하다. 원형 연결리스트의 맨 앞 노드는 '더미 노드'이다. 원형 연결리스트의 순서를 정확하게 매길 수 없는 특징 때문에, head 노드를 정확하게 설정할 ..

[자료구조] Singly Linked List(한 방향 연결리스트) class 구현 (python) [내부링크]

[자료구조] Singly Linked List(한 방향 연결리스트) class 구현 살펴볼 주요 개념: 더보기 - 한 방향 연결리스트의 클래스 구성(Node, SinglyLinkedList) - 클래스 내부 메소드 한 방향 연결리스트를 파이썬으로 구현하기 위해서는 두 개의 클래스가 필요하다. 노드 클래스를 통해 각 노드를 정의하여 링크로 잇고, 이어진 리스트를 연산에 활용하는 singlyLinkedList 클래스가 필요하다. 아래에서는 두 가지 클래스를 구현해보도록 한다. 1. 한 방향 연결리스트의 클래스(node) class Node: def __init__(self, key = None, value = None): self.key = key self.next = None def __str__(self..

[자료구조] Linked List(연결리스트)의 특징 [내부링크]

[자료구조] 살펴볼 주요 개념: 더보기 - Linked List의 정의 - 한 방향 연결리스트 vs 양 방향 연결리스트 1. Linked List(연결리스트)의 정의 연결 리스트, 링크드 리스트(linked list)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조이다. 이름에서 말하듯이 데이터를 담고 있는 노드들이 연결되어 있는데, 노드의 포인터가 다음이나 이전의 노드와의 연결을 담당하게 된다. 여기서 하나의 박스가 노드라고 보면된다. 박스의 옆부분이 링크 부분이며 각 노드 안에는 key값 또는 key값 value값 쌍이 들어간다. 다음 노드를 계속 가리키면서 하나의 줄줄이 소세지 같은 모습을 한다. 연결 리스트의 종류로는 한 방향 연결 리스트, 양 방향..

[Algorithm] 5-(3). 정렬 - 계수 정렬 [내부링크]

[Algorithm] 5-(3). 정렬 - 계수 정렬 특정한 조건이 부합할 때만 사용가능하다. 매우 빠르게 동작하는 정렬 알고리즘이다. 동일한 값을 가지는 데이터가 여러 개 등장할 때 효과적으로 사용할 수 있다. O(N+K) 시간 복잡도를 가진다. 각각의 데이터가 몇 번 등장했는지 세어서 정렬을 하는 구조이다. 리스트를 하나 더 만들어야 하지만, 조건만 맞는다면 빠른 모습을 보여준다. 때에 따라 극악의 비효율을 제공하기도 한다. 사용 예시 2022.07.03 - [알고리즘/재미있는 코딩놀이] - 로또 번호 추출기 3탄(자바) 로또 번호 추출기 3탄(자바) 로또 번호 추출기 3탄(자바) 인간의 욕심은 끝이 없고 무한한 성능 향상을 꿈꾼다. 자바의 문법들을 다시 상기하고, 메모리 구조에 대한 것들을 하나씩 ..

[Algorithm] 5-(2). 정렬 - 퀵 정렬 [내부링크]

[Algorithm] 5-(2). 정렬 - 퀵 정렬 기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법이다. 일반적 상황에서 가장 많이 사용된다. 병합 정렬과 더불어 대부분 프로그래밍 언어의 정렬 라이브러리의 근간이 되는 알고리즘이며, 가장 기본적 퀵 정렬은 첫 번째 데이터를 기준 데이터(피봇)로 설정한다. 피봇값 설정 -> 정렬 -> 분할 -> 왼쪽 데이터 퀵정렬 -> 오른쪽 데이터 퀵정렬 5 7 9 0 3 1 6 2 4 8 첫번째 원소가 피봇으로 설정된다. 이상적인 경우 시간 복잡도가 O(NlogN)이 될 수 있다. 데이터 확인 개수가 절반씩 줄어들기 때문이다. 그러나, 최악의 경우 O(n2)의 시간 복잡도를 가진다.

[Algorithm] 5-(1) 정렬 - 선택 정렬, 삽입 정렬 [내부링크]

[Algorithm] 5-(1) 정렬 - 선택 정렬, 삽입 정렬 1. 선택 정렬 처리되지 않은 데이터 중 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복한다. 선형탐색으로 처리를 한다. 1) 구현 방법 이중 반복문을 통해 선택 정렬을 구현할 수 있다. array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for i in range(len(array)): min_index = i # 가장 작은 원소의 인덱스 for j in range(i + 1, len(array)): if array[min_index] > array[j]: min_index = j array[i], array[min_index] = array[min_index], array[i] #스와프 2) 선택 정..

[Algorithm] 4-(4) BFS(Breadth-First Search) [내부링크]

[Algorithm] 4-(4) BFS(Breadth-First Search) 너비 우선 탐색이라고 부르며, 그래프에서 가까운 노드부터 우선 탐색하는 알고리즘이다. BFS는 큐 자료구조를 이용한다. 동작 과정 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리한다. 더 이상 (2)번 과정을 수행할 수 없을 때 까지 반복한다. 최단 거리 목적을 달성하기 위한 알고리즘으로 사용되기도 한다. 대표 문제 https://www.acmicpc.net/problem/1260 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 ..

[Algorithm] 4-(3). DFS(Depth-First Search) [내부링크]

[Algorithm] 4-(3). DFS(Depth-First Search) 깊이 우선 탐색이라고 부르며 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다. 1. 그래프의 기본구조 노드와 간선으로 표현된다. 노드를 정점이라고도 말한다. 그래프 탐색은 하나의 노드를 시작으로 다수의 노드를 방문하는 것을 말한다. 두 노드가 간선으로 연결되어 있으면 인접하다고 표현한다. + 인접 행렬과 인접 리스트에 대한 개념을 확실히 해야 한다. 인접 행렬 : 2차원 배열로 그래프의 연결 관계를 표현하는 방식 인접 리스트 : 리스트로 그래프의 연결 관계를 표현하는 방식 파이썬에서 리스트로 행렬을 표시할 때에는 graph = [ [0, 7, 5], [7, 0, inf], [5, inf, 0] ] 이런 식으로 표현을 한다..

[Algorithm] 4-(2) 재귀함수 [내부링크]

[Algorithm] 4-(2) 재귀함수 1. 개념과 특징 자기 자신을 다시 호출하는 함수다. DFS를 실질적으로 구현하고자 할 때 사용하기도 한다. def recursive_function(): print(‘재귀 함수를 호출한다.’) recursive_function() recursive_function() 재귀 함수를 문제 풀이에서 사용할 때는 재귀 함수의 종료 조건을 반드시 명시해야 한다. 즉, 다시 자기자신을 부르는 return값 이외에 일정 조건(종료조건)이 되면 return 해주는 식이 있어야 한다. 종료 조건을 제대로 명시하지 않으면 함수가 무한히 호출될 수 있다. 파이썬은 최대 재귀 깊이 제한이 있다. 조건을 두지 않고 재귀적으로 함수를 호출하면 무한으로 생성되지 않고 오류가 나면서 종료된..

[자료구조] 스택, 큐, 덱 [내부링크]

[자료구조] 스택, 큐, 덱 들어가며. 스택, 큐, 덱은 알고리즘이라기 보다는 data를 관리하는 구조라고 할 수 있다. 스택, 큐, 덱을 활용한 알고리즘이 BFS, DFS 등등이 되는 것이다. 비유를 하자면, 우리가 운동할 때 힘(input)을 들여 수축과 이완(자료구조)을 통해 어떤 자세(알고리즘)를 반복 수행해서 근육을 얻고 지방을 태우는(Output) 과정을 수행하는 것에 비유를 할 수 있겠다. 운동은 굽히고 펴는 것부터 시작한다. 이처럼 기본적인 것이 자료구조이며, 이를 잘 알고 이에 대한 특성을 잘 활용할 때 좋은 알고리즘을 통해 뛰어난 프로그램을 만들 수 있는 것이다. 1. 기본적인 개념 더보기 배열(Array) vs 리스트(list) 가장 기본이 되는 순차적(sequential) 자료 구조..

[Algorithm] 4. 그래프 탐색 알고리즘 [내부링크]

[Algorithm] 4. 그래프 탐색 알고리즘 탐색이란 많은 양의 데이터 중 원하는 데이터를 찾는 과정이다 대표적인 그래프 탐색 알고리즘은 DFS, BFS가 있다. DFS/BFS는 코테에서 매우 자주 등장하는 유형이기에 반드시 숙지해야 한다. 1. 필수 개념 자료구조의 기초 개념으로 스택과 큐가 있으며, 두 핵심적인 함수로 구성된다. Push(삽입) : 데이터를 삽입한다. Pop(삭제) : 데이터를 삭제한다. 스택과 큐는 오버플로우, 언더플로우를 고민해야 한다. 오버플로우는 자료구조가 수용할 수 있는 데이터 크기를 가득 찬 상태에서 삽입 연산할 때 발생 언더플로우는 데이터가 없는 상태에서 삭제 연산을 할 때 발생

[Algorithm] 3. 구현 [내부링크]

[Algorithm] 3. 구현 1. 개념과 접근 1) 개념 머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정이다. problem - thinking - soultion 문제가 있고, 그것을 생각해서 해결점을 제시하는 것, 모든 문제가 구현 유형의 문제라고 할 수 있다. 모든 문제가 구현의 과정을 거쳐야 한다. 피지컬이 좋다 => 구현을 잘한다. (기초 체력과 같다.) 다만 협의적으로 볼 때, 구현이 어려운 문제를 ‘구현’ 유형의 문제라고 한다. 2) 접근 방법 풀이를 떠올리는 것은 쉽지만, 소스코드로 옮기기 어려운 문제가 이에 해당한다. ex. 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제 실수 연산을 다루고, 특정 소수점 자리까지 출력해야 하는 문제 문자열을 특정한 기준에 따라서 끊어 처리해야 ..

[Algorithm] 2. 그리디 알고리즘(Greedy) [내부링크]

[Algorithm] 2. 그리디 알고리즘(Greedy) 1. 개념과 접근 방법 1) 개념 : 현재 상황에서 지금 당장 좋은 것만 고르는 방법이다. 2) 접근 방법 일반적으로 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요한다. 특정 문제를 만났을 때 단순히 현재 상황에서 가장 좋아 보이는 것만을 선택해도 문제를 풀 수 있는지를 파악할 수 있어야 한다. 이를 위해 정당성 분석이 가장 중요하다. 단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는 지 검토하여야 한다. 다양한 아이디어를 떠올려보면서 고민을 해야 하고 창의적 발상을 통한 가정과 그 풀이 방법에 대한 검증이 필요하다. 보통 ‘최소’의 횟수, 금액, 개수 등을 요구한다. 그리디는 최적의 해를 보장할 수 없..

[Algorithm] 1. 시간 복잡도, 공간 복잡도 [내부링크]

[Algorithm] 1. 시간 복잡도, 공간 복잡도 1. 복잡도란? 더보기 알고리즘의 성능을 나타내는 척도 얼마나 복잡한지를 의미한다. 높아질 수록 좋지는 않은 것이다. 알고리즘은 컴퓨터 속에서 돌아간다. 그렇기 때문에 얼마나 더 오래 걸리느냐, 얼마나 더 큰 용량을 차지하느냐로 복잡도를 계산한다. 이를 각각 시간 복잡도, 공간 복잡도라고 한다. 시간 복잡도와 공간 복잡도는 일종의 거래 관계에 있다. 마치 역세권을 희망하면 월세가 높아지고, 월세를 낮추려면 역세권을 포기해야 하는 것처럼 메모리를 더 사용하는 대신 시간을 줄일 수도 있고 시간을 더 쓰는 대신 메모리 용량을 작게 사용할 수 있다. 이 계산은 우리가 유한한 성능을 가진 컴퓨터와 기기들을 가지고 있기 때문에, 효율적이고 더 빠르고, 더 경제적..

[백준] 10816 숫자 카드 2 python 알고리즘 문제 [내부링크]

문제 10816. 숫자 카드 2 1. 나의 코드와 발상 과정 (1) 제출 답안 from bisect import bisect_left, bisect_right import sys n = int(input()) num_list = list(map(int, sys.stdin.readline().split())) m = int(input()) find_list = list(map(int, sys.stdin.readline().split())) num_list.sort() def count_by_range(array, left, right): right_index = bisect_right(array, right) left_index = bisect_left(array, left) return right_ind..

[백준] 1920 수 찾기 python 알고리즘 문제 [내부링크]

문제 1920. 수 찾기 1. 나의 코드와 발상 과정 import sys n = int(input()) num_list = list(map(int, sys.stdin.readline().split())) m = int(input()) find_list = list(map(int, sys.stdin.readline().split())) num_list.sort() def count_by_range(array, target, start, end): if start > end: return 0 mid = (start + end) // 2 if array[mid] == target: return 1 elif array[mid] > target: return(count_by_range(array, target, ..

[백준] 1978 소수 찾기 python 알고리즘 문제 [내부링크]

문제 1978. 소수 찾기 1. 나의 코드와 발상 과정 ## 오답 n = int(input()) num_list = list(map(int, input().split())) ans = 0 for i in range(n): a = num_list[i] if a == 2 or a == 3 or a == 5 or a == 7: ans += 1 elif a == 1 or a % 2 == 0 or a % 3 == 0 or a % 5 == 0 or a % 7 == 0: continue else: ans += 1 print(ans) 1은 소수가 아니다. 소수는 1과 자기자신만을 약수로 가지는 수이다. 그렇다면 소수가 아닌 수에 공통적으로 들어가 있는 소수는 무엇일까? 아 2, 3, 5, 7이 있지 않을까. 그러면 2..

[백준] 4949 균형잡힌 세상 python 알고리즘 문제 [내부링크]

문제 4949. 균형잡힌 세상 1. 나의 코드와 발상 과정 import sys answer_list = [] while True: a = sys.stdin.readline().rstrip() if a == '.': break answer = [] for i in a: if i.isalpha() or i == " ": continue elif i == '.': break elif i == '(': answer.append(i) elif i == '[': answer.append(i) elif i == ')': if len(answer) != 0 and answer[-1] == '(': answer.pop() else: answer.append(')') continue elif i == ']': if len..

[백준] 9012 괄호 python 알고리즘 문제 [내부링크]

문제 9012. 괄호 1. 나의 코드와 발상 과정 ### 오답 from collections import deque queue = deque() n = int(input()) vps_list = list() ans_list = [] for i in range(n): vps_list.append(deque(input())) for vps in vps_list: if len(vps) % 2 != 0 or vps[0] == ')': ans_list.append('NO') continue else: while True: if len(vps) == 0: ans_list.append('YES') break if vps[-2] == '(' and vps[-1] == ')': vps.pop() vps.pop() els..

[백준] 10773 제로 python 알고리즘 문제 [내부링크]

문제 10773. 제로 1. 나의 코드와 발상 과정 import sys k = int(sys.stdin.readline()) money_list = [] for i in range(k): a = int(sys.stdin.readline()) if a == 0: money_list.pop() else: money_list.append(a) print(sum(money_list)) 문제도 어렵지 않았고, 코드 구성도 간단했다. money_list 속에 a를 받아오는데, 만약 0이라면 현재 입력값을 넣지 않고, 그 전 반복에서 넣었던 숫자를 뺀다. a가 0이 아닐 경우에만 계속 list에 집어 넣고, money_list의 전체 입력값을 더해 출력한다. 문제 출처: https://www.acmicpc.net/p..

[백준] 2164 카드2 python 알고리즘 문제 [내부링크]

문제 2164. 카드2 1. 나의 코드와 발상 과정 from collections import deque n = int(input()) queue = deque([i for i in range(n, 0, -1)]) while len(queue) > 1: queue.pop() queue.rotate(1) # queue.appendleft(queue.pop()) print(queue[0]) 4321 을 예로 들면, 1번이 빠지고 432가 남고 그다음 2를 맨 뒤에 배치해서 243이 되게 만든다. 이 순환을 반복해서 하나의 원소만 남게 하면 된다. 구글 선생님께 queue.appendleft(queue.pop())의 과정을 단순하게 할 수 있는 것이 무엇이 있냐 했더니, collection.deque 모듈의 ..

[백준] 11866 요세푸스 문제 0 python 알고리즘 문제 [내부링크]

문제 11866. 요세푸스 문제 0 1. 나의 코드와 발상 과정 from collections import deque queue = deque() answer = [] n, k = map(int, input().split()) for i in range(1, n+1): queue.append(i) while len(answer) < n: for i in range(k-1): queue.append(queue.popleft()) answer.append(queue.popleft()) print("") 예제 입력을 보고 순간 이해가 되지 않았다. 1~7번째의 사람이면 첫 번째 죽는 사람은 3번째 사람인데, 왜 6번째 사람이 1번으로 죽는 것인지에 대해 의문이었다. 그렇지만 잘못 이해했다는 것을 금방 알 수 ..

[백준] 10866 덱 python 알고리즘 문제 [내부링크]

문제 10866. 덱 1. 나의 코드와 발상 과정 import sys from collections import deque n = int(input()) queue = deque() answer = [] for _ in range(n): order = sys.stdin.readline().strip() if order[0:10] == 'push_front': queue.append(int(order[11:])) elif order[0:9] == 'push_back': queue.appendleft(int(order[10:])) elif order[0:9] == 'pop_front': if not queue: answer.append(-1) else: answer.append(queue.pop()) eli..

[백준] 10845 큐 python 알고리즘 문제 [내부링크]

문제 10845. 큐 1. 나의 코드와 발상 과정 import sys from collections import deque n = int(input()) queue = deque() for _ in range(n): order = sys.stdin.readline().strip() if order[0:4] == 'push': queue.appendleft(int(order[5:])) elif order[0:5] == 'front': if not queue: print(-1) else: print(queue[-1]) elif order[0:4] == 'back': if not queue: print(-1) else: [print(queue[0])] elif order[0:4] == 'size': print..

[백준] 10828 스택 python 알고리즘 문제 [내부링크]

문제 10828. 스택 1. 나의 코드와 발상 과정 import sys n = int(input()) queue = [] for _ in range(n): order = sys.stdin.readline().strip() if order[0:4] == 'push': queue.append(int(order[5:])) elif order[0:3] == 'top': if not queue: print(-1) else: print(queue[-1]) elif order[0:4] == 'size': print(len(queue)) elif order[0:5] == 'empty': if len(queue) == 0: print(1) else: print(0) else : if not queue: print(-1)..

[백준] 1436 영화감독 숌 python 알고리즘 문제 [내부링크]

문제 1436. 영화감독 숌 1. 나의 코드와 발상 과정 doom_list = [] i = 0 while True: if '666' in str(i): doom_list.append(i) i += 1 if len(doom_list) == 10000: break print(doom_list[int(input())-1]) 일단 문제에 대한 이해가 살짝은 필요했다. 반복되는 6이 세번 있으면 그 숫자를 영화의 제목으로 쓰는 것이다. 1편부터 쓰는 영화의 제목에 들어갈 수는 다음과 같다. 666, 1666, 2666, 3666, 4666, 5666, ... 6편까지는 앞자리 숫자가 바뀌는데, 7번째부터 숫자가 바뀐다. 6660, 6661, 6662, 6663, ... 6666, ... 6669, 7666, ....

[백준] 1181 단어 정렬 python 알고리즘 문제 [내부링크]

문제 1181. 단어 정렬 1. 나의 코드와 발상 과정 n = int(input()) word_list = [] for i in range(n): word_list.append(str(input())) word_list = list(set(word_list)) ## attribute error word_list.sort() word_list.sort(key = lambda x : len(x)) for word in word_list: print(word) 잘 돌아가는 코드이다. word_list를 만들어서 그 안에 입력값들을 저장하고, set() 즉, 집합을 활용해서 중복 원소들을 털어내버리고, sort()로 알파벳 순 정렬을 한 다음에, 문자열 길이를 기준으로 해서 또 정렬을 해준다. 그런 다음 프린트..

[백준] 10814 나이순 정렬 python 알고리즘 [내부링크]

문제 10814. 나이순 정렬 1. 나의 코드와 발상 과정 # 정답 (4092ms) n = int(input()) member_list = [] for i in range(n): member_list.append(list(input().split())) member_list.sort(key = lambda x: int(x[0])) for i in range(n): print(member_list[i][0], member_list[i][1]) # 런타임 에러(IndexError) n = int(input()) member_list = {} for i in range(n): age, name = list(map(str, input().split())) member_list[name] = int(age) s1..

[백준] 1018 체스판 다시 칠하기 python 알고리즘 문제 [내부링크]

문제 1018. 체스판 다시 칠하기 1. 나의 코드와 발상 과정 n, m = map(int, input().split()) board_list = [] for i in range(n): board_list.append(input()) # 연산(보드판을 일부 잘라 체크무늬로 칠해져 있는지 확인) test_list = [] for i in range(n - 7): # 찾을 출발점 for j in range(m - 7): first_W = 0 first_B = 0 for k in range(i, i + 8): for l in range(j, j + 8): if (k + l) % 2 == 0: if board_list[k][l] != 'W': first_W += 1 if board_list[k][l] != 'B..

[백준] 7568 덩치 python 알고리즘 문제 [내부링크]

문제 7568. 덩치 1. 나의 코드와 발상 과정 import sys n = int(sys.stdin.readline()) num_list = [] for i in range(n): x, y = map(int, sys.stdin.readline().split()) num_list.append([x, y]) def dungchi(x, y): k = 0 for i in range(n): if x < num_list[i][0] and y < num_list[i][1]: k += 1 return k rank_list = [] for i in range(n): rank_list.append(dungchi(num_list[i][0], num_list[i][1])) for i in range(n): print(ran..

[백준] 11650 좌표 정렬하기 python 알고리즘 문제 [내부링크]

문제 11650. 좌표 정렬하기 1. 나의 코드와 발상 과정 import sys n = int(sys.stdin.readline()) num_list = [] for i in range(n): m = list(map(int, sys.stdin.readline().split())) num_list.append(m) num_list.sort() for i in range(n): print(num_list[i][0], num_list[i][1]) ###################### #오답 import sys n = int(sys.stdin.readline()) num_list = [] for i in range(n): m = list(map(int, sys.stdin.readline().split()))..

[백준] 10989 수 정렬하기 python 알고리즘 문제 [내부링크]

문제 10989. 수 정렬하기 3 1. 나의 코드와 발상 과정 import sys n = int(sys.stdin.readline()) num_list = [0]*10001 for i in range(n): num = int(sys.stdin.readline()) num_list[num] += 1 for i in range(10001): if num_list[i] != 0: for j in range(num_list[i]): print(i) 굉장히 제한된 시간과 메모리이기 때문에 리스트를 하나 더 생성해서 정렬을 한다던지 하는 방법이 활용될 수 없다. 그래서 10000까지 나오는 자연수이기 때문에 인덱스를 10000까지 가지는 빈 리스트를 만들어서 연속으로 입력되는 num값을 num_list의 인덱스로 ..

[백준] 2798 블랙잭 python 알고리즘 문제 [내부링크]

문제 2798. 블랙잭 1. 나의 코드와 발상 과정 n, m = map(int, input().split()) card_num = list(map(int, input().split())) card_num.sort(reverse = True) card_sum = [] for i in range(n): for j in range(n): for k in range(n): if i == j or i == k or j == k: continue card_sum.append(card_num[i]+card_num[j]+card_num[k]) card_sum.sort(reverse = True) for i in range(len(card_sum)): if int(card_sum[i]) > m: continue else..

[백준] 11050 이항 계수 python 알고리즘 문제 [내부링크]

문제 11050. 이항 계수 1 1. 나의 코드와 발상 과정 def fac(n): if n == 0: return 1 return n * fac(n-1) n, k = map(int, input().split()) print(fac(n)//(fac(k)*fac(n-k))) def를 처음 알고리즘 공부에 사용하기 시작하였다. 이항계수가 뭔지 몰라 구글 선생님께 물어보다가 이항계수는 팩토리얼 개념이 들어가 있다는 것을 알았다. 아하... 조합... 계속해서 곱하는 것을 다음과 같이 할 수 있다는 정보를 얻을 수 있었다. (1) 반복문 (2) 재귀함수 구현 이제 함수도 구현해야 하니까.. 직접 네 줄의 코드를 짜보았다. 어제 재귀함수 강의 살짝 듣고 복습했는데 구상을 하려고 하니 머리가 아팠지만 금방 떠올려서 ..

[백준] 2869 달팽이는 올라가고 싶다 python 알고리즘 문제 [내부링크]

문제 2869. 달팽이는 올라가고 싶다. 1. 나의 코드와 발상 과정 ### 시간초과 a, b, v = map(int, input().split()) day = v // (a - b) + 1 len_sum = 0 for i in range(1, day): len_sum += a if len_sum >= v: print(i) break else : len_sum -= b ##### a, b, v = map(int, input().split()) day = (v - b) // (a - b) if (v - b) % (a - b) == 0: print(day) else: print(day + 1) 0.15초라는 시간제한이 있기 때문에 최소한의 반복을 해야 한다. 반복문을 쓰지 않고 풀어보았다. (위에껀 써봤더니..

[백준] 2231 분해합 python 알고리즘 문제 [내부링크]

문제 2231. 분해합 1. 나의 코드와 발상 과정 n = int(input()) n_list = list(range(1,1000001)) for i in range(len(n_list)): m = 0 struc = list(map(int, str(n_list[i]))) m = n_list[i] + sum(struc) if m == n: print(n_list[i]) break if m != n: print(0) 처음에 이해를 잘 하지 못했는데 예제를 잘 들여다보면 금방 파악할 수 있다. 216을 입력 받으면 216을 '만들수 있는' 생성자 216 = '198'+1+9+8 을 찾아내라는 문제이다. 그럼 저건 어떻게 알 수 있을까 고민을 해보았는데, 배열을 두 개 만들면 되지 않나 하는 생각을 했다. N이..

[백준] 10250 ACM 호텔 python 알고리즘 문제 [내부링크]

문제 10250. ACM 호텔 1. 나의 코드와 발상 과정 (오답) ## 오답 1. t = int(input()) ans_list = [] for i in range(t): h, w, n = map(int,input().split()) if n // h + 1 < 10 and n % h != 0 : answer = str(n % h) + '0' + str(n // h + 1) elif n // h + 1 < 10 and n % h == 0 : answer = str(h) + '0' + str(n // h) else : if h == 1 and n // h + 1 < 10: answer = str(h) + '0' + str(w) elif h == 1 and w >= 10: answer = str(h) + ..

[백준] 2839 설탕 배달 python 알고리즘 문제 [내부링크]

문제 2839. 설탕 배달 1. 나의 코드와 발상 과정 n = int(input()) new_n1, new_n2 = n, n cnt1, cnt2 = 0, 0 cnt1 += new_n1 // 5 new_n1 = new_n1 - cnt1 * 5 cnt1 += new_n1 // 3 if new_n1 % 3 != 0 : vari1 = -1 else : vari1 = cnt1 cnt2 += new_n2 // 3 new_n2 = new_n2 - cnt2 * 3 cnt2 += new_n2 // 5 if new_n2 % 5 != 0 : vari2 = -1 else : vari2 = cnt2 if vari1 == -1 : if vari2 > 0 : print(vari2) else : print(-1) elif vari2..

python 로또 번호 생성기 [내부링크]

for 반복문을 배우면 언어를 불문하고 코린이라면 누구든 한 번쯤 보았을 문제! 바로 'random'의 특징과 부동 소수점 곱하기를 활용한 로또번호 생성기 만들어보기. 보통의 문제는 다음과 같죠. import random a = 0 x = [] for i in range(6): a = random.randint(1, 45) x.append(a) x.sort() print(x) 이렇게 랜덤으로 생성된 정수 중 하나를 리스트에 넣고 출력시키는 방식으로 하면 대부분 해결이 되죠. 뭐, 여기에 5개 세트의 게임을 출력하라던지, 아니면 게임 수를 입력받아서 출력시키는 방법도 더해질 수 있습니다. 위의 코드를 실행하면 다음과 같이 됩니다. 로또 번호 같은 것이 생성이 되었습니다. 하지만 마스터가 꿈인 라마스떼는 갑..

[백준] 1546. 평균 python 알고리즘 [내부링크]

문제 1546. 평균 1. 나의 코드와 발상 과정 n = int(input()) scores = list(map(int, input().split())) m = max(scores) new_scores = list() for i in range(len(scores)) : new_scores.append(scores[i] / m * 100) sum = 0 for i in range(len(new_scores)) : sum += new_scores[i] average = sum / n print(average) 이 문제는 최댓값을 가지고 새로운 점수의 리스트를 만들어 평균만 계산해주면 되는 문제이다. 5번 라인에서 기존의 스코어를 점수/n*100으로 모두 만들어 새로운 스코어 리스트에 집어넣는다. 그런 다음..

[백준] 1267 python 알고리즘 [내부링크]

문제 1267. 핸드폰 요금 1. 나의 코드와 발상 과정 n = int(input()) calltime = list(map(int, input().split())) # 영식 요금제 y yfee = 0 for i in range(len(calltime)) : yfee = yfee + (calltime[i] // 30) * 10 if (calltime[i] % 30) < 30 : yfee += 10 else : yfee += 20 # 민식 요금제 m mfee = 0 for i in range(len(calltime)) : mfee = mfee + (calltime[i] // 60) * 15 if (calltime[i] % 60) < 60 : mfee += 15 else : mfee += 30 if yfee ..

[백준] 8958 OX 퀴즈 python 알고리즘 [내부링크]

문제 8958. OX 퀴즈 1. 좋은 코드 a = int(input()) for i in range(a): b = input() data = list(b) result = 0 k = 1 for i in data: if i == "O": result += k k += 1 else: k = 1 print(result) 더 좋은 코드를 찾다 발견했다. 'data' 리스트, 2중 for문, 문자열을 특징을 활용해서 간결하게 각 케이스의 'O'의 개수인 result를 뽑아내고 있다. 2. 나의 접근과 발상 try_game = int(input()) ox_all_list = [] # X 기준으로 글자를 잘라 리스트로 저장 # filter 함수를 이용하여 ox_list의 공백을 제거 for i in range(try..