정수 내림차순으로 배치하기

문제 설명

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

 

제한 사항

n은 1이상 8000000000 이하인 자연수입니다.

 

문제 풀이

Arrays.sort() 사용하면 되겠다~😎

근데 얘는 오름차순으로 배열하는 메서드이니까 for문을 사용해서 다시 배열 해주자.

1. 문자열로 전환하기 String.valueOf() 메서드 사용

2. split() 메서드 사용해서 나눈 값으로 배열 만들기

3. Arrays.sort() 사용해서 오름차순으로 배열하기

4. for문을 사용해서 내림차순으로 배열하기

5. long 타입으로 변환해서 answer에 저장하기

 

import java.util.Arrays;

public class descendingOrder {

        public long solution(long n) {
            long answer = 0;
            String str = String.valueOf(n);         //String 타입 변환
            String[] nums = str.split("");          //String 배열 만들기
            Arrays.sort(nums); //[1,1,2,3,7,8]      //오름차순으로 정렬하기
            long[] num = new long[nums.length];
            for(int i=0; i<nums.length; i++){       //내림차순으로 정렬하기
                num[i]= Long.parseLong(nums[nums.length-1-i]);
            }

            String almostanswer = "";     //거의 다왔어요! String으로 만들었다가
            for(int i=0; i<num.length;i++){
                almostanswer += num[i];
            }
            answer = Long.parseLong(almostanswer); //Long 타입으로 변환하기!
            return answer;
        }


    public static void main(String[] args) {
        descendingOrder method = new descendingOrder();
        System.out.println(method.solution(118372));
    }
}

 

 

자연수 뒤집어 배열로 만들기

문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

 

제한 사항

n은 10,000,000,000이하인 자연수입니다.

 

문제 풀이

1. 문자열로 변환 String.valueOf.

2. split() 메서드 사용해서 나눈 값으로 배열 만들기

2. for문 이용해서 새로운 배열 만들어주기

import java.util.Arrays;

public class backwardNumbers {
        public int[] solution(long n) {

            String s = String.valueOf(n);
            String[] arr = s.split("");

            int[] answer = new int[arr.length];
            for(int i=0; i<arr.length; i++){
                answer[i] =Integer.parseInt(arr[arr.length-1-i]);
            }


            return answer;
        }

    public static void main(String[] args) {
        backwardNumbers method = new backwardNumbers();
        System.out.println(Arrays.toString(method.solution(12345)));

    }
}

answer를 저대로 프로그래머스에 입력하면 알아서 전환을 해줘서 배열이 출력되지만 

IntelliJ에서는 Arrays.toString(answer) 사용해서 출력해야합니다.

 

자릿수 더하기

문제설명

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

 

제한사항

N의 범위 : 100,000,000 이하의 자연수

 

 

문제 풀이

1. integer를 string으로 변환

2. string 문자열을 배열로 변환

3. 배열을 integer로 변환해서 더해주기

public class addNumbers {
    public int solution(int n) {
        int answer = 0;
        String num = String.valueOf(n);
        String[] add = num.split("");
        for(int i=0; i<add.length; i++){
            answer += Integer.parseInt(add[i]);
        }
        return answer;
    }

    public static void main(String[] args) {
        addNumbers method = new addNumbers();
        System.out.println(method.solution(123));
    }
}

 

문제설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

 

제한 사항

문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

문제 풀이

1. String s를 각 문자로 나눠서 배열에 저장한다.

2. 각 인덱스 값을 매길 변수 int index =0; ->홀수 짝수를 나타내기 위해

3. 공백이 생길 때마다 index 값을 초기화 한다.

4. 홀수이면 toLowerCase() 사용, 짝수이면 toUpperCase() 사용한다.

5. 변환한 글자를 answer에 저장한다.

public class weirdo {

    public String solution(String s) {
        String answer = "";

        String[] word = s.split(""); //s를 한글잘씩 잘라 word 배열에 담습니다.
        int index = 0;         //홀수, 짝수를 나타나기 위한 index 변수입니다.
        int length = word.length; //word 배열의 길이

        for (int i = 0; i < length; i++) {
            if (word[i].equals(" ")){
                word[i] = " ";
                index = 0;      //공백이후 index 값 초기화 ==0이 된다.
            }else {
                if (index % 2 != 0) {
                    word[i] = word[i].toLowerCase();
                    index++;
                } else if (index % 2 == 0) {
                    word[i] = word[i].toUpperCase();
                    index++;
                }
            }
            answer = answer + word[i];
        }
        return answer;
    }




    public static void main(String[] args) {
        weirdo method = new weirdo();
        System.out.println(method.solution("I love a pizza"));
    }
}

 

출력값

I LoVe A PiZzA

 

피자를 사랑합니다🍕🍕😘

문제1.

기원이는 오늘 항해99를 시작했다. 성격이 급한 기원이는 항해 1일 차부터 언제 수료를 하게될 지 궁금하다. 항해 1일 차 날짜를 입력하면 98일 이후 항해를 수료하게 되는 날짜를 계산해주는 알고리즘을 만들어보자.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public String solution(int month, int day) {
        String answer = "";
        LocalDate date = LocalDate.of(2022, month, day);
        LocalDate newDate = date.plusDays(98);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M월 dd일");
        answer = dateTimeFormatter.format(newDate);
        
        return answer;
    }

    public static void main(String[] args) {
        Main method = new Main();
        System.out.println(method.solution(1, 18));
    }

java.time.LocalDate 와 

java.time.format.DateTimeFormatter 를 import하면 쉽게 풀 수 있는 문제였습니다.

 

.plusDay() 메소드를 이용하여 날짜를 더합니다.

 

DateTimeFormatter.ofPattern()을 사용해서 "M월 dd일" 형식으로 출력합니다.

 

 

문제2.

