728x90

리눅스에서 C를 사용한 간단한 게임을 만들고 있는데요, 카드덱을 섞을 일이 있어서 섞는 알고리즘을 지피티쟝이 알려줌

 

근데 Fisher-Yates algorithm이랑 Knuth Shuffle algorithm 이렇게 두가지가 있더라고요? 

제가 썼던건 knuth shuffle인데 지피티한테 효율적으로 바꿔달라 하니까 fisher yates로 바꾸길래 어떤 차이가 있나 싶어서 알아봤습니다.

 

Fisher-Yates Algorithm 의 역사

Fisher-Yates 알고리즘은 1938년 Ronald A. Fisher와 Frank Yates가 고안한 알고리즘입니다.

이 알고리즘은 원래 통계학에서 무작위로 섞은 샘플을 만들기 위해 개발되었는데, 나중에 컴퓨터 분야에서 배열을 무작위로 섞는데 사용되었다고 한다.

 

처음 컴퓨터 분야에서 사용되기 시작한건 1964년이다. 초기 버전에는 배열의 각 요소를 무작위로 선택할때 주사위를 이용했지만, 나중엔 난수 생성기를 사용해서 구현되었다고 한다. 지금은 아주 빠르고 효율적으로 구현할수 있다. 

 

사실 이건 굳이 알 필요는 없는데... 제가 궁금함

이름이 너무 귀엽고 찰져서 왜 fisher 지? 사람 이름이 fisher인가? 싶어서 알아봤어요

 

근데 진짜 사람 이름이었음... 죄송

 

Fisher-Yates Algorithm 이란?

이 알고리즘은

  1. 섞을 배열의 마지막 요소부터 시작하여, 배열의 첫 요소까지 반복합니다.
  2. 현재 위치에서 이전 위치까지의 범위에서 무작위로 하나의 요소를 선택합니다.
  3. 현재 위치와 선택된 위치의 요소를 교환합니다.
  4. 이전 위치로 이동하여 반복을 계속합니다.

이런식으로 작동된다.

 

모든 요소가 균등하게 무작위로 선택되기 때문에, 섞는 효과가 높다. 

시간 복잡도는 O(n)이다.

 

Fisher-Yates Algorithm 과 Knuth Shuffle Algorithm의 차이

Fisher-Yates:

import random

def fisher_yates_shuffle(arr):
    n = len(arr)
    for i in range(n-1, 0, -1):
        j = random.randint(0, i)
        arr[i], arr[j] = arr[j], arr[i]
    return arr

# 예시
arr = [1, 2, 3, 4, 5]
print(fisher_yates_shuffle(arr))

 

Knuth Shuffle:

import random

def knuth_shuffle(arr):
    n = len(arr)
    for i in range(n-1):
        j = random.randint(i, n-1)
        arr[i], arr[j] = arr[j], arr[i]
    return arr

# 예시
arr = [1, 2, 3, 4, 5]
print(knuth_shuffle(arr))

 

무슨 차이가 있냐면 

Fisher-Yates 알고리즘 배열의 뒤에서부터 앞으로 이동하면서 요소를 선택하여 섞음 O(n)
Knuth Shuffle 알고리즘 배열의 앞에서부터 뒤로 이동하면서 요소를 선택하여 섞음 O(n)

이런 차이가 있다. 

Fisher yates는 배열의 뒤에서부터 앞으로 이동하고 knuth shuffle은 앞에서부터 뒤로 이동한다. 

 

그래서 그냥 차이는 앞에서부터 하냐 뒤에서부터 하냐의 차인데 지피티는 계속 내 knuth shuffle 알고리즘을 fisher yates 로 바꾼다. 왜그러는지 모르겠다;;

 

 

728x90
728x90

HTTP가 뭐야?

HTTP는 HyperText Transfer Protocol의 약자로, 인터넷에서 데이터를 주고받을 때 사용되는 프로토콜입니다.

