GET과 POST는 HTTP 프로토콜에서 서버와 클라이언트 간 통신에 활용되는 요청(Request) 메소드이다.

 

GET과 POST의 차이

  • GET은 URL의 뒤에 ?를 붙여 전달한다. 전송량에 제한이 있고, 사용자에게 데이터가 노출됩니다.
  • POST는 HTTP body에 포함하여 전달합니다. 전송량에 제한이 없고, 사용자에게 데이터가 보이지 않습니다. (암호화는 안됨)
  • 둘 다 암호화가 따로 없어서 보안에는 둘 다 취약하다.
  • 서버의 값이나 상태를 변경하는 경우에는 POST로, SQL 쿼리의 SELECT와 같은 단순 조회의 경우 GET을 사용

 

GET

  • GET 가져오는 , 서버로부터 정보를 요청하기 위해 사용
  • URL에 데이터를 포함시켜 요청한다. (기존의 URL 뒤에 ?를 붙여 구분)
  • 전송하는 길이에 제한이 있다. 
  • URL에 데이터가 노출되어 보안에 취약하다.
  • URL 형식에 맞지 않는 데이터는 인코딩(Encoding)이 반드시 필요하다.(한글이나 특수문자를 전송할 경우)
  • 캐싱할 수 있다.

→ 만약 웹 페이지 게시판 수정, 삭제 기능을 GET으로 구현한다면 캐싱으로 의도치않게 글이 수정, 삭제 될 수 있다. 때문에 주로 서버에 데이터를 요청(Select)할 때 사용

ex) 게시판 게시물 조회 

 

+ 캐싱(Caching)이란

캐싱이란 한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 레지스터에 데이터를 저장시켜 놓는 것입니다.

 

POST

  • POST 수행하는 ,  데이터 추가/수정하기 위해 사용
  • 데이터를 HTTP body에 담아 전달한다.
  • GET과 달리 URL에 데이터가 노출되지 않는다. BUT 암호화가 되지는 않음
  • 전송하는 길이에 제한이 없다.
  • 캐싱할 수 없다.

→ 주로 서버에 데이터를 전달하기 위해 사용

반응형

'cs지식 > CS' 카테고리의 다른 글

[CS] 쿠키(Cookie)와 세션(Session) 차이  (0) 2021.05.26

▶ 쿠키와 세션을 사용하는 이유

  • HTTP의 비연결성(Connectionless)과 비상태성(Stateless)을 보완하여 서버가 클라이언트를 식별하기 위해 사용합니다.
  • HTTP는 서버의 자원을 절약하기 위해 모든 사용자의 요청마다 연결과 해제의 과정을 거치기 때문에 연결 상태를 유지하지 않고(비연결성), 연결 해체 후에도 상태 정보를 저장하지 않습니다.(비상태성)  → 사용자를 식별할 수 없어 매번 새로운 사용자로 인식하게 됩니다. ex) 페이지를 이동할 때마다 로그인을 다시 해야 됨.

+ 비연결성(Connectionless) : 클라이언트가 요청(request) 한 후 응답(response)을 받으면 연결을 끊는다

+ 비상태성(Stateless) : 통신이 끝나면 상태를 유지하지 않는다.

 

 쿠키와 세션의 차이 -> 저장 위치, 보안, 속도

  • 가장 큰 차이점은 정보의 저장 위치입니다. 쿠키는 클라이언트에, 세션은 서버에 저장됩니다.
  • 보안면에서는 세션이 더 우수하며, 요청 속도는 쿠키가 세션보다 더 빠릅니다. 그 이유는 세션은 서버의 처리가 필요하기 때문입니다.
  • 쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 스니핑 당할 우려가 있어 보안에 취약하지만 세션은 쿠키를 이용하여 sessionid만 저장하고 그것으로 구분해서 서버에서 처리하기 때문에 비교적 보안성이 좋습니다.
  • 쿠키와 세션은 비슷한 역할을 하며 동작 원리도 비슷합니다. 그 이유는 세션도 쿠키를 사용하기 때문입니다.