지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다. 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.
체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
체크아웃을 할 때 익일 시간은 24+a 로 계산한다.
즉 새벽 2시는 24+2 인 26으로 표기한다.
체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다.
따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.
public class Main {
    public int solution(int[] arr1, int[] arr2) {
        int answer = 0;
        for(int i=0; i<arr2.length; i++){
            if( arr2[i]>=29){
                answer += 21-arr1[i];
            }else {
                answer += arr2[i] -arr1[i];
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        Main method = new Main();
        int[] arr1 = {9, 9, 9, 9, 7, 9, 8};
        int[] arr2 = {23, 23, 30, 28, 30, 23, 23};
        System.out.println(method.solution(arr1, arr2));
    }
}

 

문제3.

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.

소수 찾기가 어렵습니다... 매니저님 오시면 여쭤봐야겠음..

여쭤봤습니다...

 

import java.util.concurrent.LinkedTransferQueue;

public class primeNumbers {

    public String solution(String s) {
        String answer = "";
        //1은 소수가 아니다
        //2를 제외한 짝수도 소수가 아니다.
        //제곱근(sqrt) 범위 나누기법이란?
        //소수 여부를 검사할 수에 대해서 그 값의 제곱근을 기준으로 그 곱은 대칭적으로 곱이 일어나므로 
        //제곱근 이하의 작은 값까지만 검사를 하면 나머지는 검사를 할 필요가 없다는 방법으로 검사할 데이터를 제곱근 개 이하로 줄 일 수 있는 방법

        //소수 중 최대값
        //소수가 아닌 수 중 최소값 

        int primeMax = 0;
        int nonPrimeMin = Integer.MAX_VALUE;

        String[] numbers = s.split(" "); //

        for (String number : numbers) {
            int num = Integer.parseInt(number);
            if (numbercheck(num)) {
                if (num > primeMax) {
                    primeMax = num;
                }
            } else {
                if (num < nonPrimeMin) {
                    nonPrimeMin = num;
                }
            }
        }
        return nonPrimeMin + " " + primeMax;
    }

    private boolean numbercheck(int num) {
        //1이하는 소수가 아님
        if (num <= 1)
            return false;
        //2는 소수지만 2로 나누어지는 수는 소수가 아님
        if (num % 2 == 0)
            return num == 2;

        //3부터 소수 검사; 제곱근 이하의 수로 나누어지면 소수
        for (int i = 3; i < Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {
        primeNumbers method = new primeNumbers();
        String s = "97 75 88 99 95 92 73";
        System.out.println(method.solution(s));
    }
}

 

자바의 정석

오버로딩(overloading)

  • 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것
  • println 이 대표적
  • 오버로딩이 성립하기 위한 조건
    • 1. 메서드 이름이 같아야 한다.
    • 2. 매개변수 개수 또는 타입이 달라야 한다.
    • 3. 반환 타입은 영향 없다.
  • 매개변수는 다르지만 같은 의미의 기능수행

 

생성자(constructor)

  • 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
  • 인스턴스 생성시 수행할 작업(iv 초기화)에 사용

생성자

  • iv 초기화 메서드
  • 이름이 클래스 이름과 같아야 한다.
  • 리턴값이 없다(void 안붙임)
  • 모든 클래스는 반드시 생성자를 가져야 한다 (한개이상)

 

기본 생성자(default constructor)

  • 매개 변수가 없는 생성자
  • 생성자가 하나도 없을 때만 컴파일러가 기본 생성자 자동 추가

클래스이름() {} // 기본 생성자

 

 

매개변수가 있는 생성자

 

매개변수가 있는 생산자

 

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용 가능 

코드의 중복을 제거

 

참조 변수 this

  • this() 생성자랑 전혀 다른거임
  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
  • 같은 클래스 안에서는 생략 가능

 

참조변수 this와 생성자 this()

this

인스턴스 자신을 가리키는 참조변수 인스턴스 주소가 저장되어 있다.

모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다. (선언 안해도 사용가능)

 

this(), this(매개변수) 

생성자

같은 클래스의 다른 생성자를 호출할 때 사용한다.

 

 

변수의 초기화

  • 지역변수(lv)는 수동 초기화 해야함(사용전 꼭!!!)
  • 멤버변수(iv, cv)는 자동 초기화 된다

 

 

멤버변수의 초기화

1. 명시적 초기화(=) 간단 초기화

 

Class Car {

         int door =4;             //기본형(primitive type) 변수의 초기화

         Engine e = new Engine()  //참조형(reference type) 변수의 초기화

2. 초기화 블럭 (복잡한 초기화)

- 인스턴스 초기화 블럭: {}

- 클래스 초기화 블럭: static {}

 

3. 생성자

-Iv 초기화, 복잡한 초기화에 사용

 

 

클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 한번

인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다

1. cv -> iv

2. 자동 0 -> 간단 = -> 복잡 static {}

 

 

 

 

 

 

객체 지향 프로그래밍 OOP:Object-Oriented Programming

 

객체란?

  • 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것.
  • 객체는 속성과 동작으로 구성
  • 객체 모델링(Object Modeling): 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

 

객체의 상호작용

  • 객체들 사이의 상호작용 수단은 메소드
  • 객체가 다른 객체의 기능을 이용하는 것 == 메소드 호출
  •  

메소드 호출

  • 리턴값 = 전자계산기객체.메소드(매개값1, 매개값2,...);
  • int result = Calculator.add(10,20);

 

객체 간의 관계

  • 객체는 개별적으로 사용될 수 있으나, 대부분 다른 객체와 관계를 맺고 있음
    • 집합관계: 하나는 부품, 하나는 완성품
    • 사용관계: 객체간의 상호작용; 객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻음
    • 상속관계: 상위객체를 기반으로 하위 객체를 생성하는 관계

 

객체와 클래스

  • 클래스: 설계도; 객체를 생성하기 위한 필드와 메소드와 정의되어 있음
  • 인스턴스: 클래스로부터 만들어진 객체

 

객체 지향 프로그래밍 개발

1. 클래스 설계

2. 설계된 클래스를 가지고 사용할 객체를 생성

3. 생성된 객체를 이용

 

 

클래스 선언

  • public 접근 제한자: 파일이름과 동일한 이름의 클래스 선언에만 붙일 수 있음
  • 파일 이름과 일치하지 않는 클래스 선언에 public 접근 제한자를 붙이면 컴파일 에러가 발생
  • 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋음

 

객체 생성과 클래스 변수

  • 클래스로부터 객체를 생성하려면 new 연산자를 사용
  • new 클래스();
  • new는 클래스로부터 객체를 생성시키는 연산자
  • new 연산자 뒤에 생성자가 오고 생성자는 클래서()형태를 가지고 있음
  • new 연산자로 생성된 객체는 Heap 영역에 생성됨
  • 힙영역에 객체 생성 후 객체의 번지를 리턴
  • 대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있음

 

 

클래스의 구성 멤버

  • 필드: 객체의 고유 데이터, 부품 객체, 상태 정보를 저장;
    • 생성자와 메소드 전체에서 사용되며 객체가 소멸 되지 않는 한 객체와 함께 존재
  • 생성자: 생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록; 
    • 객체 생성 시 초기화 담당
    • 클래스 이름으로 되어있고 리턴 타입으 잆음
  • 메소드: 객체의 동작에 해당하는 중괄호{} 블록
    • 메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행
    • 필드를 읽고 수정하는 역할 + 다른 객체를 생성해서 다양한 기능을 수행
    • 객체 간의 데이터를 전달하는 수단
    • 외부로부터 매개값을 받아 실행 + 실행 후 결과 값을 외부로 리턴

 

 

자바의 정석 기초편

 

return문

실행 중인 메서드를 종료하고 호출한 곳으로 되돌아간다.

 

메서드가 작업을 마쳤을 때 return; //반환 타입이 void이면 생략가능

 

 

반환 타입이 void가 아닌 경우, 반드시 return문 필요

 

 

반환값

-타입이 다 일치해야함

 

 

호출 스택(call stack)

- stack(스택) : 밑이 막힌 상자, 위에 차곡차곡 쌓인다.

- 메서드 수행에 필요한 메모리가 제공되는 공간

- 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

- 아래 있는 메서드가 위의 메서드를 호출

- 맨 위의 메서드 하나만 실행, 나머지는 대기중

 

호출 스택

 

기본형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read& write)

 

 

static 메서드 인스턴스 메서드

  • 인스턴스 메서드
    • 인스턴스 생성 후, 참보변수, 메서드이름()으로 호출
    • 인스턴스 멤버 (iv, im) 관련된 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수 사용 가능
  • static 메서드(클래스메서드)
    • 객체 생성 없이 클래스 이름.메서드() 으로 호출
    • 인스턴스 멤버와 관련없는 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수(iv) 사용 불가

iv를 사용하지 않으면 static 메서드

static 메서드는 인스턴스 메서드를 호출할 수 없다.

 

static 메서드는 인스턴스 변수를 사용할 수 없다.

 

왜 쓸수 없나

-> static 메서드 호출시 객체(iv묶음)가 없을 수도 있어서.

자바는 객체지향언어

객체지향 언어

  • 80년 초 소프트웨어의 위기 - 빠른 변화를 못쫓아감
  • 해결책으로 객체지향 언어를 도입(절차적 -> 객체지향)
  • 1996년 Java가 나옴
  • 코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거
  • 객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙) // 외우세요

OOP(Object-oriented prgramming) 객체지향언어의 4가지 핵심

1. 캡슐화

2. 상속

3. 추상화

4. 다형성

 

 

클래스와 객체

  • 클래스의 정의: 객체를 정의해 놓은 것 ->제품 설계도
  • 클래스의 용도: 객체를 생성하는데 사용
  • 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념 ->제품
  • 객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름

 

객체의 구성요소 - 속성과 기능

  • 객체 = 속성(변수) + 기능(메서드)

 

객체와 인스턴스

  • 객체: 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스: 특정 클래스로부터 생성된 객체

클래스 ---인스턴스화--> 인스턴스(객체)

 

객체와 인스턴스

 

클래스가 필요한 이유? 

-> 객체를 생성하기 위해

 

객체가 필요한 이유?

-> 객체를 사용하기 위해

 

객체를 사용한다는 것은?

-> 객체가 가진 속성과 기능을 사용하려고

 

 

하나의 소스파일에 여러 클래스 작성

  • public class 가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.
  • public class가 하나도 없는 경우, 소스파일의 이름은  상관 없음

하나의 소스파일에 여러 클래스 작성

객체의 생성과 사용

1. 객체의 생성

 

클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언 --> 리모콘 역할

변수명 = new 클래스명();  //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t;   //Tv 클래스 타입의 참조변수 t를 선언

t = new tv(); //Tv 인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

 

2. 객체의 사용

 

t.channel = 7;  // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.

t.channelDown();  // Tv인스턴스 메서드 channelDown()을 호출한다.

System.out.println("현재 채널은 " + t.channel + " 입니다.");

 

객체의 생성과 사용 - 예제

  • 참조변수가 없으면 객체는 사용 불가 -> Garbage Collector 가 제거해간다.
  • 하나의 인스턴스를 여러 개의 참조변수가 가르키는 경우 (가능)
  • 여러 인스턴스를 하나의 참조변수가 가르키는 경우 (불가능)

 

class Ex6_1 {
    public static void main(String args[]) {
        Tv t;                 // Tv인스턴스를 참조하기 위한 변수 t를 선언
        t = new Tv();         // Tv인스턴스를 생성한다.
        t.channel = 7;        // Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.
        t.channelDown();      // Tv인스턴스 메서드 channelDown()을 호출한다.
        System.out.println("현재 채널은 " + t.channel + " 입니다..");
    }
}

class Tv {
    // Tv의 속성(멤버변수)
    String color;           // 생상
    boolean power;             // 전원상태(on/off)
    int channel;               // 채널

    // Tv의 기능(메서드)
    void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드
    void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드
    void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드
}

 

class Ex6_2 {
    public static void main(String args[]) {
        Tv t1 = new Tv();  // Tv t1; t1 = new Tv();를 한 문장으로 가능
        Tv t2 = new Tv();
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

        t1.channel = 7;    // channel 값을 7으로 한다.
        System.out.println("t1의 channel값은 7로 변경하였습니다.");
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    }
}

객체마다 별도의 저장공간을 가진다.

 

객체 배열

객체 배열 == 참조변수 배열

 

 

클래스의 정의

클래스 == 데이터 + 함수

 

1. 변수: 하나의 데이터를 저장할 수 있는 공간

2. 배열: 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간

3. 구조체: 서로 관련된 여러 데이터(종류 관계x)를 하나로 저장할 수 있는 공간

4. 클래스: 데이터와 함수의 결합(구조체 +함수)

 

사용자 정의 타입 - 원하는 타입을 직접 만들 수 있다.

 

 

선언 위치에 따른 변수의 종류

 

 

cv는 아무때나 사용가능

iv는 객체생성을 해야 사용 가능

lv는 변수 선언문이 수행되었을 때 사용 

 

 

클래스 변수와 인스턴스 변수

공통 속성은 static 붙인다.

 

클래스 이름을 cv에 붙인다.

 

class Ex6_3 {
    public static void main(String args[]) {
        System.out.println("Card.width = " + Card.width);
        System.out.println("Card.height = " + Card.height);

        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
        System.out.println("c1은 width와 height를 각각 50, 80으로 변경합니다.");
        c1.width = 50;
        c1.height = 80;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
    }
}

class Card {
    String kind;
    int number;
    static int width = 100;
    static int height = 250;
}

 

메서드란?

1. 문장들을 묶어놓은 것

   - 작업 단위로 문장들을 묶어서 이름 붙인 것

 

2. 값(입력)을 받아서 처리하고 결과을 반환(출력)

 

매서드의 장점

- 코드의 중복을 줄일 수 있다.

- 코드의 관리가 쉽다.

- 재사용 가능

- 반복적으로 수행되는 여러문장을 메서드로 작성

 

메서드 = 선언부 + 구현부

 

반환타입 메서드이름 (타입변수명, 타입변수명, ...)

{

//메서드 호출시 수행될 코드

}

 

메서드

반환타입이 없을 땐 void라고 적는다.

 

메서드의 구현부

지역변수(lv): 메서드 내에 선언된 변수

 

 

메서드의 호출

메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법

 

print99danAll(); // void print99danAll() 호출

int result = add(3,5); // int add(intx, int y)를 호출하고 결과를 result에 저장

 

class Ex6_4 {
    public static void main(String args[]) {
        MyMath mm = new MyMath();
        long result1 = mm.add(5L, 3L);
        long result2 = mm.subtract(5L, 3L);
        long result3 = mm.multiply(5L, 3L);
        double result4 = mm.divide(5L, 3L);

        System.out.println("add(5L, 3L) = " + result1);
        System.out.println("subtract(5L, 3L) = " + result2);
        System.out.println("multiply(5L, 3L) = " + result3);
        System.out.println("divide(5L, 3L) = " + result4);
    }
}

class MyMath {
    long add(long a, long b) {
        long result = a + b;
        return result;
        // return a + b;  //위의 두 줄을 이와 같이 한 줄로 간단히 할 수 있다.
    }
    long subtract(long a, long b) { return a - b; }
    long multiply(long a, long b) { return a * b; }
    double divide(double a, double b) {
        return a / b;
    }
}

 

 

 

 

메서드의 실행흐름

 

완주하지 못한 선수

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.

 

문제 풀이

1. participant에는 있지만 completion에는 없는 값을 찾으면 된다.

2. 동명이인은 어떻게 처리하지? 

3. 오름차순으로 정렬한 후 이름이 같은지 확인하고 아니라면 answer +=;

import java.util.Arrays;

public class unfinished {
    public static void main(String[] args) {
        String [] participant ={"marina", "josipa", "nikola", "vinko", "filipa"};
        String [] completion = {"josipa", "filipa", "marina", "nikola"};
        String answer ="";

        Arrays.sort(participant);
        System.out.println(Arrays.toString(participant));
        Arrays.sort(completion);
        System.out.println(Arrays.toString(completion));

        for(int i =0; i< completion.length;i++){
            if(!(participant[i].equals(completion[i]))){
                answer = participant[i];
                break;
            }else{
                answer = participant[i+1];
            }

        }
        System.out.println(answer);
    }
}

 

 

수박수박수

문제 설명

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

제한 조건

n은 길이 10,000이하인 자연수입니다.

 

문제 풀이

1. 홀수 이면 '수', 짝수이면 '박'을 출력하기

2. for(int i=1; i<=n; i++){ if(i%2!=0){ answer+='수';} else{ answer+='박';}

 

import java.util.Scanner;

public class soovak {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = 0;
        String answer = "";
        n = scanner.nextInt();
        for(int i=1; i<=n; i++){
            if(i%2!=0){
                answer +='수';
            } else{
                answer +='박';
            }
        }
        System.out.println(answer);
    }
}

 

매우 간단한 문제!

 

삼항연산자를 쓰면 더 좋았을 것 같네요.

수박수박수박수

13. 2016년

2016년의 날짜를 입력하면 요일을 출력하기

 

public class year_2016 {
    public static void main(String[] args) {
        int a = 0;
        int b = 0;
        String answer = "";
        String[] day = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
        int[] date = {31,29,31,30,31,30,31,31,30,31,30,31};
        int select = 0;

        for(int i = 0; i < a-1; i++){
            select += date[i];
        }
        select += b - 1;

        answer = day[select % 7];
        
        System.out.println(answer);
    }
}

위에는 클래스를 따로 Import 하지 않고 풀었을 때의 풀이입니다.

2016년 개별 월의 마지막 날짜를 구해서 해당 날짜만큼을 8일

import java.time.LocalDate;
import java.util.Scanner;

public class year_2016 {
    public static void main(String[] args) {
        int a = 0;
        int b = 0;
        Scanner scanner = new Scanner(System.in);
        a = scanner.nextInt();
        b = scanner.nextInt();
        String answer = "";
        LocalDate date = LocalDate.of(2016, a,b);
        System.out.println(date); // 2016-5-24
        answer = date.getDayOfWeek().toString(); //요일은 String 타입으로 변환해야한다.
        System.out.println(answer); // TUESDAY
        System.out.println(answer.substring(0,3)); //.substring 메서드 사용해서 앞 3글자만 출력
    }
}

 

LocalDate.of() 메서드를 사용하면 쉽게 날짜를 구할 수 있습니다.

사용하기 위해서

 

import java.time.LocalDate;

 

LocalDate.of(year, month, day)

 

.getDayOfWeek() 메서드를 사용하면 요일을 구할 수 있습니다.

 

단, String 타입으로 변환을 해줘야 합니다.

 

.toString() 을 사용하거나 

String.valueOf() 를 사용해서 타입 변환을 해줍니다.

 

 

 

14. 나중에 떨어지는 숫자 배열

1. 배열의 길이를 구해서 조건값 찾기

2. 각 인덱스를 divisor 나눈 나머지 값 구하기 %divisor

3. 한번 길이를 정한 배열은 변경할 수 없기 때문에... 나머지가 0인 index의 수를 세기 count++

4. count 길이만큼의 배열 만들기 answer []

5. 나머지가 0이면 해당 Index값을 반환한 값을 answer [] 에 넣기

6. if else %divisor !=0 인 경우 count []에 -1 을 담기

7. 오름차순으로 배열하기 Arrays.sort 사용하기

 

import java.util.Arrays;

public class numberArray {
    class Solution {
        public int[] solution(int[] arr, int divisor) {
            int count =0;

            for(int i =0; i<arr.length; i++){
                if(arr[i]%divisor==0){
                   count++;
                }
            }
            int[] answer = new int[count];
            count=0;                        //count 값 초기화 (변수명 바꿔도 상관x)
            for (int i=0; i<arr.length; i++){
                if(arr[i]%divisor==0){
                    answer[count] = arr[i]; //answer index [0]번째부터 값 넣어주기
                    count++;
                }
            }
            if(answer.length==0){
                answer = new int[1];
                answer[0] =-1;
            }

            Arrays.sort(answer);
            return answer;
        }

    }
}

 

 

 

15. 내적

1. for 문 이용해서 풀면 간단하다.

public class naejuk {
    public static void main(String[] args) {
        int answer = 0;
        int[] a ={1,2,3,4};
        int[] b ={-3,-1,0,2};
        for(int i=0; i<a.length; i++){
                answer +=(a[i]*b[i]); //()괄호를 해줘야 answer에 곱한 값이 들어간다.
            }
        System.out.println(answer);
        }

    }

 

16. 문자 내 p와 y의 개수

1. 문자열을 배열로 전환한다. char[] toCharArray(): 문자열을 문자배열로 변환해서 반환을 사용해본다.

2. p 또는 P의 개수(int p)와 y또는 Y의 개수(int y)를 센다.

3. 두 값이 같으면 true를 리턴한다. 아니면 false를 리턴한다.

import java.util.Arrays;
import java.util.Scanner;

public class py {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        int p =0;
        int y =0;
        char[] arr = s.toCharArray();
        System.out.println(Arrays.toString(arr));
        for(int i=0; i<arr.length; i++){
            if(arr[i]=='p'|| arr[i]=='P'){
                p++;
            }
        }
        System.out.println(p);
        for(int i=0; i<arr.length; i++){
            if(arr[i]=='y'|| arr[i]=='Y'){
                y++;
            }
        }
        System.out.println(y);
        boolean answer = true;
        if(p==y){
            answer = true;
        }else{
            answer = false;
        }
        System.out.println(answer);
    }
}

 

소문자와 대문자를 || 로 넣었는데 그냥 처음부터 

 

.toUpperCase()를 써서 굳이 || 를 안쓰게 할 수도 있었습니다.

 

.filter() 메서드라는 게 있네요. 아래는 좋아요를 가장 많은 풀이 입니다.

class Solution {
    boolean solution(String s) {
        s = s.toUpperCase();

        return s.chars().filter( e -> 'P'== e).count() == s.chars().filter( e -> 'Y'== e).count();
    }
}

 

 

17. 문자열 다루기 기본

1. 길이 확인하기: s.length !=4 && s.length !=6 이면 false return

3. 문자인지 아닌지 확인하기 .charAt()과 for 문 사용하기   

 

import java.util.Scanner;

public class stringControl {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        boolean answer = true;
        if(s.length() !=4 && s.length() !=6){
            answer = false; //길이가 4와 6이 아니면 false
        }
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)<'0'|| s.charAt(i)>'9'){ //0보다 작거나 9보다 크면 false; char 이기 때문에 문자로 비교
                answer = false;
            }
        }
        System.out.println(answer);
    }
}

 

