수박수박수

문제 설명

길이가 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