+ 세션을 사용하면 좋은데 왜 쿠키를 사용하는가?

-> 세션은 서버의 자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당합니다. 때문에 자원관리 차원에서 쿠키와 세션을 적절히 사용하여 서버 자원의 낭비를 방지하고 속도를 높일 수 있습니다.

 

▶ 쿠키(Cookie)

쿠키란

  • 클라이언트(브라우저) 로컬에 저장되는 Key와 Value로 구성된 String형태의 작은 데이터 파일
  • 쿠키의 구성요소 : 이름, 값, 유효시간, 도메인, 경로
  • 세션 관리 : 로그인, 접속 시간, 장바구니 등 서버가 알아야 할 정보들을 저장
  • 개인화 : 사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있다.
  • 트래킹 : 사용자의 행동과 패턴을 분석하고 기록한다

 

쿠키 사용 예

-> 사용자 편의를 위한 것, 지워져도 되고, 가로채이더라도 큰 지장이 없는 수준의 정보

  • 쇼핑몰의 장바구니 기능
  • ID 저장, 자동 로그인
  • 자동 완성, 팝업창 일주일간 다시 보지 않기
  • 최근 검색한 상품들을 광고에서 추천

 

▶ 세션(Session)

세션이란

  • 세션은 쿠키를 기반으로 하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리합니다.
  • 각 클라이언트에게 고유 세션 ID를 부여한다.
  • 보안면에서 쿠키보다 우수하다. -> 사용자에 대한 정보를 서버에 두기 때문에
  • 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다
  • 동접자 수가 많은 웹 사이트의 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 됩니다.

 

세션 사용 예

-> 사용자나 다른 누군가에게 노출되면 안 되는 중요한 정보

  • 로그인 유지
  • 보안상 중요한 작업을 수행할 경우

 

  쿠키(Cookie) 세션(Session)
저장위치 클라이언트 서버
저장형식 text Object
리소스(사용하는 자원) 클라이언트의 리소스 서버의 리소스
용량제한 클라이언트에 300개 쿠키 저장 가능
하나의 도메인 당 20개,
하나의 쿠키 당 4KB
제한없음
만료시점 쿠키 저장 시 설정
(설정 없을 시에는 브라우저 종료시 만료)
브라우저 종료 시 삭제
속도 세션보다 빠름 쿠키보다 느림
보안 세션보다 안좋음 쿠키보다 좋은
반응형

'cs지식 > CS' 카테고리의 다른 글

[CS] GET과 POST 비교  (0) 2021.05.26

HTTP(HyperText Transfer Protocol)

  • 인터넷 상에서 클라이언트와 서버가 자원을 주고받을 때 쓰는 통신 규약(80 포트 사용)
  • 서버에서부터 브라우저로 전송되는 정보가 암호화 되지 않아 보안 이슈가 존재합니다.

 

HTTPS(HyperText Transfer Protocol Secure)

  • HTTP에 데이터 암호화 SSL이 추가된 통신규약(443 포트 사용)
  • 인터넷 상에서 정보를 암호화하는 SSL 프로토콜을 사용해 클라이언트와 서버가 자원을 주고받을 때 쓰는 통신 규약으로 텍스트를 암호화합니다. (공개키 암호화 방식으로)

 

+ 공개키(Public Key) 암호화

  • 자신이 가지고 있는 비밀키로만 복호화할 수 있는 공개키를 대중에게 공개함
  • 공개키와 개인키는 서로를 위한 1쌍의 키이다
  • 공개키 : 모두에게 공개 가능한 키
  • 개인키 : 나만 가지고 알고 있어야 하는 키
  • 전달할 메시지를 공개키로 암호화하여 이를 전송하면 개인키로 이를 복호화하여 메시지를 확인할 수 있다.

 