생각보다 쉽게 풀어졌는데 프로그래머스에 제출 코드는 조금 변형했습니다.

s.length를 에러로 인식해서 새로 변수를 선언했습니다.

그리고 && 대신 || 를 사용해봤습니다.

 

class Solution {
    public boolean solution(String s) {
        boolean answer = false;
        int length = s.length();
        if(length==4 || length==6){
            answer = true;
        }
        for(int i=0; i<length; i++){
            if(s.charAt(i)<'0'|| s.charAt(i)>'9'){
                answer=false;
            }
        }
        return answer;
    }
}

 

가장 좋아요를 많이 받은 풀이는 try, catch 문을 사용했습니다. 아직 안배운 부분이라 생각치 못했네요.

 

class Solution {
  public boolean solution(String s) {
      if(s.length() == 4 || s.length() == 6){
          try{
              int x = Integer.parseInt(s);
              return true;
          } catch(NumberFormatException e){
              return false;
          }
      }
      else return false;
  }
}

 

 

18. 서울에서 김서방 찾기

1. kim 값을 찾는다. if문 사용 seoul[i].equals("kim"), System.out.println(i);

2. 해당 Index가 몇번째인지 알아내기 

class Solution {
    public String solution(String[] seoul) {
        String answer = "";
        int length = seoul.length;
        for(int i =0;i<length; i++){
            if(seoul[i].equals("Kim")){
                answer = "김서방은 "+i+"에 있다";
            }
        }
    
        return answer;
    }
}