HTTP는 웹 브라우저웹 서버 간에 메시지를 교환하여 웹 페이지를 요청하고 전송하는 데 사용됩니다.

 

HTTP는 클라이언트-서버 모델을 따르며, 클라이언트가 요청(Request)을 보내면, 서버는 이 요청에 대한 응답(Response)을 반환합니다. 요청과 응답은 HTTP 메시지 형식으로 구성되며, 이 메시지는 텍스트 형식으로 작성됩니다.

 

HTTP는 웹 페이지를 전송하는 데 사용되며, 웹 페이지의 HTML, CSS, JavaScript 및 이미지 등의 리소스를 요청하고 전송합니다.

또한, HTTP는 웹 서버와 데이터베이스 서버, 웹 애플리케이션 서버 등의 서버 간 통신에도 사용됩니다.

 

HTTP는 기본적으로 TCP/IP 프로토콜 위에서 동작하며, 보안을 강화하기 위해 HTTPS(SSL/TLS 기반)로 대체되는 추세입니다.

HTTP는 웹의 발전과 함께 계속해서 발전하고 있으며, 현재는 HTTP/2, HTTP/3 등의 새로운 버전이 나와 사용되고 있습니다.

 

 

Axios 가 뭐야?

axios는 Promise 기반의 HTTP 클라이언트 라이브러리로, Node.js나 브라우저에서 사용할 수 있습니다. axios는 서버와의 HTTP 요청과 응답을 쉽게 처리할 수 있도록 도와주는 라이브러리입니다.

 

axios는 다음과 같은 기능을 제공합니다.

  • HTTP 요청과 응답을 Promise 기반으로 처리할 수 있습니다.
  • 브라우저와 Node.js 모두에서 사용할 수 있습니다.
  • JSON 데이터를 자동으로 직렬화하고, 응답 데이터도 자동으로 역직렬화합니다.
  • 요청과 응답에 대한 인터셉터 기능을 제공하여 요청과 응답을 수정할 수 있습니다.
  • HTTP 요청에 대한 취소 기능을 제공합니다.
  • HTTP 요청을 취소할 수 있는 CancelToken 기능을 제공합니다.

axios는 간단한 API를 제공하므로, HTTP 요청을 보내는 코드를 빠르게 작성할 수 있습니다. 또한 브라우저와 Node.js에서 모두 사용할 수 있으므로, 클라이언트와 서버 간의 HTTP 통신을 일관성 있게 처리할 수 있습니다.

 

더보기

그래서 ChatLaTeX 프로젝트를 진행할때 Axios를 사용해서 HTTP 요청을 보내는 코드를 간략화했다. 

 

Bearer 는 뭐야?

"Bearer"는 HTTP 인증 프로토콜에서 사용되는 토큰 기반 인증 방식 중 하나입니다.

헤더에 "Authorization" 필드를 포함하여 인증 정보를 전송할 때, "Bearer"는 토큰 기반 인증 방식을 사용한다는 것을 나타내며, 그 뒤에는 인증 토큰이 포함됩니다.

 

fetch('https://api.openai.com/v1/engines/davinci/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': Bearer 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
},
body: JSON.stringify({
prompt: 'Write a sad poem about my border collie, Pepper',
max_tokens: 100
})
})
.then(response => response.json())
.then(data => {
console.log(data);
});

 

해당 코드에서 "Bearer" 다음에 오는 인증 토큰은 OpenAI API에 접근하기 위한 인증 토큰입니다. 이 토큰을 API에 제공하여 사용자 인증을 수행합니다. 이러한 방식으로 API를 보호하여 인증되지 않은 사용자가 API를 사용하는 것을 방지합니다.

728x90
728x90

CDN 이란 무엇일까

CDN(Content Delivery Network)은 인터넷 사용자가 웹 사이트를 방문할 때, 컨텐츠(이미지, 동영상, 문서 등)를 더 빠르게 전달하기 위해 사용되는 기술입니다. CDN은 전 세계에 분산된 서버 네트워크를 활용하여, 사용자와 가까운 위치에 있는 서버에서 컨텐츠를 제공함으로써 지연 시간을 최소화하고 대역폭을 줄이는 효과를 가집니다.