+ HTTPS 통신 흐름

  1. 애플리케이션 서버(A)를 만드는 기업은 HTTPS를 적용하기 위해 공개키와 개인키를 만든다.
  2. 신뢰할 수 있는 CA 기업을 선택하고, 그 기업에게 내 공개키 관리를 부탁하며 계약을 한다.
    • CA란? : Certificate Authority로, 공개키를 저장해주는 신뢰성이 검증된 민간기업
  3.  계약 완료된 CA 기업은 해당 기업의 이름, A서버 공개키, 공개키 암호화 방법을 담은 인증서를 만들고, 해당 인증서를 CA 기업의 개인키로 암호화해서 A서버에게 제공한다.
  4. A서버는 암호화된 인증서를 갖게 되었다. 이제 A서버는 A서버의 공개키로 암호화된 HTTPS 요청이 아닌 요청이 오면, 이 암호화된 인증서를 클라이언트에게 건네준다.
  5. 클라이언트는 main.html 파일을 달라고 A서버에 요청했다고 가정하자. HTTPS 요청이 아니기 때문에 CA기업이 A서버의 정보를 CA 기업의 개인키로 암호화한 인증서를 받게 된다.
    • CA 기업의 공개키는 브라우저가 이미 알고 있다. (세계적으로 신뢰할 수 있는 기업으로 등록되어 있기 때문에, 브라우저가 인증서를 탐색하여 해독이 가능한 것)
  6. 브라우저는 해독한 뒤 A서버의 공개키를 얻게 되었다. 이제 A서버와 통신할 대는 얻은 A서버의 공개키로 암호화해서 요청을 날리게 된다.

 

-> HTTPS 적용해보기

  1. AWS EC2에서 public dns 발급
  2. freenom이라는 무료 도메인 발급 사이트에서 도메인 발급
  3. AWS Route 53에서 EC2에서 발급받은 public dns와 발급받은 도메인 연결 (SSL 인증서를 발급받기 위해서는 도메인 이름을 소유하고 있어야 되기 때문에)
  4. Let's Encrypt라는 무료 SSL 인증서 발급 기관에서 인증서를 발급받아 서버에 적용
반응형

'cs지식 > Network' 카테고리의 다른 글

[Network] OSI 7계층 정리, 각 계층별 설명  (0) 2021.05.21

OSI(Open Systems Interconnection) 7 계층

  • 통신이 일어나는 과정을 7단계로 정의한 국제 통신 표준 규약이다.
  • 계급, 상하구조가 존재한다.  ex) 물리적 회선 연결이 있어야 데이터를 보내고 소프트웨어가 동작한다.
  • 각 계층은 독립되어있다. -> 용이성, 유지관리의 수월성
  • 암기 TIP : 모든 사람은 데이터 처리가 필요한 듯하다(All-People-Seem-To-Need-Data-Processing)
  1. 물리(Physical Layer) : 데이터를 전기적인 신호로 변환해서 주고받는 기능을 진행하는 공간. 장비로는 통신 케이블, 허브가 존재한다.
  2. 데이터 링크(Data Link Layer) : 물리계층으로 송/수신되는 정보 확인하고 오류 없는 통신을 위해 여러 역할을 수행한다. MAC 주소를 통해 통신함. 장비로는 브릿지와 스위치가 존재한다.
  3. 네트워크(Network) : 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능. 라우터를 통해 경로를 선택하여 IP주소를 지정하고 경로에 따라 패킷을 전달해준다. 장비로는 라우터가 존재한다.
  4. 전송(Transport) : 두 호스트 시스템으로부터 발생하는 데이터의 흐름을 제공한다. 
  5. 세션(Session) : 통신 시스템 사용자 간의 연결을 유지 및 설정한다.
  6. 표현(Presentation) : 세션 계층 간의 주고받는 인터페이스를 일관성 있게 제공한다.
  7. 응용(Application) : 사용자가 네트워크에 접근할 수 있도록 서비스를 제공한다.