- 대문자 소문자 확인하기

- String 비교 할 때는 .equals() 메소드 사용하기

 

Arrays.asList().indexOf();

가장 좋아요를 많이 받은 풀이 입니다.

Arrays.asList() : Array를 List처럼 사용할 수 있게 해주는 클래스 

.indexOf() 메소드를 사용했습니다.

자바의 정석 배열

배열

 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

 

배열의 선언과 생성

배열의 선언 - 배열을 다루기 위한 참조변수 선언

 

1. 타입[] 변수이름

 - Int[] score;

 - score = new int[5];

 

2. 타입 변수이름[]

 

배열의 인덱스

각 요소에 자동으로 붙는 번호

"인덱스(Index)의 범위는 0부터 배열길이-1"까지

public class Ex5_1_tmp {
    public static void main(String[] args) {
//        int[] score; 1. 배열 score를 선언(참조변수)
//        score = new int[5]; 2. 배열의 생성(int저장공간 x 5)
        
        int [] score = new int[5]; // 배열의 선언과 생성을 동시에
        score[3] =100;
        
    }

배열의 길이

"배열은 한번 생성하면 그 길이를 바꿀 수 없다."

 

배열의 초기화

배열의 각 요소에 처음으로 값을 저장하는 것

 

int[] score = { 1, 2, 3,4,5};

 

배열의 출력

char[] ChArr 

 

캐릭터 배여일 때만 출력 가능

 

// 배열의 요소를 순서대로 하나씩 출력

for( int i=0; i<Arr.length; i++){

System.out.println(Arr[i]);}

 

//배열의 모든 요소를 출력

System.out.println(Arrays.toString(Arr));

 

 

배열의 활용

총점과 평균 구하기

public class Ex5_2 {
    public static void main(String[] args) {
        int sum=0;
        float average =-0f;

        int[] score = {100,88,100,100,90};
        for (int i=0; i <score.length; i++){
            sum += score[i];
        }
        average = sum /score.length; //계산결과를 Float으로 얻기

        System.out.println("총점 : " + sum);
        System.out.println("평균 : " + average);
    }
}

 

최대값과 최소값

 

public class Ex5_3 {
    public static void main(String[] args) {
        int[] score = {79, 88, 91, 33, 100, 55,95};

        int max = score[0];
        int min = score[0];

        for(int i=1; i <score.length; i++) {
            if(score[i]> max){
                max = score[i];
            } else if(score[i]<min){
                min = score[i];
            }
        }
        System.out.println("최대값 :"+max);
        System.out.println("최소값 :"+min);
    }
}

 

섞기(Shuffle)

import java.util.Arrays;

public class Ex5_4 {
    public static void main(String[] args) {
        int[] numArr = {0,1,2,3,4,5,6,7,8,9};
        System.out.println(Arrays.toString(numArr));

        for (int i =0; i<100; i++){
            int n = (int)(Math.random()*10);
            int tmp = numArr[0];
            numArr[0] = numArr[n];
            numArr[n] =tmp;
        }
        System.out.println(Arrays.toString(numArr));
    }
}

 

로또 번호 

import java.util.Arrays;

public class Ex5_5 {
    public static void main(String[] args) {
        int[] ball = new int[45]; //45개 정수값을 저장하기

        //배열의 각 요소에 1~45값을 저장
        for(int i=0; i<ball.length; i++){
            ball[i]=i+1; // ball[0]에 1이 저장된다.인덱스는 0부터 시작하니까
        }
        System.out.println(Arrays.toString(ball));
        int tmp =0; // 두 값을 바꾸는데 사용할 임시변수
        int j =0; // 임의의 값을 얻어서 저장할 변수

        // 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 저장
        // 0번째부터 5번째 요소까지 모두 6개만 바꾼다.
        for (int i=0; i<6; i++){
            j=(int)(Math.random()*45); //0~44범위 임의의 수
            tmp =ball[i];
            ball[i] = ball[j];
            ball[j] = tmp;
            System.out.println(Arrays.toString(ball));
        }
        //배열 ball의 앞에서부터 6개의 요소를 출력한다.
        for(int i=0; i<6; i++){
            System.out.printf("ball[%d]=%d%n", i, ball[i]);
        }

    }
}

결과

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 3, 4, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 4, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 27, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 27, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 5, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 6, 27, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 5, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
ball[0]=12
ball[1]=7
ball[2]=28
ball[3]=24
ball[4]=6
ball[5]=27

Process finished with exit code 0

 

 

String 배열의 선언과 생성

String 클래스

1. String클래스는 char[] 와 메서드(기능)를 결합한 것