CDN은 일반적으로 다음과 같은 구성 요소로 구성됩니다.

  1. Origin Server: 웹 사이트의 원본 컨텐츠를 저장하는 서버입니다.
  2. Edge Server: 전 세계에 분산된 서버 네트워크 중, 사용자와 가까운 위치에 있는 서버입니다. Edge Server는 사용자 요청에 대한 응답을 빠르게 처리하기 위해 캐싱 등의 기술을 사용합니다.
  3. DNS Server: CDN 서비스를 사용하는 경우, DNS(Domain Name System) 서버는 사용자 요청을 Edge Server로 라우팅합니다.

CDN 의 장점

  1. 빠른 전송 속도: CDN은 전 세계에 분산된 서버 네트워크를 활용하여, 사용자가 컨텐츠를 빠르게 다운로드할 수 있도록 합니다.
  2. 대역폭 감소: CDN은 Edge Server에서 컨텐츠를 캐싱하므로, 원본 서버로의 요청을 줄이고 대역폭을 절약할 수 있습니다.
  3. 서버 부하 감소: CDN은 Edge Server에서 컨텐츠를 캐싱하므로, 원본 서버의 부하를 줄일 수 있습니다.
  4. 보안 강화: CDN은 DDoS 공격 등의 보안 위협으로부터 원본 서버를 보호할 수 있습니다.
  5. 지리적 제한 해결: CDN은 전 세계에 분산된 서버 네트워크를 활용하여, 지리적 제한을 해결할 수 있습니다.

 

CDN을 사용하는 사이트 예시

  1. Netflix: Netflix는 전 세계에서 콘텐츠를 제공하는 대규모 비디오 스트리밍 서비스입니다. Netflix는 CDN을 사용하여 전 세계적인 사용자들에게 빠르고 안정적인 비디오 스트리밍 경험을 제공하고 있습니다.
  2. Amazon: Amazon은 전 세계적인 온라인 쇼핑 몰로서, 많은 양의 콘텐츠(제품 이미지, 동영상 등)을 제공하고 있습니다. Amazon은 CDN을 사용하여 사용자의 지리적 위치에 따라 가장 가까운 서버에서 콘텐츠를 제공함으로써, 사용자의 페이지 로드 속도를 향상시키고 대역폭을 절약하고 있습니다.
  3. Google: Google은 전 세계적으로 매우 인기 있는 검색 엔진입니다. Google은 CDN을 사용하여 매우 빠른 검색 결과 및 이미지, 동영상 등의 콘텐츠를 제공하고 있습니다.
  4. Facebook: Facebook은 전 세계적으로 매우 인기 있는 소셜 네트워크입니다. Facebook은 CDN을 사용하여 전 세계적인 사용자들에게 빠르고 안정적인 페이지 로드 속도를 제공하고 있습니다.
  5. YouTube: YouTube는 전 세계적으로 매우 인기 있는 동영상 공유 서비스입니다. YouTube는 CDN을 사용하여 전 세계적인 사용자들에게 빠르고 안정적인 동영상 스트리밍 경험을 제공하고 있습니다.

이러한 대형 웹 사이트들은 매우 방대한 양의 콘텐츠를 제공하고 있으며, 전 세계적으로 수많은 사용자들이 접근하고 있기 때문에, CDN을 사용하여 콘텐츠를 더욱 빠르고 안정적으로 제공하는 것이 매우 중요합니다.

 

