728x90

팀프로젝트 경험이 없어 용기내어 해보자 !! 싶어 열심히 찾아봤지만 .. 다들 먼 곳에서 인원을 모집하거나 이미 다 진행하고 있는 사람들 뿐이어서 땀만 삐질삐질 흘리다가 결심했다.

 

까짓거 !! 내가 모아보겠다 !!!

 

패기롭게 시작했지만 .. 허전한 오픈 톡방..ㅋ

그러다 한 두분씩 들어오기 시작했다. 현재 나 포함 세명이 있다 허허헣.

국비 학원 수강중이신 분들이신것 같은데 거의 끝물이라 팀프로젝트를 진행해보고자 들어오신것같다.

다행히 스프링으로 공부중이셔서 얘기 하다보니 프로젝트를 진행해보기로 결정됐다.

막상 한다고 생각하니 머릿속이 백지상태.. 오또카지..오또카지..

뭐를 준비해야하지 ..?

내가 과연 수준을 따라 갈 수 있을까 ..?

협업 툴은 뭘 쓰는거지 ..? 오또케 해야하는거지 ..?

 

며칠째 식은땀을 쏟아내고 있지만 톡방에서는 애써 쿨하게 18일부터 하는걸로 결정 ..!

 

그래도 하다보면 길이 보이고 답이 나오지 않을까 하는 마음 (너무 민폐인가 ?)

일단 JONNA GOAHEAD 하자 !!

728x90
728x90

1장의 내용을 요약하면 아래의 내용을 배운다.

  • 인텔리제이를 설치하고 프로젝트를 생성하는 법
  • 그레이들 프로젝트를 스프링 부트 프로젝트를 변경하는 법
  • 인텔리제이에서 깃과 깃허브를 사용하는 법

 

자바 웹 개발에 있어서 대표적인 개발 도구로 이클립스가 있다. 하지만 책에서는 인텔리제이의 다음과 같은 강점을 이유로 인텔리제이를 사용한다.

  • 강력한 추천 기능(Smart Completion)
  • 훨씬 더 다양한 리팩토링과 디버깅 기능
  • 이클립스의 깃(Git)에 비해 훨씬 높은 자유도
  • 프로젝트 시작할 때 인덱싱을 하여 파일을 비롯한 자원들에 대한 빠른 검색 속도
  • HTML과 CSS, JS, XML에 대한 강력한 기능 지원
  • 자바, 스프링 부트 버전업에 맞춘 빠른 업데이트

인텔리제이는 유료버전(얼티메이트)와 무료버전(커뮤니티) 두 가지가 있다.

무료 버전을 사용해도 스프링 부트를 개발하는 데는 큰 어려움이 없기 때문에 무료 버전을 사용해도 무방하다고 한다.

나는 학생계정으로 유료버전을 무료로 사용할 수 있어 이미 설치해 사용하고 있는 상황이기 때문에 이미 설치되어 있는 버전을 사용하려고 한다. 떄문에 인텔리제이의 설치에 관한 부분은 읽어보기만 하고 넘어갔다.

 

인텔리제이를 직접 내려받지 않고 젯브레인 툴박스를 사용하면 젯브레인의 제품 전체를 관리하기도 용이하고, 여러 제품군의 버전 관리와 JVM 옵션 등을 쉽게 조정 할 수 있다고 한다.

 

인텔리제이는 이클립스와 다른 점이 있는데, 이클립스의 워크스페이스와 같은 개념이 인텔리제이에는 없고 프로젝트와 모듈의 개념만 있다. 그렇기 때문에 인텔리제이는 여러 프로젝트를 한 번에 불러 올 수 없고 한 화면에 하나의 프로젝트만 열 수 있다.

 

