별찍기 문제풀이, 메소드

calis_ws·2023년 5월 8일
0
post-custom-banner

별찍기

별찍기 하는 이유 : 제어문( for, if ) 연습에 좋다.
실전에서는 안쓰지만 '에라토스테네스의 체' 할 때 도움이 됨

별 출력하기
https://codeup.kr/problem.php?id=1256

구구단을 별로 출력하기
https://codeup.kr/problem.php?id=1287

별 계단 만들기
https://codeup.kr/problem.php?id=1361

평행사변형 출력하기 1
https://codeup.kr/problem.php?id=1367

직각 삼각형 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/120823

피라미드 출력하기

  • 4주차 1일 수업로그

.repeat( ) 함수

문자열을 반복하는 메소드 중 하나로, for문의 복잡함을 줄여주는 유용한 기능을 가지고 있다. (Java 11 부터 추가)

String str = "abc ";

System.out.println(str.repeat(6));
	/*
	결과
	abc abc abc abc abc abc
	*/

주의할 점

파라미터 위치에 음수일 경우 'IllegalArgumentException' 발생
파라미터를 지나치게 크게 준 경우 'OutOfMemoryError' 발생

BufferedWriter

대용량 데이터 처리에 유용하다.

public class StairsStar {
   public static void main(String[] args) throws IOException {
       int height = 5;

       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
       for (int i = 0; i < height; i++) {
           for (int j = 0; j < i; j++) bw.append(" ");
           bw.append("**\n");
       }
       bw.flush();
       bw.close();
   }
}

메소드

메소드란?

클래스는 상태와 동작(기능)을 가지고 있는데 상태에 해당 하는 것이
'멤버변수'이고, '동작'에 해당하는 것이 메소드이다.

만드는 이유?

메소드를 만들지 않고는 복잡한 기능을 만들 수 없을 뿐더러 개발의 시간소요가 많이 되기 때문이다.

화면 분할

Shift + Enter

클래스, Test클래스를 한눈에 보기

  1. SpaceInvaders 클래스는 main method가 없기 때문에 실행할 수 없다.

  2. 멤버변수와 메소드는 이름 뒤에 괄호의 유무로 구별 할 수 있다.

  • 멤버변수 : 괄호 X
  • 메소드 : 괄호 O
  1. 메소드는 클래스를 new 인스턴스화를 시켜야 사용이 가능하다.
    SpaceInvaders si = new SpaceInvaders();
    // 마치 몬스터볼에 있는 포켓몬을 꺼내야만 사용이 가능한 것과 비슷하다.

Test Class 만드는 법

Alt + Enter → Create Test

멤버변수와 연계

public class User {
    String name;
    String phoneNumber; // 010~ -> 0 안나옴
    int age;
							// 멤버 변수 3개
    boolean isAdult() { 	// isAdult 메소드 1개
        return age >= 18;
    }
}
class UserTest {
    public static void main(String[] args) {
        User user1 = new User();		// 객체1 생성
        user1.name = "김미미";
        user1.age = 14;

        User user2 = new User();		// 객체2 생성
        user2.name = "김나나";
        user2.age = 37;

        System.out.printf("%s는 어른인지? %b\n", user1.name, user1.isAdult());
        System.out.printf("%s는 어른인지? %b\n", user2.name, user2.isAdult());
    }

}

메소드의 구성요소

접근제어자 : 메소드를 호출 할 수 있는 범위

메소드 뿐 아니라 클래스와 변수에도 적용된다.

사용 가능 범위

항상 public 쓰면 안됨?

복잡한 개발 과정에서 접근제어자는 예측 가능성과 프로그램의 신뢰성을 높여주기 때문에 상황에 맞게 적용해 주어야한다.

리턴타입 : 메소드를 실행한 결과의 타입

변수명과 같이 메소드를 만들 때는 '무조건' 써야한다.

단순히 출력하고 메소드가 끝나는 경우엔 리턴타입이 필요없다.
그럴 때는 'void' 를 써준다. (변수 저장 불가능, 호출만 가능)

public class VariousReturnType {
    public boolean isAdult() {
        return true;
    }

    public int plus() {
        return 1 + 1;
    }

    public User getUser() {
        return new User();
    }

    public void printHello() {
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        VariousReturnType vrt = new VariousReturnType();
        boolean isAdult = vrt.isAdult();
        int plusResult = vrt.plus();
        User user = vrt.getUser();
        vrt.printHello();
    }
}

메소드명 : 메소드의 이름

'동작'이기 때문에 '동사'로 자주 짓는다. + Camle Case

isAdult, getUser, printHello ...

리턴(Return) : 메소드를 호출한 곳으로 연산 결과를 '돌려준다'

public class Account {
    int balance = 2000;
    public boolean isSufficient() {
        return balance >= 1500;
    }
}
public class Payment {
    public static void main(String[] args) {
        Account account = new Account();
        boolean isSufficient = account.isSufficient();
        if (isSufficient) {
            System.out.println("결제 처리 합니다.");
        } else {
            System.out.println("잔액이 부족합니다 재생.");
        }
    }
}