CDN을 사용하지 않으면 생기는 문제들

  1. 지연 시간: CDN을 사용하지 않으면, 전 세계적으로 분산되어 있는 사용자들이 웹 사이트에 접근할 때, 원본 서버에서 모든 컨텐츠를 다운로드해야 합니다. 이는 사용자 경험을 떨어뜨릴 뿐만 아니라, 웹 사이트의 성능과 로드 시간을 늦추는 원인이 됩니다.
  2. 대역폭 문제: 웹 사이트의 인기가 많아지면, 대량의 트래픽이 발생하게 됩니다. 이는 대역폭을 초과하여 원본 서버에 부하를 줄 수 있습니다. 이로 인해 웹 사이트가 다운되거나 느려지는 문제가 발생할 수 있습니다.
  3. 성능 문제: 사용자가 웹 사이트에 접근할 때, 원본 서버에서 모든 컨텐츠를 다운로드해야 하기 때문에, 웹 사이트의 성능이 떨어질 수 있습니다. 이는 사용자 경험을 저하시키고, 웹 사이트의 검색 엔진 최적화(SEO)에도 영향을 미칩니다.
  4. 보안 문제: CDN을 사용하지 않으면, 원본 서버에 대한 공격이 쉽게 이루어질 수 있습니다. 또한, 원본 서버에서 컨텐츠를 다운로드하는 과정에서, 중간자 공격(MITM) 등의 보안 문제가 발생할 수 있습니다.

 

728x90
728x90

코딩 면접 연습을 위한 무료 코딩 테스트 사이트 추천