그레이들(Gradel)을 사용하기 위해 프로젝트 유형을 그레이들로 선택한 뒤 프로젝트명이나 설치 위치 등을 설정한 후 생성한다. 그레이들 기반의 자바 프로젝트가 생성 되면 스프링 부트 프로젝트로 변경하기 위해 build.gradel 파일을 열면 자바 개발에 가장 기초적인 설정만 되어있다. 따라서 스프링 부트에 필요한 설정을 위한 코드들을 수정 및 추가 해주어야한다.

 

의존성 추가 등을 스스로 이해하고 할 줄 아는 단계에 이르면 스프링 이니셜라이져(http://start.spring.io/)를 통해 진행하면 편리한 듯 하다.

 

현재 이 책을 공부하는 시점은 책이 만들어질 당시보다 많은 버전업이 있었는지 책의 내용대로 진행하면 더 이상 사용하지 않는 라이브러리나 코드 작성법으로 인한 오류들이 일어나서 개인적으로 방법을 찾아보다 필자의 개인 블로그에 최신 버전 까지는 아니여도 어느정도 바뀐 부분에 대한 추가적인 내용들을 포스팅 해놓은 것을 알게되었다.

아래는 build.gradle 파일 내 코드 수정에 관한 포스팅 주소이다. 혹여 나처럼 1장부터 막혀버려 식은땀을 흘리며 손을 벌벌 떨고 있을 사람이 있을 것 같아 올려보았다.

 

 

(2020.12.16) 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 최신 코드로 변경하기

작년 11월 말에 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 출판 하였습니다. Spring Boot가 2.1 -> 2.4로, IntelliJ IDEA가 2019 -> 2020으로 오면서 너무 많은 변화가 있다보니, 집필할 때와 비교해 실습

jojoldu.tistory.com

 

포스팅 내용대로 진행해도 막히는 부분은 스스로 찾아봅시다.. 저도 그랬기에..ㅠㅠ

 

코드 수정을 마치면 인텔리제이에서 깃과 깃허브를 사용하는 법을 알려준다.

대부분의 IT 서비스 회사는 깃(Git)을 통해 버전 관리를 하고 있기 때문에 알고 있어야한다.

깃허브에 연동하기 위해서는 우선적으로 깃허브 계정이 필요하다. 계정이 있다면 소스트리를 이용하거나 깃 명령어를 통해 연동해도 무방하지만 책에서는 인텔리제이를 통해서 연동을 한다.

 

.idea 디렉토리(인텔리제이에서 프로젝트 실행시 자동으로 생성되는 파일들)는 커밋하지 않도록 설정한다.

깃에서 특정 파일이나 디렉토리를 관리 대상에서 제외할 때는 .gitignore 파일을 사용한다. 해당 파일 내에 기입된 내용들은 모두 관리하지 않겠다는 것을 의미한다.

 

인텔리제이에서는 이 파일에 대한 기본지원이 없어 플러그인을 사용한다.

.ignore 플러그인에서 지원하는 기능들
- 파일 위치 자동완성
- 이그노어 처리 여부 확인
- 다양한 이그노어 파일 지원

< 인텔리제이를 재부팅해야지만 플러그인이 적용됨 ! >

 

인텔리제이에서 자동으로 생성되는 파일들을 이그노어 처리하기 위해 다음과 같이 코드를 추가한다.

.gradle
.idea

추가한 코드를 커밋 및 푸시하여 깃허브에도 반영하면 해당 프로젝트에 성공적으로 반영되어 있는것이 확인 가능하다.

 

이렇게 1장에서는 인텔리제이로 스프링 부트 프로젝트를 개발하고, 깃허브도 연동한 환경을 구축하는 법을 배웠다.

항상 새로운것을 시작하려할때 환경설정에서 진땀을 흘리곤했다. 이번에도 많이 허둥지둥했지만 스스로 이해하면서 진행해보니 조오오금 더 머릿속에 남은것 같다. 이제 본격적으로 개발을 시작할텐데 마치 영화관에서 영화가 시작되기를 기다리는듯한 설레임을 느낀다. 책을 따라하면서 아니 공부하면서 많은 어려움이 있겠지만 지금의 설레임을 생각하며 끝까지 도전해보자 !!

 

 

 

728x90
728x90

온라인 강좌를 통해서 스프링부트를 이용한 웹 사이트 구현을 해봤지만, 그저 수박 겉핥기 식의 받아적기 수준으로만 학습을 한건지 머리에 별로 남지도 않고 아무 도움없이 혼자 다시 구현해보자니 아무코토 못하는 나의 모습에 막말로 역겨움이 느껴졌다 .. ㅠㅠ

 

그리하여 여러 강좌도 찾아보고 서적을 둘러보다 유명한 책을 발견했다 ! 스프링부트, JPA, 스프링 시큐리티 등을 활용하여 프로젝트를 진행하고 무중단 배포까지 빠르고 쉽게 웹 서비스의 모든 과정을 배울 수 있는 책이다. 실제로 삼땡전자에 다니고 있는 존경하는 내 친구도 얘기만 해도 바로 알 정도였다.

그 책은 바로 [스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱] 이다. 기대기대 !!

 

스프링 부트를 처음 하는건 아니지만 처음 배운다는 마음가짐으로, 대신 이번엔 머릿속에 남아 혼자서도 구현할 수 있을 정도로 꼼꼼하고 깊게 공부해보려고 한다.

 

자 드가자 ~!~!

728x90
728x90

인텔리제이를 사용하면서 알게 된 단축키를 지속적으로 정리 하는 글 입니다 !

단축키 기능 윈도우
자동 완성 Ctrl + Space Ctrl + Space
Action 검색창 열기 Ctrl + Shift + A Command + Shift + A
생성 목록 열기 프로젝트 클릭 후 Alt + Insert 프로젝트 클릭 후 Command + N
깃 커밋 창 열기 Ctrl + K Command + K
깃 푸시 Ctrl + Shift + K Command + Shift + K
패키지 가져오기(Import) Alt + Enter Option + Enter

 

728x90
728x90

CI/CD는 어플리케이션 개발 단계를 자동화하여 보다 짧은 주기로 고객에게 제공하는 방법이라고 한다.

기본 개념은 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포이다.

새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제(인테그레이션 헬[Intergration hell] 이라고 함)를 해결하기 위한 솔루션이다.

 

CI란 ?

CI는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Intergration)을 의미한다.