   String클래스 = char[] + 메서드(기능)

 

2. String 클래스는 내용을 변경할 수 없다. (read only)

 

String클래스의 주요 메서드

char charAt(int index) : 문자열에서 해당위치(index)에 있는 문자를 반환한다.

int length() : 문자열의 길이를 반환한다

String substring (in from, int to) : 문자열에서 해당 범위(from~to)의 문자열을 반환한다 (to 는 포함 안됨)

boolean equals(Object obj): 문자열의 내용이 같은지 확인한다.

char[] toCharArray(): 문자열을 문자배열로 변환해서 반환

 

 

커맨드 라인을 통해 입력받기

public class Ex5_7 {
    public static void main(String[] args) {
        System.out.println("매개변수의 개수:"+args.length);
        for(int i=0; i< args.length;i++){
            System.out.println("args["+i+"] = \""+ args[i] +"\"");
        }
    }
}

run configuration

run configuration의 arguments를 수정해주면,,,,

 

 

2차원 배열

테이블 형태의 데이터를 저장하기 위한 배열

 

int[][] score = new int[4][3]; //4행 3열의 2차원 배열 score

2차원 배열의 인덱스

2차원 배열의 초기화

int[][] arr = {

                        {1,2,3}

                        {4,5,6}

                     };

 

 

2차원 배열 예제

class Ex5_8 {
   public static void main(String[] args) {
      int[][] score = {
              { 100, 100, 100 }
            , { 20, 20, 20 }
            , { 30, 30, 30 }
            , { 40, 40, 40 }
      };
      int sum = 0;

      for (int i = 0; i < score.length; i++) {
         for (int j = 0; j < score[i].length; j++) {
            System.out.printf("score[%d][%d]=%d%n", i, j, score[i][j]);

            sum += score[i][j];
         }
      }

      System.out.println("sum=" + sum);
   }
}
class Ex5_9 {
    public static void main(String[] args) {
        int[][] score = {
                { 100, 100, 100}
                , { 20, 20, 20}
                , { 30, 30, 30}
                , { 40, 40, 40}
                , { 50, 50, 50}
        };
        // 과목별 총점
        int korTotal = 0, engTotal = 0, mathTotal = 0;

        System.out.println("번호 국어 영어 수학 총점 평균");
        System.out.println("=============================");

        for(int i=0;i < score.length;i++) {
            int  sum = 0;      // 개인별 총점
            float avg = 0.0f;  // 개인별 평균

            korTotal  += score[i][0];
            engTotal  += score[i][1];
            mathTotal += score[i][2];
            System.out.printf("%3d", i+1);

            for(int j=0;j < score[i].length;j++) {
                sum += score[i][j];
                System.out.printf("%5d", score[i][j]);
            }

            avg = sum/(float)score[i].length;  // 평균
            System.out.printf("%5d %5.1f%n", sum, avg);
        }

        System.out.println("=============================");
        System.out.printf("총점:%3d %4d %4d%n", korTotal, engTotal, mathTotal);
    }
}
import java.util.Scanner;

class Ex5_10{
    public static void main(String[] args) {
        String[][] words = {
                {"chair","의자"},        // words[0][0], words[0][1]
                {"computer","컴퓨터"},    // words[1][0], words[1][1]
                {"integer","정수"}       // words[2][0], words[2][1]
        };

        Scanner scanner = new Scanner(System.in);

        for(int i=0;i<words.length;i++) {
            System.out.printf("Q%d. %s의 뜻은?", i+1, words[i][0]);

            String tmp = scanner.nextLine();

            if(tmp.equals(words[i][1])) {
                System.out.printf("정답입니다.%n%n");//%n은 개행
            } else {
                System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n",words[i][1]);
            }
        } // for
    } // main의 끝
}

 

Arrays로 배열 다루기

문자열의 비교와 출력 - equals(), toString()

 

Arrays.toString(arr); 1차원 배열

Arrays.deepToString(arr2D); 2차원 배열

 

Arrays.equlas(arr1, arr2); 1차원배열 비교

Arrays.deepEquals(arr1, arr2); 2차원 이상 배열 비교

 

배열의 복사 - copyOf(), copyOfRange()

 

배열의 정렬 - sort()

 

Arrays.sort(arr); // 오름차순으로정렬

 

 

 

 

 

이번주 월요일에 정식으로 부트캠프를 시작했고 벌써 첫번째 주의 마지막날이 되었습니다. 월요일에는 아무것도 모르는 백지상태에 가까웠다면, 이제는 JWT를 이용해서 회원가입, 로그인, 로그아웃을 구현할줄 알게 되었고, Github을 이용해서 팀 프로젝트를 완성했습니다. Rest API 형식을 따라서 API 설계도 해보고 MongoDB를 이용해서 DB 설계도 경험했습니다. flask의 Blueprint를 사용해서 효율적으로 분업을 했고 후에 merge할 때 충돌이 한번도 발생하지 않았습니다. 

항해99 1주차 회고

JWT를 활용한 로그인, 로그아웃, 회원가입 구현