ex) 미국에 있는 친구에게 편지를 보낸다

  • 응용(Layer 7) : 편지를 쓴다
  • 표현(Layer 6) : 한글로 작성한 편지를 미국 친구가 알아볼 수 있게 번역한다.
  • 세션(Layer 5) : 미국 친구의 집 주소를 기입한다.
  • 전송(Layer 4) : 우체국에 편지를 접수시키기 위한 절차, 즉 배 또는 비행기 등의 운송수단 결정
  • 네트워크(Layer 3) : 우체국에 있는 여러 편지들을 같은 목적지별로 분류한다.
  • 데이터링크(Layer 2) : 해당되는 목적지와 운송 방법에 따라 분류하며, 해당되는 목적지와 직접 연결이 되지 않는 경우 중간 경유지를 선택하여 분류하는 작업이다.
  • 물리계층(Layer 1) : 실제적으로 편지가 배, 비행기, 자동차 등의 운송수단에 의해서 운송되는 것을 의미한다.

 

ex) 이메일 전송을 한다 ( 참고자료 )

  • 응용(Layer 7) : 이메일 프로그램을 통해 이메일을 작성한다.
  • 표현(Layer 6) : 공통된 표현 형식으로 데이터를 변환하거나, 암호화, 압축을 수행한다.
  • 세션(Layer 5) : 데이터의 동기화를 위해 일정한 길이마다 sync를 삽입하여 전송 계층으로 데이터를 전달한다.
  • 전송(Layer 4) : 발신지와 목적지의 주소를 지정하고, 연결 방식, 흐름제어, 오류제어를 한다. 그리고, 데이터를 전송할 수 있는 세그먼트 단위로 나눈다.
  • 네트워크(Layer 3) : 발신지와 목적지의 주소가 아닌 라우팅에 필요한 논리 주소를 설정하고, 패킷에 대한 라우팅 정보를 삽입한다.
  • 데이터링크(Layer 2) : 프레인 단위로 데이터를 나눈다. 그리고 MAC 주소를 지정하고, 각 양 끝단의 속도차이에 대해 원활하게 해주기 위한 흐름제어를 한다. 또한 데이터의 오류를 막기 위해 CRC방법이나 체크썸 방식을 사용해 데이터를 받는 쪽에서 데이터의 오류를 검사할 수 있도록 설정한다.
  • 물리계층(Layer 1) : 전송 매체가 일반 케이블인지, 광 케이블인지 등의 설정을 한다. 그리고 전송 방식과 데이터를 회선으로 보내기 위한 전기적인 변환을 담당한다.

 


1. 물리계층(Physical Layer)

ex) 해리포터는 부엉이, 편지는 우편부, 통신에도 매체가 필요하다 -> 유선은 UTP, STP 케이블이나 광케이블, 무선은 공기

  • 데이터를 전기적인 신호로 변환해서 주고받는 기능을 진행하는 공간
  • 장비 : 통신 케이블, 리피터, 허브, 모뎀 등
  • 데이터 단위 : 데이터는 0과 1의 비트열, 즉 On, Off 전기적 신호 상태로 이루어진다.
  • 데이터를 전달하기만 한다. 어떤 에러가 있는지 등에는 전혀 관여하지 않는다.
  • 이진 데이터를 어떤 시그마로 만드느냐 -> 인코딩 기술
  • 신호를 주고받기 위한 전기적, 기계적, 기능적인 특성을 이용해 데이터를 전송
  • 대역폭과 전송효율이 중요

 

2. 데이터 링크 계층(Data Link Layer) 

  • 물리계층으로 송/수신되는 정보를 확인하고 오류 없는 통신을 위해 여러 역할을 수행한다.
  • MAC 주소를 통해 통신한다. 프레임에 Mac 주소를 부여하고 에러 검출, 재전송, 흐름 제어를 진행한다.
  • 장비 : 브릿지, 스위치
  • 데이터 단위 : 프레임(Frame)
  • 하드웨어와 소프트웨어 특성을 둘 다 가진다 (물리계층은 하드웨어적 특성을 가지고, 네트워크 계층부터는 소프트웨어적인 특성을 가진다. 연결다리 역할)

( + 심화 )