CI를 성공적으로 구현하면 어플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트 되어 공유 리포지토리에 통합되므로 여러명의 개발자가 동시에 개발과 관련된 코드 작업을 할 경우 서로 충돌 하는 문제를 해결 할 수 있다.

 

CD란?

CD는 두 가지 뜻이 있다. 하나는 지속적인 서비스 제공(Continuos Delivery)가 있고 지속적인 배포(Continuos Deployment)가 있다.

두 가지 의미 모두파이프라인의 추가 단계에 대한 자동화를 뜻하지만 얼마나 많은 자동화가 이루어지고 있는지를 설명하기 위해 별도로 사용되기도 한다.

  • Continuos Delivery(지속적인 서비스 제공)

개발자들이 어플리케이션에 적용한 변경 사항이 버그 테스트를 거쳐 리포지토리에 자동으로 업로드 되는 것을 뜻한다.

이것은 개발팀과 비지니스팀 간의 가시성과 커뮤니케이션 부족 문제를 해결해 준다.

지속적인 제공은 최소한의 노력으로 새로운 코드를 배포하는 것을 목표로 한다.

  • Continous Deployment(지속적인 배포)

개발자의 변경사항을 리포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리즈 하는 것을 의미한다.

이것은 어플리케이션 제공 속도를 저해하는 수동 프로세스로 인한 운영팀의 프로세스 과부하 문제를 해결해 준다.

지속적인 배포는 파이프라인 단계를 자동화 함으로써 지속적인 제공이 가진 장점을 활용한다.

 