  • JWT을 사용하는 이유
    • 쿠키를 받아 토큰을 발급해서 로그인 정보 확인
    • 쿠키는 브라우저에만 존재
    • 같은 도메인이면 쿠키가 유지됨
    • 로그아웃 하려면 쿠키 삭제하면 됨
    • 보안상 더 낫다고 함
  • Hash 함수 사용 이유
    • 비밀번호의 암호화
    • Sha 256, Sha 512 를 많이 사용함
  • unix time: 1970년 1월 1일로부터 몇 초 지났는지

TIL 221114

 

TIL 부트캠프 정식 시작 JWT 로그인 구현하기 221114

드디어 오늘이 항해99 부트캠프 정식 시작일입니다. 지난주는 pre-onboarding 기간으로 주특기 언어인 Java를 공부하는 시간을 가졌습니다. 오늘부터 새로 배정된 조에서 미니 프로젝트를 진행합니다

pizzathedeveloper.tistory.com

 

아이디 중복확인

function id_overlap_check() {
    let userid = $('#user_id').val()
    if (userid == '') {
        alert('아이디를 입력해주세요.'); //공백인 경우
    } else {
        $.ajax({
            type: "GET",
            url: "/join/check?user_id=" + userid, //get 할 때 url은 "/url"+찾는값
            data: {},
            success: function (response) {
                alert(response['message']);
                if (response['success'] == false) {
                    let input = document.getElementById("user_id");
                    input.value = null; //input 값 없앰
                } else{$('.user_id').attr("check_result", "success");
                    $('.id_overlap_button').hide(); //중복확인버튼 없앰
                         }
                }
        });
    }
}

 

중복확인 필수로 하지 않으면 회원 가입이 되지 않게 만들기

 

.attr () 메소드를 이용해서 확인 되면 =="success" 로 변경이 되게 구현했습니다.

function join() {
    if ($('.user_id').attr("check_result") == "fail") {
        alert("아이디 중복체크를 해주시기 바랍니다.") //중복체크가 안되어 있을 때
    }
    else if ($('.name_input').val() == '') {
        alert("닉네임을 입력해주시기 바랍니다."); //닉네임 input 이 없을때
        $('.user_name').focus();
    } else if ($('.pw_input').val() == '') {
        alert('비밀번호를 입력해주세요.')
        $('.user_pw').focus(); //pw input이 공백인 경우
    } else {
        $.ajax({
            type: "POST",
            url: "/join/join",
            data: {
                id_give: $('#user_id').val(),
                pw_give: $('#user_pw').val(),
                name_give: $('#user_name').val()
            },
            success: function (response) {
                if (response['result'] == 'success') {
                    alert('회원가입이 완료되었습니다.')
                    window.location.href = '/login'
                } else {
                    alert('다시 시도하세요.')
                }
            }
        })
    }}
 

TIL 221116

 

TIL Merge 하고 다시 작업하기 아이디 중복확인 기능 로그인 JWT token 221116

오늘은 아침에 일어나는 게 너무 힘들었는데 막상 또 일어나서 컴퓨터 앞에 앉으니까 열정이 샘솟았습니다. 제가 어제 걱정하고 씨름했던 오류가 말끔히 해결이 되었거든요. 껐다 켰다는 진리

pizzathedeveloper.tistory.com

 

로그아웃 기능 구현하기

JWT 를 브라우저에서 지워주면 됩니다.

토큰은 클라이언트에서 저장하기 때문입니다.

jquery를 사용했습니다.

 

$.removeCookie('쿠키이름');

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script> //필요한 페이지에 이거 복붙해주세요.
    <title>logout</title>
    <script>
        function logout(){
        $.removeCookie('mytoken');
        alert('로그아웃!')
        window.location.href='/login'
      } //로그아웃 버튼 만들어서 붙이시면 됩니다
    </script>
</head>
<body>

<button onclick="logout()">로그아웃 하기</button>
</body>
</html>

 

미니프로젝트 '제2의 항해 매니저' github

https://github.com/sooni2/HanghaeManager

 

GitHub - sooni2/HanghaeManager

Contribute to sooni2/HanghaeManager development by creating an account on GitHub.

github.com

제 리포지토리에 올린 첫 프로젝트입니다.

뛰어난 조원분들과 함께해서 제가 기여한 부분이 메인은 아니지만 나름 맡은 역할을 다 했습니다.

제가 기획한 프로젝트가 채택되어서 기획쪽도 재미가 있다고 생각했습니다.

늘 저는 아이디어는 많습니다.

 

 

첫 코드리뷰를 진행하다

오늘은 함께 첫 프로젝트를 진행한 조원들과 함께 코드리뷰를 진행했습니다. 

 

- 백에서 할수 있는 것은 최대한 백에서 처리하기

- API 설계를 아는 것이 중요하다

- 이번 프로젝트에는 Rest API 를 사용했음

- DB 설계에 맞춰 API 설계하기

 

저는 이번주에 시작한 완전 초짜지만 먼저 시작한 선배님들의 조언과 여러 피드백을 들으면서 월요일보다 성장한 것 같습니다. 함께한 조원분들이 성격도 좋고 개발도 잘해서 다행이었던 프로젝트였습니다. 

 

다음 주에는...

이제는 자바스크립트를 뒤로 하고 자바에 집중하는 한주가 될 예정입니다. 오늘은 남궁성 자바의 정석 ch 5까지 들었습니다. 프로그래머스 알고리즘 문제를 지난 이틀간 풀었는데 아무래도 자바 기초가 부족하다 보니 간단한 문제도 방법을 몰라서 푸는 경우가 많았습니다. 문제 푸는 로직은 어느정도 이해는 갑니다. 더 많은 메소드를 알게 되면 알고리즘 문제 풀이가 좀 더 수월할 것 같습니다. 

 

시그마로 푸는 문제가 하나 있었는데 언제 이걸 봤었지 했는데 고등학생인가 대학생때 통계학에서 배운 기억이 났습니다. 알고리즘 주차에 걷기반을 선택해서 28 문제를 푸는 것이 학습 목표인데 좀더 욕심을 내서 달리기 반의 문제 10개까지 추가를 해서 풀어보도록 하겠습니다.

 

 

조건문과 반복문

 

조건문과 반복문 flow control statement(제어문)

조건식

If-else if 문

여러 개 중의 하나 - 여러 개의 조건식을 포함한 조건식

 

중첩 if 문

중첩횟수 제약은 없음

괄호가 중요,,!

 

Switch문

처리해야 하는 경우의 수가 많을 때 유용한 조건문

break문을 빼먹지 말자

 

1. 조건식을 계산한다.

2. 조건식의 결과와 일치하는 case문으로 이동한다.

3. 이후의 문장들을 수행한다.

4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.

 

Switch문의 제약조건

1. switch문의 조건식 결과는 정수 또는 문자열(1.7 버전이후)이어야 한다.

2. case문의 값은 정수, 상수(문자포함), 문자열만 가능하며, 중복되지 않아야 한다.

 

임의의 정수 만들기

Math.random() - 0.0과 1.0사이의 임의의 double값을 반환

 

0.0 <= Math.random() < 1.0

 

1과 3사이의 정수 구하기

1. 각 변에 3을 곱한다.

 

2. 각 변을 Int형으로 변환한다.

 

3. 각 변에 1을 더한다.

 

System.out.println((int)(Math.random()*11)-5);//-5와 5의 사이

 

for문

조건을 만족하는 동안 블럭{}을 반복 - 반복 횟수를 알 때 적합

변수의 범위(scope)는 좁을수록 좋다; 선언위치부터 선언된 블럭의 끝까지

 

//조건식을 생력하면, true로 간주되엇 무한반복문이 된다.
for(;;){
    System.out.println("i="+1);
}

중첩 for 문

직사각형 별찍기

public class Ex4_15 {
    public static void main(String[] args) {
        for(int i=1; i<=5; i++) {
            for (int j = 1; j <= 10; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

별 늘리기

public class Ex4_15 {
    public static void main(String[] args) {
        for(int i=1; i<=5; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

 

while문

조건을 만족시키는 동안 블럭{}을 반복 - 반복 횟수 모를 때

 

while 조건식 {

  //조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.

}

 

for문과 100% 상호 대체 가능

 

for 문

public class Ex4_14 {
    public static void main(String[] args) {
        int num =12345, sum =0;
        //10으로 나머지 연산을 하면 마지막 자리를 얻는다.
//        System.out.println(12345%10);
        //num = 12345, 1234, 123,12, 1
        for(num=12345; num>0; num=num/10){
            System.out.println(num);
        }
        System.out.println("각 자리수의 합:" +sum);
    }
}

while문으로 바꾸기

 

public class Ex4_14 {
    public static void main(String[] args) {
        int num =12345, sum =0;
        //10으로 나머지 연산을 하면 마지막 자리를 얻는다.
//        System.out.println(12345%10);
        //num = 12345, 1234, 123,12, 1
        while(num>0){
            sum += num%10;
            System.out.println("sum"+sum+",num%10="+num%10);
            num =num/10;
        }
        System.out.println("각 자리수의 합:" +sum);
    }
}

 

do-while문

블럭{}을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용

 

break문

자신이 포함된 하나의 반복문을 벗어난다.

 

while문

public class Ex_16 {
    public static void main(String[] args) {
        int sum =0;
        int i =0;

        while(true){//무한 반복문 for(;true;) {}
            if(sum>100)
                break; //자신이 속한 하나의 반복문을 벗어난다.
            ++i;
            sum += i;
        } // end of while

        System.out.println("i=" +i);
        System.out.println("sum=" + sum);
    }
}

for문

public class Ex_16 {
    public static void main(String[] args) {
        int sum =0;
        int i =0;

        for(;;){//무한 반복문 for(;true;) {}
            if(sum>100)
                break; //자신이 속한 하나의 반복문을 벗어난다.
            ++i;
            sum += i;
        } // end of while

        System.out.println("i=" +i);
        System.out.println("sum=" + sum);
    }
}

 

continue문

자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘아감

전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용

break문과 달리 반복문을 벗어나지 않는다.

 

public class Ex4_17 {
    public static void main(String[] args) {
      for(int i=0; i<= 10; i++){
          if(i%2==0)
              continue;
          System.out.println(i);
      }
    }
}

 

예시

import java.util.Scanner;

public class Ex4_18 {
    public static void main(String[] args) {
        int menu =0;
        int num =0;

        Scanner scanner = new Scanner(System.in);

        while (true){ // 무한 반복문
            System.out.println("(1) square");
            System.out.println("(2) square root");
            System.out.println("(3) log");
            System.out.println("원하는 메뉴(1~3)을 선택하세요. (종료:0>");

            String tmp = scanner.nextLine(); //화면에서 입력받은 내용을 tmp에 저장
            menu = Integer.parseInt(tmp); //입력받은 문자열(tmp)을 숫자로 변환

            if(menu==0) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else if (!(1<=menu && menu<=3)) {
                System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
                continue;
            }
            System.out.println("선택하신 메뉴는" + menu + "번입니다.");

        } //main의 끝
    }
}

 

이름붙은 반복문

반복문에 이름을 붙여서 하나 이상의 반복문을 벗어날 수 있다.

 

 

연산자와 피연산자

연산자: 연산을 수행하는 기호

피연산자: 연산자의 연산 수행 대상

"모든 연산자는 연산결과를 반환한다.

 

연산자의 우선순위

"하나의 식(expression)에 연산자가 둘 이상 있을때, 어떤 연산을 먼저 수행할지를 자동 결정하는 것

 

1. 산술 > 비교>논리>대입

2. 단항(1) > 이항 (2) > 삼항(3), 단항연산자의 우선순위가 이항 연산자보다 높다.

3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

 

형변환 연산자

형변환: 변수 또는 상수의 타입을 다른 타입으로 변환하는것

(타입)피연산자

double d = 85.4

int score = (int)d;

int score = (int)85.4;

int score = 85;

 

- d 자체가 변한게 아님 읽는 방법이 바뀐것임.

 

산술 변환

"연산 전에 피연산자의 타입을 일치 시키는 것"

1. 두 연산자의 타입을 갖게 일치시킨다. (보다 큰 타입으로 일치)

2. 피연산자의 타입이 int보다 작은 타입이면 Int로 변환된다.

 

반올림

Math.round()

 

실수를 소수점 첫째자리에서 반올림한 정수를 반환

 

long result // Math.round(4.52) // 5가 저장됨

 

 

3.142 만드는 법

 

문자 ch

조건 연산자 ? :

조건식의 결과에 따라 연산을 달리한다.

 

result = (x>y) ? x :y ; // 괄호생략가능

조건이 참이면 x, 거짓이면, y

 

if문을 삼항연산자로 간단하게 쓴다.

 

대입 연산자

오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반

대입연산자

왼쪽 피연산자가 저장공간이여야한다. 아니면 에러가 발생함

 

 

변수 자바의정석

변수(variable)란?

  • 하나의 값을 저장할 수 있는 메모리 공간 RAM

 

변수의 선언

  • 변수의 선언 이유: 값(data)을 저장할 공간을 마련하기 위해서
  • 변수타입 변수이름;

 

변수에 값 저장하기

  • '='는 등호가 아니라 대입
  • 오른쪽의 값을 왼쪽에 저장
  • 지역변수는 읽기 전에 꼭! 초기화

 

변수의 타입

  • 저장할 값의 타입에 의해 결정
  • 저장할 값을 타입과 일치하는 타입으로 변수를 선언

 

변수, 상수, 리터럴

  • 상수(constant) - 한 번만 값을 저장 가능한 변수 (final 붙이면 상수)
  • 리터럴(literal) =기존의 상수; 그 자체로 값을 의미하는 것
  • \n == 개행문자
  • 범위가 '변수(그릇)' > '리터럴(물건)'인 경우, OK; 반대는 에러

 

문자와 문자열

  • String s =""; // 빈 문자열(empty String)
  • char ch=''; // 에러

 

두 변수의 값 교환하기

public class Ex2_1 {
    public static void main(String[] args) {
        int x=4, y=2;
        int tmp;
        tmp =x;
        x=y;
        y=tmp;
        System.out.println(x);
        System.out.println(y);
    }
}

x와 y 값이 교환됨

 

 

기본형과 참조형

  • 기본형(Primitive type): boolean, char, byte, short, int, long, float, double
    • 실제 값을 저장
    • 논리형
    • 문자형
    • 정수형
    • 실수형
  • 참조형(Reference type): 기본형을 제외한 나머지(String, System 등)
    • 메모리 주소를 저장(4 byte 또는 8 byte)
  • default 타입 double, int

 

 

형식화된 출력 - printf()

  • pirntln()의 단점 - 출력형식 지정불가
    • 실수의 자리수 조절불가
    • 10진수로만 출력가능
  • printf()로 출력형식 지정가능
    • System.out.printf("%.2f", 10.0/3); //3.33
      • 소숫점 둘째자리까지만 출력
    • System.out.printf('%d', 0x1A);// 26 -> %d 10진수
    • System.out.printf("%x", 0x1A);// 1A -> 16진수
  • printf()의 지시자

\n는 줄바꿈
printf()

 

Scanner

  • 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스
  • 사용법 

1. import문 추가

    import java.util.*;

2. Scanner 객체의 생성

Scanner scanner = new Scanner System.in; 

3. Scanner 객체의 사용

int num = scanner.nextInt(); // 화면에서 입력받은 정수를 num에 저장

 

 

 

타입간의 변환방법

1. 문자와 숫자간의 변환

- 숫자에 문자'0'을 더하면 문자가 되고 문자에 '0'을 빼면 숫자가된다.

 

2. 문자열로의 변환

- 숫자에 빈문자열""을 더해주면 된다

 

3. 문자열을 숫자로 변환

- Integer.parseInt() 메소드를 사용

-Double.parseDouble()

 

4. 문자열을 문자로 변환하는 방법

- .charAt()

 

 

 

 

7. 음양 더하기

 

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        for(int i=0;i<absolutes.length;i++){
            if(signs[i]==true){
                answer += absolutes[i];
            }else{
                answer -= absolutes[i];
            }
        }
        return answer;
    }
}

삼항연산자를 연습해야겠습니다.

 

 

8.  평균 구하기

class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        for(int i=0; i<arr.length; i++){
            answer += arr[i];
        }
        answer /= arr.length;
        return answer;
    }
}

평균 구하기는 쉬웠습니다.

 

 

9.  핸드폰번호가리기

1. 전체 번호 길이에서 마지막 숫자 네 개를 뺀 부분에 *찍기하려면 길이를 구한다.

2. .length() 메소드를 사용해서 길이를 구한디 -4를 한다.

3. length-4만큼 별을 찍는다.

4. 뒤의 숫자는 .substring() 메소드를 이용해서 .substring(length-4)로 마지막 네자리 숫자를 찍어준다.

public class Ex2_1 {
    public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
       String phone_number = scanner.nextLine();
       int length = phone_number.length();
       String answer = "";
       for(int star =0; star<length-4; star++){
           answer += "*";
       }
       answer += phone_number.substring(length-4);
        System.out.println(answer);

    }
}

.substring이란 걸 어제푼 문제에서 배워서 대입을 해봤습니다.

그랬더니...

 

.toCharArray() 메소드란것이 있습니다.

String.valueOf() 

 

10. 행렬의 덧셈

어제부터 약간 뇌가 멍해서

 

 

11. x만큼 간격이 있는 n개의 숫자

x부터 시작해서 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴하라

1. x, x(n), x(n^2), ... , x(n^n-1) 을 리스트로 만들어야 한다.

2. for 문을 사용해서 정의하면 되려나

 

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for(int i=0; i<answer.length; i++){
            answer[i] = (long)x * (i+1);
        }
        return answer;
    }
}

위는 프로그래머스에 제출한 코드이고 인텔리제이로는 아래처럼 작성했습니다.

public class xnincrease {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x = scanner.nextInt();
        int n = scanner.nextInt();