ex) 한국에서 미국IP로 전달해줘 -> 각 노드를 타고 메세지가 전달된다

  • 데이터 링크 계층은 직접 연결된 서로 다른 2개의 네트워킹 장치 간의 데이터 전송을 담당하는 계층
  • 이 계층에서 전송되는 데이터를 프레임(Frame)이라고 한다.
  • 이 계층에서 사용되는 다양한 프로토콜은 용도에 따라 프레임의 종류, 길이 등의 정보를 정의한다.
  • MAC(Media Access Control)이라고 하는 매체 접근 제어 기능
  • 48비트 길이의 주소를 가짐
  • 주요 역할 -> 오류 없는 통신을 위한 역할
    • 프레이밍(Framing) : 물리 계층을 통해 수신한 신호를 조합하여 프레임 단위의 정해진 크기의 데이터 유닛으로 만들어 처리
    • 흐름 제어(Flow Control) : 송신 측과 수신 측 간에 데이터를 주고받을 때, 너무 많거나 너무 적게 데이터를 송수신하지 않도록 데이터 흐름을 적절히 제어)
    • 오류 제어(Error Control) : 프레임 전송 시에 발생한 오류를 복원하거나 재전송
    • 접근 제어(Access Control) : 매체 상에 통신 주체가 여럿 존재할 때, 데이터 전송 여부를 결정
    • 동기화(Synchronization) : 프레임 구분자

 

(+ MAC 주소란 )

  • 컴퓨터 간 데이터를 전송하기 위해 있는 컴퓨터의 물리적 주소, 하드웨어 주소
  • 그 기계의 고유번호, 그 하드웨어만 가지고 있는 식별변호 (= 주민번호)
  • IP는 변할 수 있지만 MAC은 변하지 않는다
  • MAC 주소는 데이터링크 계층에 사용되고, IP주소는 네트워크 계층에서 사용된다

ex) '서울특별시 ~~~(IP)'에 사는 '00(MAC 주소)'에게 편지를 보내줘 // 00이 변하지 않은 이름이라 가정

 

3. 네트워크 계층 (Network Layer)

  • 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능(라우팅)을 담당한다.
  • 라우터를 통해 이동할 경로를 선택하여 IP주소를 지정하고, 해당 경로에 따라 패킷을 전달해준다. (= 패킷을 네트워크 간의 IP를 통하여 데이터를 전달한다)
  • 라우팅, 흐름제어, 오류제어, 세그먼테이션 등을 수행한다.
  • 장비 : 라우터
  • 데이터 단위 : 패킷(Packet)

 

4. 전송 계층(Transport Layer)

  • 두 호스트 시스템으로부터 발생하는 데이터의 흐름을 제공한다. 
  • TCP와 UDP 프로토콜을 통해 통신을 활성화한다. Port를 열어두고, 프로그램들이 전송할 수 있도록 제공해준다.
  • 데이터 단위 : 세그먼트(Segment)

+ TCP : 신뢰성, 연결지향적 / UCP : 비신뢰선, 비연결성, 실시간

5. 세션 계층(Session Layer)

  • 통신 시스템 사용자 간의 연결을 유지 및 설정한다.
  • 데이터가 통신하기 위한 논리적 연결을 담당한다. 세션을 만들고 없애는 책임을 지니고 있다.
  • API, Socket

 

6. 표현 계층(Presentation Layer)

  • 세션 계층 간의 주고받는 인터페이스를 일관성 있게 제공한다.
  • 데이터 표현에 대한 독립성을 제공하고, 암호화하는 역할을 담당한다.
  • 파일 인코딩, 명령어를 포장, 압축, 암호화 한다.
  • JPEG, MPEG 등

 

7. 응용 계층(Application Layer)

  • 사용자가 네트워크에 접근할 수 있도록 서비스를 제공한다.
  • 최종 목적지로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다.
  • 사용자 인터페이스, 전자우편, 데이터베이스 관리 등의 서비스를 제공한다.
  • HTTP(HyperText Transfer Protocol), SMTP(Simple Mail Transfer Protocol), FTP(File Transfer Protocol), DNS 등

 

반응형

'cs지식 > Network' 카테고리의 다른 글

[Network] HTTP / HTTPS 비교  (0) 2021.05.21