출처(https://www.redhat.com/ko/topics/devops/what-is-ci-cd)


정보처리기사 공부를 할 당시에 보았던 개념들이 CI/CD를 조금이나마 이해하는데 도움이 된것 같다.

최근 시작한 스프링부트 공부 서적을 보다 잘 알지 못하는 단어가 보여 검색해보았다.

아직 실무 경험이 없기에 배포까지의 과정을 경험해보지 못한 터라 좀 더 명확하게 머릿속에 그려지진 않지만

핵심은 자동화를 통한 생산성 향상이라고 생각이 든다.

 

언젠간 이러한 용어들을 지겨워하고 밥먹듯이 뱉는 그런 개발자가 되는날까지.. JONNA GOAHEAD 하자 !

728x90
728x90
프로그래머스 코딩테스트 연습
오픈채팅방
2019 카카오 블라인드 채용 문제

링크

https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건

카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.

신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.

"[닉네임]님이 들어왔습니다."

채팅방에서 누군가 나가면 다음 메시지가 출력된다.

"[닉네임]님이 나갔습니다."

채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.

  • 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
  • 채팅방에서 닉네임을 변경한다.

닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다.

예를 들어, 채팅방에 "Muzi"와 "Prodo"라는 닉네임을 사용하는 사람이 순서대로 들어오면 채팅방에는 다음과 같이 메시지가 출력된다.

"Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."

채팅방에 있던 사람이 나가면 채팅방에는 다음과 같이 메시지가 남는다.

"Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Muzi님이 나갔습니다."

Muzi가 나간후 다시 들어올 때, Prodo 라는 닉네임으로 들어올 경우 기존에 채팅방에 남아있던 Muzi도 Prodo로 다음과 같이 변경된다.

"Prodo님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

채팅방은 중복 닉네임을 허용하기 때문에, 현재 채팅방에는 Prodo라는 닉네임을 사용하는 사람이 두 명이 있다. 이제, 채팅방에 두 번째로 들어왔던 Prodo가 Ryan으로 닉네임을 변경하면 채팅방 메시지는 다음과 같이 변경된다.

"Prodo님이 들어왔습니다."
"Ryan님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.

제한사항

  • record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
  • 다음은 record에 담긴 문자열에 대한 설명이다.
    • 모든 유저는 [유저 아이디]로 구분한다.
    • [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
    • [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
    • [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
    • 첫 단어는 Enter, Leave, Change 중 하나이다.
    • 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
    • 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
    • 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
    • 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.

위 내용은 본문을 복사 하였습니다.

입력
출력

입출력 예

record result
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

입출력 예 설명

입출력 예 #1
문제의 설명과 같다.

위 내용은 본문을 복사 하였습니다.

예상분석

해쉬맵을 사용하여  uid를 키로, 닉네임을 밸류로 저장하고 recode에 각 문장을 Enter, Leave, Change를 식별해서 각자 해당하는 명령을 uid를 조회해서 닉네임을 불러오는 식으로 진행한다.

닉네임을 불러와 해당 명령에 맞는 문장을 만들어 배열에 저장하여 한번에 출력한다.

코드
import java.util.*;

class Solution {
    public ArrayList<String> solution(String[] record) {
        ArrayList<String> answer = new ArrayList<>();

        HashMap<String,String> nickname = new HashMap<>();

        for (String command : record) {
            String[] s_command = command.split(" ");
            switch (s_command[0]) {
                case "Enter":
                    nickname.put(s_command[1],s_command[2]);
                    break;
                case "Change":
                    nickname.replace(s_command[1],s_command[2]);
                    break;
            }
        }

        for (String command : record) {
            String[] s_command = command.split(" ");
            switch (s_command[0]) {
                case "Enter":
                    Enter(s_command[1], nickname, answer);
                    break;
                case "Leave":
                    Leave(s_command[1], nickname, answer);
                    break;
            }
        }

        return answer;
    }

    private void Leave(String key, HashMap<String, String> nickname, ArrayList<String> answer) {
        answer.add(nickname.get(key)+"님이 나갔습니다.");
    }

    private void Enter(String key, HashMap<String, String> nickname, ArrayList<String> answer) {
        answer.add(nickname.get(key)+"님이 들어왔습니다.");
    }
}

한 번의 반복문으로 출력 할 문장에 닉네임을 유동적으로 수정이 되면 출력할때도 바뀌게끔 해보고 싶었으나, 방법을 찾지 못해 일단은 최종적인 닉네임을 저장 한 뒤에 한 번 더 반복문을 이용해 출력할 문장을 만들게 했다.

큐를 사용하여 진행해볼까 했지만 결국 한 번 더 반복하는 것은 똑같지않나 라는 생각이 든다.

생산적인 코드를 짜는게 왜이리 어려운지..ㅠㅠ 코드를 짜면서 자꾸 나와의 타협을 하는 것 같아 기분이 좋지 않다.

좀 더 많이 마아아않이 성장 하자 !!

728x90
728x90
프로그래머스 코딩테스트 연습
K번째 수

링크

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

위 내용은 본문을 복사 하였습니다.

입력
출력

입출력 예

array commands return
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

예상분석

Arrays.copyOfRange 메소드를 이용하여 i부터 j까지 배열을 자른 후 오름차순으로 정렬한다(sort).

k번째에 해당하는 인덱스값을 찾아 return할 배열에 차례로 저장한다.

코드
import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        ArrayList<Integer> list = new ArrayList<>();

        for (int a = 0; a < commands.length; a++) {
            int[] n_arr = Arrays.copyOfRange(array,commands[a][0]-1,commands[a][1]);
            Arrays.sort(n_arr);
            list.add(n_arr[commands[a][2]-1]);
        }

        return list.stream()
                .mapToInt(Integer::intValue)
                .toArray();
    }
}

*주의할 점*

배열의 범위 때문에 생각보다 오류가 많이 났다. 범위 생각하다보면 머리에 쥐가 날것같다..ㅋㅋ

코드 하나마다 어느부분에서 오류가 났는지 디버깅해보고 해결했다 ㅠㅠ

 

ArrayList를 Array로 변환하기 위해 stream도 사용해 보았다. 이러한 방법 혹은 패턴들이 머릿속에 남아서 구글링을 하지 않아도 할 수 있어야할텐데 꾸준히 해서 머리에 남도록 열심히 해야겠다.

728x90
728x90
프로그래머스 코딩테스트 연습
부족한 금액 계산하기
위클리 챌린지 문제

링크

https://school.programmers.co.kr/learn/courses/30/lessons/82612

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항
  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

위 내용은 본문을 복사 하였습니다.

입력
출력

입출력 예

price money count result
3 20 4 10

입출력 예 설명

입출력 예 #1
이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.

위 내용은 본문을 복사 하였습니다.

예상분석

price와 count를 통해 total_price를 구한다. (total_price는 price*1 부터 price*count 까지의 합으로 구함)

total_price가 money보다 많은지 적은지를 비교하여 많을때는 부족한 금액을 result(answer)에 저장

money보다 적을때는 result(answer)에 0을 저장

코드
class Solution {
    public long solution(int price, int money, int count) {
        long answer = -1;
        long total_price = 0;

        for (int i = 1; i <= count; i++) {
            total_price += price*i;
        }

        if (total_price <= money) {
            answer = 0;
        } else {
            answer = total_price - money;
        }

        return answer;
    }
}

*주의할 점*

대부분의 테스트케이스는 통과를 했지만 일부 케이스들이 통과가 안되어 찾아보니

total_price를 구하는 과정에서 int의 곱을 반복하는 경우 int의 범위를 벗어나는 경우가 존재하기때문에

long형으로 값을 구해줘야한다 !! 덕분에 잠시 고생했다 ㅋㅋㅋ

728x90

+ Recent posts