        long[] answer = new long[n];
        for(int i=0; i<answer.length; i++){
         answer[i] =  x * (i+1);
        }
		System.out.println(answer);
    }
}

그랬던이 결과값이 이상하게 나오길래 array 전체 배열의 값을 출력하는 방법을 알아보았습니다.

뭐야이게

import java.util.Arrays; //import하기
import java.util.Scanner;

public class xnincrease {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x = scanner.nextInt();
        int n = scanner.nextInt();

        long[] answer = new long[n];
        for(int i=0; i<answer.length; i++){
         answer[i] =  x * (i+1);
        }
        System.out.println(Arrays.toString(answer)); //Arrays.toString() 메소드 사용

    }
}

Arrays.toString() 메소드를 사용하면 배열의 값을 출력해줍니다.

아래처럼 이쁘게 출력이 되었습니다.

Arrays.toString()

 

 

12. 부족한 금액 계산하기

돈이 얼마나 부족한지 계산하고 부족하지 않다면 0을 return 한다.

1.  다시 탈때 마다 요금이 n배 만큼 올라감 

2. n번 탈때 필요한 돈의 금액 lack = (Price*1+ Price*2+ ... + Price*n) -> for 문 사용 

3. 부족한 돈의 금액 lack - money

4. 안부족하면 return 0;