석계역 양고기 맛집으로 유명한 라무야끼

바 테이블 형식으로 2명씩 파티션이 구분되어 있어서 좋았어요👍

 

주소 : 서울 노원구 석계로3길 15-1

영업시간 : 매일 17:00-23:00 일요일 휴무

 

 

메뉴판은 아래와 같습니다

저희는 양갈비 스테이크 무한리필(25,000원)을 시켰어요

 

기본 세팅으로 나오는 소스가 다양해요

소금, 와사비, 쯔란, 파채, 양념간장

저는 이중에 양념간장이 가장 잘 어울렸어요 와사비도👍

 

접시가 비워질 때가 되면 사장님께서 먼저 와서 리필해드릴까 물어보십니다

그만 주셔도 된다니까 왜 더 안 먹냐고 더먹으라고 ㅋㅋㅋㅋ

 

양갈비와 잘 어울리는 하이볼👍

 

구이용으로 나오는 버섯 파 파인애플 토마토

저는 구운 파가 너무 맛있어서 여러 번 리필해서 먹었어요

 

영롱한 양갈비.... 츄륩....

고기도 부드럽고 잡내도 없고 너무 맛있었어요👍

 

고기만 먹다보니 조금 느끼해서 시킨 파채 해물라면(6,000)

역시 국물은 라면 국물....👍

 

반응형

# 약수의 합

def solution(n):
    answer = 0
    for i in range(1,n+1):
        if n%i == 0:
            answer+=i
    return answer

 

# 행렬의 덧셈

def solution(arr1, arr2):
    answer = [[] for i in range(len(arr1))]
    for i in range(len(arr1)):
        for j in range(len(arr1[i])):
            answer[i].append(arr1[i][j]+arr2[i][j])
    return answer

 

반응형

# 소수 찾기

  • 시간초과 1) 그냥 풀기 -> 테케 정확도 10,11,12 / 효율성 1,2,3,4 탈
def solution(n):
    answer = 0
    for num in range(2,n+1):
        count = 0
        for i in range(2,num):
            if num%i == 0:
                count+=1
        if count == 0:
            answer+=1
                
    return answer

  • 시간초과 2) 제곱근 사용하기 -> 테케 정확도 11 / 효율성 1,2,3,4 탈
    • 'N의 약수는 무조건 sqrt(N) 범위에 존재한다' 를 적용
def solution(n):
    answer = 0
    for num in range(2,n+1):
        count = 0
        for i in range(2,int(num**(0.5))+1):
            if num%i == 0:
                count+=1
        if count == 0:
            answer+=1
                
    return answer

  • 성공 ) 에라토스테네스의 체 사용
    • 소수(x)의 배수는 약수로 무조건 x를 포함하게 된다.
      따라서 절대 소수의 배수는 소수가 될 수 없다. 이를 이용한 것이 에라토스테네스의 체이다.
      누구나 알고있는 가장 작은 소수인 2부터 시작해서, 2의 배수를 다 지웠으면, 지워지지 않은 수 중에서 다음 값인 3의 배수를 지워나가고 이를 계속해서 반복해 나가면 소수만 남게된다.
      마치 체에 걸러서 남는 것들만 뽑아내는 방식이라고 생각하면 된다.
def solution(n):
    answer = 0
    n += 1                            # for문 사용을 위한 n += 1
    prime = [True] * n                # n개의 [True]가 있는 리스트 생성
    for i in range(2, int(n**0.5)+1): # n의 제곱근까지만 검사
        if prime[i]:                    # prime[i]가 True일때
            for j in range(2*i, n, i):    # prime 내 i의 배수들을 False로 변환
                prime[j] = False

    for i in range(n):              # 소수 카운팅
        if i > 1 and prime[i] == True:  
            answer+=1
                
    return answer

 

+ (GOOD) 풀이 set을 사용한 에라토스테네스의 체

  • 2~n까지의 수를 함수 num에 담기
  • 2~int(n**0.5)+1까지의 수 i 에 대해, i 가 num 안에 있으면, i의 배수set(i의 2배수 부터 n까지수 중 i 만큼 간격있는 수들)를 num에서 빼주기
  • 나머지 num의 길이 리턴