매개변수(Parameter)

메소드를 선언 하면서 ( ) 안에 추가한다.

1. Calculator클래스가 Heap영역에 인스턴스로 생성 됩니다.
2. Static영역에 있는 main()메소드에서 calculator.printPlusOne(30)이 실행될 때 
   30을 전달 합니다.
3. 30printPlusOne(int num)으로 전달 됩니다.
4. .printPlusOne(int num)으로 전달된 30System.out.println(num + 1);로 
   전달됩니다.
5. 1002 ~ 4과정을 통해 실행됩니다.
6. 3502 ~ 4과정을 통해 실행 됩니다.

강사님이 내주신 돌발 심화 문제

약수의 합을 구하는 메소드 만들기

public class MutsaMath {
    // 약수의 합을 리턴하는 메소드
    int sumOfFactors(int num) {
        // num % i == 0 이면 약수
        int answer = 1;
        for (int i = 2; i <= num; i++) {
            if (num % i == 0) answer += i;
        }
        return answer;
    }

    void printResult(int num) {
        System.out.printf("%d의 약수의 합은 %d입니다.\n", num, sumOfFactors(num));
    }

    public static void main(String[] args) {
        MutsaMath mutsaMath = new MutsaMath();
        mutsaMath.printResult(12);
        mutsaMath.printResult(36);
        mutsaMath.printResult(48);
        mutsaMath.printResult(29);
    }
}

Codeup1671 가위바위보 메소드 만들기

public class RockPaperScissors {
    // win, tie, lose
    public String play(int user, int computer) { // 매개변수 2개, String 타입
        // 0바위 1가위 2보
        if (user == 0 && computer == 1) {
            return "win";
        } else if (user == 1 && computer == 2) {
            return "win";
        } else if (user == 2 && computer == 0) {
            return "win";
        } else if (user == computer) {
            return "tie";
        } else {
            return "lose";
        }
    }
    public static void main(String[] args) {
        RockPaperScissors rpc = new RockPaperScissors();
        System.out.println(rpc.play(0, 1));		// win
        System.out.println(rpc.play(2, 2));		// tie
        System.out.println(rpc.play(2, 1));		// lose
    }
}

Main 메소드(psvm)

구성요소

기억 할 것

main( ) → Static영역
new 한 Class → Heap영역

String[ ] Args 출력하기

입력된 값들을 문자열 형태의 배열[ ]에 넣어주는 것이 역할이다.
프로그램 실행 시 설정값들을 넘길 때 주로 사용된다.

import java.util.Arrays;

public class ArgsPrinter {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
    }		// [] 가 출력된다.
}

‘Program arugments’ 에 전달할 값을 입력할 수 있다.

[ ] 안에 Hello 가 출력된다.

< java를 공부하면서 가장 헷갈리는 것 >

  • method 호출 할 때 안되는 것
  • new를 해야만 호출 되는 것

인사이트 타임

x 사이의 개수 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/181867

class Solution {
    public int[] solution(String myString) {
        String[] str = myString.split("x", -1);
        int[] answer = new int[str.length];
        for (int i = 0; i < str.length; i++) {
            if (str[i] != "x") {
                answer[i] = str[i].length();
            }
        }
        return answer;
    }
}

제한 시간안에 풀지는 못 했지만 정말 아쉽게 예제 문제만 맞고 다 틀렸다.

팀원끼리 코드를 서로 피드백 해보다가 태환님께서 알려주신 split의 limit 범위 실수로 틀린걸 깨닫고 10에서 -1로 수정했더니 바로 정답처리 받았다!!

review

별찍기 문제들은 반복문의 로직의 이해가 어려웠다. 별이 나오는 위치와 공백이 나오는 위치를 확실하게 이해하고 다시 풀어 봐야겠다.

repeat 함수를 처음 배웠다. 알아두면 유용하게 사용 할 수 있을 것 같다.

메소드를 공부하긴 했었지만 코드를 분리해서 작성하는게 아직 익숙하지가 않아서 낯설게 느껴진다.
굳이 이렇게 해야하나? 싶지만 쓰는 이유가 확실하기 때문에 쓰겠지

지금은 느낄 수 없지만 언젠가 메소드가 익숙할 그 날을 기다리며 연습을 많이 해야겠다.

회고팀에서 문제 하나를 고른 다음 30분 ~ 1시간 가량 풀이하고 피드백 시간을 가지는데 오늘의 첫 문제는 프로그래머스의 x 사이의 개수 구하는 문제였다.

솔직히 최근에 멘탈이 많이 상해서 조금만 어렵다 싶으면 시도조차 해보기 싫었는데 오늘 한 번 풀어보자 다짐하고 집중해서 풀어 보았다. 아쉽게 모르는 실수 하나 차이로 틀렸지만 덕분에 모르는걸 알게 되는 너무나도 값진 시간이었다.
아주 만족스러웠다. 우리팀 짱!!!

profile
반갑습니다람지
post-custom-banner

0개의 댓글