import java.util.Scanner;

public class lackamout {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int price = scanner.nextInt();
        int money = scanner.nextInt();
        int count = scanner.nextInt();
        long answer;
        int lack = 0;
        
        for(int i=0; i<=count; i++){
            lack += price*i;
        }
        
        if (money>lack){
            answer=0;
        } else{
            answer = lack-money;
        }
        System.out.println(answer);
    }
}

 

생각보다 술술 풀려서 놀랐습니다. 

역시나.. 이유가 있었습니다.

왜 실패했을까요..?

실패????

뭐지 했는데 다시 돌려보니까 통과가 되었습니다....

쉬운게 맞았군요!

오늘부터 다시 주특기 언어 주차로 돌아가서 자바 공부를 합니다. 다음주까지 알고리즘 문제 28개를 풀고 과제를 제출하고 알고리즘 시험을 통과해야 합니다. 새로운 조로 배정이 되었는데 저는 자바 걷기반을 선택했습니다. 시간이 생각보다 훅훅 지나가네요. 

 

🎼오늘의 노래 서인국 애기야

 

사랑스러운 자바

 

IntelliJ 단축키 모음

  • 코드 라인 복사해서 다음 라인에 붙이기: Command + D
  • System.out.println : sout
  • 라인 삭제: Command + Backspace
  • Column selection mode (블럭단위 편집, 세로편집 모드 전환) : Command + Shift + 8
  • 파일 찾기: Command + Shift + O
  • 클릭한 메서드로 이동: Command + 클릭
  • 이전/다음 시점으로 이동: Command + Option + 화살표(좌, 우)
  • 단어 단위 이동: Option + 화살표(좌, 우)
  • 파라미터 변수 확인: Command + P
  • 변수 추출: Command + Option + V
  • 이전 클래스 확인: Command + E
  • 해당 테스트 실행: Control + Shift + R
  • 해당 테스트 디버깅 실행: Control + Shift + R
  • 최근 실행했던 테스트 실행: Control + R
  • 최근 실행했던 테스트 디버깅 실행: Control + D
  • 해당 코드 라인 마치고 다음 라인으로 이동: Command + Shift + Enter
  • 테스트 클래스 생성/이동: Command + Shift + T
  • import 하기: Option + Enter
  • 쓰지 않는 import 정리 하기: Control + Option + O
  • 자동 완성: Control + Space
  • 메서드 생성 및 수정: Option + Enter
  • 주석: Command + /
  • 문법 단위로 코드 이동: Command + Shift + 화살표(상, 하)
  • 한줄 단위로 코드 이동: Option + Shift + 화살표(상, 하)
  • 생성자/Getter/Setter/toString 만들기: Control + Enter
  • 해당 메서드를 사용하는 곳 조회: Option + F7

 

프로그래머스 문제 Java

3.  가운데 글자 구하기

길이를 구해서 중간 글자를 출력 합니다.

 

  1. .length() 메소드를 이용해서 String s의 길이 값을 구한다.
  2. int length = s.length();
  3. 2로 나눈 값의 나머지가 0인 경우는 짝수 -> (length%2==0)
  4. 짝수인 경우, 중간 문자 2개가 answer가 된다. int 이기 때문에 자동으로 소수점 이하 값은 없애버림
  5. 예시. String s = cute; int length =4; 4%2 ==0; 짝수
  6. .charAt() 메소드를 이용해서 x 번째 문자의 값을 구한다
  7. 짝수인 경우 가운데 두글자
  8. 홀수인 경우 가운데 한글자
public class Ex2_1 {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String answer = "";
        int length = s.length();
        if(length%2==0){
            answer+= s.charAt(length/2-1);
            answer+= s.charAt(length/2);
        }else{
            answer+= s.charAt(length/2);
        }
        System.out.println(answer);


    }
}

제출하고 통과는 했으나....

한줄 짜리 코드로도 가능했던 것이었던 것이었습니다.

substring()

.substring 메소드를 이용하는 방법

.substring(start letter, end letter)

시작하는 글자, 끝나는 글자 순번을 넣어주면 됩니다.

.substring(start letter)

시작하는 글자 부터 끝까지 출력합니다. 

 

4. 정수의 합 구하기

a와 b 사이의 숫자를 모두 더한 값을 구하는 문제입니다.

 

  1. a와 b 중 큰 값을 long max, 작은 값을 long min 으로 정의한다.
  2. for문의 초기값을 min, 최대값을 max, 증가연산자 일 때 합을 구한다
public class Ex2_1 {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        long answer =0;
        long min = Math.min(a,b);
        long max = Math.max(a,b);
        for (long x=min; x<=max;x++){
            answer += x;
        }
        System.out.print(answer);


    }
}

이렇게 열심히 했는데....

sumAtoB라는 함수가 있었습니다..

sumAtoB() 는 A와 B 사이의 값을 구합니다. 

sumAtoB()

 

5. 문자열을 정수로 전환하기

public class Ex2_1 {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
        int answer = 0;
        String s = scanner.nextLine();
        answer = Integer.parseInt(s);
        System.out.println(answer);

    }
}

되게 간단하다고 생각을 했었습니다만....

마! 이게 알고리즘이다

 

6. 없는 숫자 더하기

말그대로 없는 숫자를 더해야 합니다.

 

function solution(numbers) {
  let answer = 0;
   
  for(let i = 0; i <= 9; i++) {
    if(!numbers.includes(i)) answer += i;
  }
   
  return answer;
}

0부터 9까지 숫자가 있는데 없으면 그 수를 더한다.

!변수.includes() 메소드를 사용한다. ! == not

 

1. 다음 코드를 실행하면 출력 결과로 5를 기대했는데 4가 출력되었습니다. 어디에서 잘못 작성된 것일까요?

int var1=5;
int var2=2;
double var3=var1/var2;
int var4=(int)(var3*var2);
System.out.println(var4);

 

-> var 3 출력 값은 int type 변수이기 때문에 5/2 = 2.5 가 아니고 소수점이 사라져서 2가 된다. var3를 double type 으로 설정했기 때문에 2.0이 나온다.

 

2.5 값이 출력 되기를 원했다면 앞에 (double) 을 적어준다. 

double var3 = (double) var1/var2

line 4는 2*2 이기 때문에 마지막 int var4의 출력 값은 4가 된다.

 

 

2. 다음 코드를 실행했을 때 출력 결과는 무엇입니까? (증감연산자에 대해 알아보세요!)

int x=10;
int y=20;
int z = (++x) + (y--);
System.out.println(z);

-> 증감연산자(++,--0)가 값의 앞에 오면 증감연산자를 실행하고 나서 연산이 실행이 되고 뒤에 오면 연산을 실행한 후 다음식에서 증감연산자가 실행이 된다.

 

따라서, line3의 ++x == 11, y-- ==20 이기 때문에 int z == 31 이다.

 

3. while문과 Math.random() 메소드를 이용해서 2개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력하고, 눈의 합이 5가 아니면 계속 주사위를 던지고, 눈의 합이 5이면 실행을 멈추는 코드를 작성해보세요. 눈의 합이 5가 되는 조합은 (1,4), (4,1), (2,3), (3,2)입니다.

-> 주사위 하나의 랜덤 값을 구하기 위한 수식은 아래와 같다.

int num = (int) (Math.random()*6)+1;

 

public class Ex2_1 {
    public static void main(String[] args) {
        System.out.println("시작!");
        while (true) {
            int num1 = (int) (Math.random() * 6) + 1;
            int num2 = (int) (Math.random() * 6) + 1;
            System.out.println("("+ num1 +","+ num2+")");
            if ((num1 + num2) == 5) {
                break;
            }
        }
        System.out.println("끝");
    }
}

while문을 사용해서 조건문을 사용하였다.

주사위 두개의 합 (num1 +num2)이 5가 되면 while 문이 실행을 멈추고 조건문을 블락을 벗어난다.

 

출력해본 값은 아래와 같다.

시작!
(4,5)
(3,4)
(1,1)
(4,2)
(1,6)
(6,3)
(5,1)
(4,2)
(3,6)
(5,1)
(1,2)
(1,5)
(1,3)
(3,1)
(2,6)
(1,5)
(5,1)
(6,6)
(4,4)
(6,3)
(1,6)
(2,2)
(5,2)
(5,1)
(3,1)
(5,3)
(4,5)
(5,5)
(1,4)

 

생각보다 길다.

 

 

과제 끝!

 

 

+ Recent posts