def solution(n):
    num=set(range(2,n+1))
    
    for i in range(2,int(n**0.5)+1):
        if i in num:
            num-=set(range(2*i,n+1,i))
            
    return len(num)

 

 

# 서울에서 김서방 찾기

def solution(seoul):
    return '김서방은 ' + str(seoul.index('Kim')) + "에 있다"

 

# 이상한 문자 만들기

  • 공백 처리에 주의할 것 
def solution(s):
    answer = ''
    count = 0
    for a in s:
        if a==" ":
            answer+=" "
            count=0
        else:
            count+=1
            if count%2==0:
                answer+= a.lower()
            else:
                answer+= a.upper()

    return answer

 

# 정수 제곱근 판별

def solution(n):
    answer = 0
    j = n**(1/2)
    if j == int(j):
        answer = (j+1)**2
    else:
        answer = -1
    return answer

 

반응형

프로그래머스 2019 카카오 개발자 겨울 인턴십

# 크레인 인형뽑기 게임

[ 문제 설명 ]

게임개발자인 "죠르디"는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
"죠르디"는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.

게임 화면은 "1 x 1" 크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형 두 개가 없어집니다.

크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

[ 제한사항 ]

  • board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
    • 0은 빈 칸을 나타냅니다.
    • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

[ 입출력 예 ]


내 풀이

  1. 딕셔너리를 사용해서 크레인 번호 별로 board 배열 재구성
    • 0이 아닌 값만 저장
  2. 크레인 위치(moves) 순서대로 바구니에 쌓기
    • new_board 에 값이 있다면 바구니에 넣고 new_board에서 값 제거
  3. 터진 후 바구니 구하기
    • 바구니에 아무것도 없다면 pang에 넣어주고
    • 있다면 pang의 마지막 원소와 바구니 원소를 비교하여 같지 않다면 pang에 추가
    • 같다면 pang에 넣은 원소 삭제
  4. 터트린 인형 갯수 세기(result)
    • 바구니에 쌓은 원소 개수 - 터진 후 바구니 원소 개수

※ 실패1) 테케 1 실패

-> 인형 터트린 후 결과 구할 때, 맨 앞 원소가 다 터져 원소가 남아있지 않은 경우를 고려하지 않고 pang의 마지막 원소를 가져와 비교하도록 했다  ex) basket = [1,1,2,3,5,4] 일 경우 

-> pang의 길이를 확인하고 0이면 그냥 더해주도록 수정

 

내 코드

from collections import defaultdict

def solution(board, moves):
    answer = 0
    
    # board 배열 재구성
    new_board = defaultdict(list)
    for i in board:
        for key, value in enumerate(i):
            if value !=0:
                new_board[key+1].append(value)
    # print(new_board)
    
    # moves 순서대로 바구니에 쌓기
    basket = []
    for i in moves:
        if len(new_board[i]) != 0:
            basket.append(new_board[i][0])
            new_board[i].pop(0)
    # print(basket)
    
    # 인형 터트린 후 결과
    pang = []
    for i in range(len(basket)):
        if len(pang)==0:
            pang.append(basket[i])
        else:
            if pang[-1] != basket[i]:
                pang.append(basket[i])
            elif pang[-1] == basket[i]:
                pang.pop(-1)
                
    # 터트린 인형의 갯수
    answer = len(basket) - len(pang)
    # print(pang)
    
    return answer

 

 

+ 다른 풀이

def solution(board, moves):
    stacklist = []
    answer = 0

    for i in moves:
        for j in range(len(board)):
            if board[j][i-1] != 0:
                stacklist.append(board[j][i-1])
                board[j][i-1] = 0

                if len(stacklist) > 1:
                    if stacklist[-1] == stacklist[-2]:
                        stacklist.pop(-1)
                        stacklist.pop(-1)
                        answer += 2     
                break

    return answer
반응형

+ Recent posts