우리 AI 가 추천해준 코테 사이트들. 다 무료라고 한다. 

  1. HackerRank (https://www.hackerrank.com/) - HackerRank는 다양한 언어로 코딩 문제를 제공하며, 튜토리얼과 비디오 수업도 제공합니다.
  2. LeetCode (https://leetcode.com/) - LeetCode는 난이도 및 카테고리별로 분류된 대규모 코딩 문제 모음을 제공합니다.
  3. Codewars (https://www.codewars.com/) - Codewars는 다양한 코딩 과제를 제공하며, 피드백 및 토론을 위한 커뮤니티도 제공합니다.
  4. Project Euler (https://projecteuler.net/) - Project Euler는 컴퓨터 프로그래밍을 사용하여 해결할 수 있는 수학 및 프로그래밍 문제를 제시합니다.
  5. Coderbyte (https://coderbyte.com/) - Coderbyte는 코딩 과제 및 튜토리얼을 제공하며, 다른 사용자와 코딩 과제 경쟁 기회도 제공합니다.

이 모든 사이트는 무료로 제공되며, 코딩 스킬을 연습하고 코딩 면접을 준비할 수 있는 좋은 방법을 제공합니다. 행운을 빕니다!

 

행운을 빌라고 응원까지 해줬다. 

 

내가 쓰는 사이트 - Leet Code (리트코드)

원래도 이걸 쓰고 있었다. 근데 왜 알고있는진 모르겠다. 

예전의 내가 찾아봤겠지. 

 

역시 외국사이트 답게 링크드인 연결이 가능하다. 

 

AI가 추천해준대로 단계별로 잘 되어있다. 

가장 백준이랑 유사한 사이트인거 같다. 

 

코딩 테스트는 어떻게 준비해?

리트코드(LeetCode)는 대규모 코딩 문제 모음을 제공하며, 효과적인 코딩 테스트 연습에 적합한 사이트입니다. 이를 통해 코딩 면접 준비를 위한 스킬 향상과 문제 해결 능력을 향상시킬 수 있습니다.

리트코드에서 코딩 테스트를 연습하는 방법은 다음과 같습니다:

  1. 문제 선택: 리트코드에는 1,000개 이상의 문제가 있으며, 난이도 및 카테고리별로 분류되어 있습니다. 자신의 레벨에 맞는 문제를 선택하여 시작하세요.
  2. 문제 풀이: 문제를 읽고 이해한 후, 코드를 작성해보세요. 여러 가지 방법으로 문제를 해결할 수 있으며, 다른 사용자의 솔루션도 확인할 수 있습니다.
  3. 제출 및 평가: 코드를 제출하면, 리트코드에서 자동으로 채점합니다. 결과에 따라 통과 여부와 실행 시간 등이 결정됩니다.
  4. 토론: 다른 사용자들과 문제에 대해 토론할 수 있습니다. 이를 통해 다른 사람의 코드를 볼 수 있으며, 자신의 코드도 개선할 수 있습니다.

리트코드를 사용하여 코딩 테스트를 연습하면, 효과적으로 코딩 스킬을 향상시킬 수 있습니다. 또한, 리트코드는 다양한 기업에서도 코딩 테스트를 진행할 때 사용하는 사이트이므로, 실제 코딩 면접에서도 도움이 될 수 있습니다.

 

고마워 AI야!

 

그럼 앞으로 코테 제대로 연습해볼게 

여기 한번 붙어보고싶거든

728x90
728x90

Direct Address Table 의 한계 

direct address table은 키(key)와 값(value)의 쌍(pair)을 저장하는 자료구조로, 키를 인덱스(index)로 사용하여 값을 저장하고 검색할 수 있다. 

이 때, 인덱스의 크기가 충분히 크면(예를 들어, 0부터 999까지의 인덱스가 있을 때, 1000개), O(1)의 검색 시간을 제공한다.

그러나 인덱스의 크기가 매우 작거나 값이 희소하게 분포할 경우, 메모리 공간의 낭비가 발생하게 된다. 

 

이러한 direct address table의 한계를 극복하기 위해, 해싱 기법을 사용하는 해시 테이블(Hash Table)이 개발되었다.

해시 테이블은 키를 해시 함수(hash function)로 변환하여 인덱스를 생성하므로, 인덱스의 크기와 값의 분포에 구애받지 않는다.

 

또한, 해시 함수를 이용하여 데이터의 위치를 찾으므로, O(1)의 검색 시간을 제공한다.

하지만 해시 테이블에도 몇가지 문제점이 존재한다. 

 

Hash Table 의 문제점

1.  충돌 (Collision)

해시 함수에 의해 생성된 인덱스가 다른 데이터와 이미 할당된 경우 충돌이 발생한다.

충돌이 발생하면, 데이터를 추가적으로 처리하여 충돌을 해결해야 한다. 

 

2. 해시 함수 성능

해시 함수의 성능이 좋지 않으면 데이터 검색 시간이 길어지게 된다. 

해시 함수는 인덱스를 생성하는데 사용되므로 충돌을 최소화하면서 빠른 속도를 제공하는 함수를 선택해야 한다. 

 

이러한 문제점을 극복하기 위해 충돌 해결(Collision Resolution)방법과 좋은 Hash Function을 선택하는것이 중요하다.

 

이러한 문제점들을 극복하기 위해, 충돌 해결(Collision Resolution) 방법과 좋은 해시 함수(Hash Function)를 선택하는 것이 중요하다.

충돌 해결 방법으로는 Open Addressing, Chaining 등이 있으며, 좋은 해시 함수 선택을 위해서는 해시 함수의 충돌 가능성과 보안성을 고려해야 한다.

 

충돌 해결 방법

충돌은 데이터를 검색하는 데 시간이 걸리며, 해시 함수 성능을 저하시킨다.

따라서 충돌을 최소화하는 해시 함수를 선택해야 하며, 충돌이 발생하였을 때는 이를 해결하는 방법을 선택해야 한다.

1. Open Addressing

Open Addressing은 충돌된 데이터를 다른 해시 테이블 위치에 저장하는 기법이다.

충돌이 발생하면, 해당 위치 이후의 다른 위치를 검색하여 데이터를 저장한다.

이러한 방법은 충돌 해결 방법 중에서도 가장 간단한 방법 중 하나이다.

하지만 충돌이 발생할 경우 해시 함수의 성능이 저하되므로, 충돌이 적은 경우에만 사용된다.

2. Chaining

Chaining은 충돌된 데이터를 같은 위치의 연결 리스트(Linked List)에 저장하는 기법이다.

충돌이 발생하고 해당 위치에 이미 데이터가 저장되어 있으면 연결 리스트에 데이터를 추가한다.

이러한 방법은 해시 함수의 성능에 영향을 미치지 않으며, 충돌이 많은 경우에도 사용할 수 있다.

 

좋은 해시 함수 선택 방법

  1. 좋은 해시 함수를 선택하기 위해서는 해시 함수의 충돌 가능성과 보안성을 고려해야 한다.
  2. 충돌 가능성이 높으면 검색 시간이 길어지므로, 충돌 가능성이 적은 함수를 선택해야 한다.
  3. 보안성이 중요한 경우에는 보안 해시 함수 또는 암호학적 해시 함수를 선택해야 한다. 

 

 

 

728x90
728x90

 

CLASS (CSS 선언자 .) ID (CSS 선언자 #)
여러 요소에 중복적으로 사용
한 페이지에 반복적으로 등장하는 요소에 쓰면 좋음 
한 요소에서만 사용
로고, 상단메뉴 등에 사용됨
#navigation {
    list-style-type: none;
    display: flex;
    justify-content: center;

}
.navbar li a {
    display: block;
    color: white;
    text-align: center;
    padding: 14px 35px;
    text-decoration: none;
  }

 

728x90
728x90

 

1. 새 파일을 생성후, 파일 이름을 (css 파일이름).css로 바꾼다.

 

나같은경우는 style이라는 파일이름을 썼다. 

파일 형식을 css로 지정해주면, style.css라는 파일이 생성된다.

 

 

2. 폴더를 생성해 css파일과 html 파일을 한 곳에 넣는다. 

 

 

3. HTML 파일의 <head> 섹터 안에 코드를 넣는다

<link rel="stylesheet" href="style.css">

 

이 코드를 복사해서 넣으면 된다. 

나는 css 파일의 이름이 style 이니까 style.css라고 해줬고, href 다음에는 자신의 css파일 이름을 넣으면 된다. 

 

728x90
728x90

 

랜딩페이지를 제작하기 위해서 HTML 구조를 잡다가 문득 Article 과 Section중 무엇을 선택해야 할까 의문이 들었다. 

 

두 태그 모두 HTML 5의 시맨틱 태그이다. <article> 과 <section> 태그는 출력에 변경 사항이 없기 때문에 서로를 대체할 수 있지만 구분하면 개발자와 브라우저가 해당 콘텐츠의 종류를 이해하기 쉽게 만들어준다. 

 

<article> 태그:

다른 컨텐츠가 필요하지 않은 독립적인 내용을 다른다. 

여러 <article> 태그를 메인 콘텐츠 안에 넣을 수 있지만, 각 기사는 독립적인 내용을 포함한다. 

예로 유튜브에서 한 페이지에 다른 종류의 비디오를 포함시키는것을 생각하면 된다. 

 

 

<section> 태그:

이 태그는 페이지를 소개, 연락처 정보, 세부 정보 등과 같은 세부적인 섹션으로 분할하는 데 사용된다. 

<section>은 다른 <section>태그 안에 포함될 수 있다.

일반 블록을 그룹화 하는 식. 

728x90
728x90

코드 단축 연습이 필요합니다. 

진짜 심각합니다 이거

진짜 내가 쓴 코드의 비효율성에 소름이 돋음... 숏코딩을 진지하게 연습해야할까 생각중

 

먼저 내 끔찍한 코드 공개:

 

t=int(input())
startend=[]

for _ in range(t):
  centre=[]
  startend = list(map(int, input().split()))
  n=int(input())
  cnt=0
  x1=startend[0]
  y1=startend[1]
  x2=startend[2]
  y2=startend[3]
  
  for k in range(n):
    line = []             
    line = list(map(int, input().split()))
    centre.append(line)
    r=centre[k][2]
    if(centre[k][0]-r<x1<centre[k][0]+r and centre[k][1]-r<y1<centre[k][1]+r):
      cnt+=1
    elif(centre[k][0]-r<x2<centre[k][0]+r and centre[k][1]-r<y2<centre[k][1]+r):
      cnt+=1
      
  print(cnt)

 

그리고 단축시킨 코드 공개. 

수학 상 원방에 나온 내용인데 아직 과외학생 진도가 여기까지 안나가서 존재를 까먹고 미처 쓸 생각을 못했다.

이건 프로그래머 지망생으로써 문제가 아니라 수학과외 선생으로써 자격이 있는지 심히 의심된다.

(까먹었던 내용을 과외학생과 같이 공부하는급ㅋㅋㅋ)

 

여튼 원방을 기억해내고 고치긴 했다.

 

t = int(input())
for i in range(t):
    cnt = 0
    x1, y1, x2, y2 = map(int, input().split())
    n = int(input())
    for i in range(n):
        cx, cy, cr = map(int, input().split())
        d1 = (((x1 - cx) ** 2) + ((y1 - cy) ** 2)) ** 0.5
        d2 = (((x2 - cx) ** 2) + ((y2 - cy) ** 2)) ** 0.5
        if (d1 < cr and d2 > cr) or (d1 > cr and d2 < cr):
            cnt += 1
    print(cnt)

 

728x90
728x90
t=int(input())
n=1
ans=[]
i=0
for i in range(t):
  a,b = map(int,input().split())
  x=b-a
  while(1):
    if(n*(n-1)<x<=n**2): 
      ans.append(2*n-1)
      break
  
    elif(n**2<x<=n*(n+1)):
      ans.append(2*n)
      break
      
    else:
      n+=1

for p in range(t):
  print(ans[p])

 

ㅋㅋ시간초과;

 

그래서 짠 두번째 코드 (간략화)

 

t=int(input())
i=0
for i in range(t):
  a,b = map(int,input().split())
  x=b-a
  n=0
  while True:
    if x <= n*(n+1):
      break
    n+=1

  if x <= n**2:
    print(2*n-1)

  else:
    print(2*n)​

 

 

중간지점을 찾으면 풀릴거라 생각했던 탄소 

 

 

시간제한이 2초라 ㅈ밥이라 생각했던 탄소

그리고 시간제한에 걸려버렸고ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

2초라 널널하게 짜도 될거라 생각해서 효율 버리고 편한대로 짰지만 생각보다 깐깐했던 백준

 

그래서 탄소는

 

"수학"을 하기로 한다.

 

 

사실 장난으로 노가다 컨셉 잡아본거였는데 의외로 돼서 놀랐음.

처음엔 저것들 간의 규칙을 방정식으로 나타내서 근의공식을 쓸까 생각했지만 그거보다 더 간단한게 있다는걸 깨달음.

그건 바로...

 

"수열"

 

 

킹갓수열.

 

 

그렇다. 이번 문제는 아예 100퍼센트 순수 수학이였던 것이다.

알고리즘따위 1도 필요없는 고등학교 2학년 이상이면 다 배운 '수열'.

 

요즘 과외애들 하는게 이차부등식이랑 수열 이런건데 너무 숙제로 내주고싶게 생김

진짜 존나 적당히 그 두 컨셉을 섞은 응용문제야... 너무 이뻐...

근데 애들은 존나 싫어할듯

내가 '허수아비' 드립만 쳐도 정색하던데ㅠ

 

여튼 대충 수열의 합공식 이용하니까 저런 규칙이 나와서

범위에 따라서 값이 바뀌니까 대충 부등식을 쓴 모습.

 

그리고 파이썬은 진짜 무적임 부등기호 두개를 한 식에 쓸 수 있다니 

이러다가 진짜 파이썬 중독돼서 '아마추어'그래머 될거같음

파이썬은 알고리즘 공부할때만 쓰는거로. 

 

라고 말하고 알고리즘 피해서 수학문제만 푸는 사람입니다. 

 

다음 골드는 꼭 알고리즘으로...

728x90

+ Recent posts