Skip to main content

Command Palette

Search for a command to run...

[코드트리 조별과제] 1주차 ~ 3주차

Updated
•9 min read•View as Markdown
[코드트리 조별과제] 1주차 ~ 3주차

😮😮😮 완전 럭키비키잖아??? 🍀🍀🍀

코드트리에서 NL 문제를 풀며 많은 도움을 받았었는데 어느 날 사이트를 들어가 보니 방학 조별 과제 이벤트가 보였다!

코드트리 NL 다 풀고 다음 커리큘럼을 가격 때문에 고민했던 지난날… 열심히 문제만 풀어도 8월 25일까지 무료라고??? 완전 럭키비키잖아?? 당장 진행시켜!!

하지만 자격증 시험이 바로 코앞이라 3주 차부터 참여하게 되었다. 3주 차에 시작이라도 앞으로 4주 동안 문제를 풀 수 있으니 앞으로의 여정을 기록해 보겠다.

나는 앞서 Novice Low 단계를 완료했기 때문에 그다음 단계인 Novice Mid 단계를 학습할 것이다.

[문제풀이]

[함수] - 값을 반환하지 않는 함수

여러 번 반복되는 일은 하나의 함수로 정의하여 필요할 때마다 호출해 준다면 코드를 효율적으로 작성할 수 있다.

// 자바에서 함수 정의하는 법
public static void print5Stars() {
    // 함수 호출 시 실행할 코드
}

static의 경우 Java의 기본 골격인 main 함수가 static으로 정의되어 있기 때문에 꼭 함수 선언 시 static을 적어줘야 함에 유의한다. → 객체 선언하지 않고 바로 main 함수에서 사용하기 위해 static 함수로 정의할 것이다.

  • 값을 반환하지 않는 함수를 정의할 것이기 때문에 리턴 타입을 void 라고 작성한다.

  • 함수명도 변수명과 같이 camel case 로 작성한다.

예를 들어 별 10개 찍는것을 반복해야만 하는 일을 함수로 정의한다면

public class Main {

    public static void printStar() { // 별을 10개찍는 함수
        for (int i = 0; i < 10; i++) {
            System.out.print("*");
        }
        System.out.println();
       }

    public static void main(String[] args) {
       for (int i = 0; i < 5; i++) {
        printStar();  // 함수를 호출.
       }
    }
}

이제 이 함수에 매개변수를 넣어서 반복 횟수를 필요에 따라 설정할 수 있도록 해보자.

public static void printNLines(int n) { // int 타입의 변수 n
   // 코드 작성
}
  • 함수를 정의할 때 사용하는 변수는 매개변수라고 한다. 매개변수는 변수 타입 변수 이름 으로 작성한다.

  • 함수를 호출할 때 넘기는 변수는 인자라고 한다.

import java.util.Scanner;

public class Main {

    public static void printStar(int n) { // 인자를 받아 반복횟수에 사용하는 함수
        for (int i = 0; i < n; i++) {
            System.out.println("12345^&*()_");
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
        printStar(input);  // 사용자로부터 입력받은 입력값을 인자로 넘겨준다.
    }
}

인자를 2개 넘겨서 반복되는 문장의 수와 반복되는 줄의 수를 사용자의 입력을 받아 함수를 정의 및 호출해 보자.

import java.util.Scanner;

public class Main {

    public static void printOne(int n, int m) {
        for (int i = 0; i < n; i++) {      // 행
            for (int j = 0; j < m; j++) {  // 열
                System.out.print("1");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();

        printOne(n,m); // 사용자의 입력값을 2개 넘긴다.
    }
}
import java.util.Scanner;

public class Main {

    public static void printNum(int n) {
        int cnt = 1;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (cnt > 9) {
                    cnt = 1;
                }
                System.out.print(cnt++ + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int input = sc.nextInt();

        printNum(input);
    }
}
  • 최대공약수 구하기
import java.util.Scanner;

public class Main {

    public static void gcd(int n, int m) {
        int gcdNum = 0; 
        for (int i = 1; i <= 100; i++) {
            if (n % i == 0 && m % i == 0){
                gcdNum = i;
            }
        }
        System.out.print(gcdNum);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();

        gcd(n,m);
    }
}

나는 n과 m 의 입력 범위가 100 이하인 것을 보고 이렇게 반복 횟수를 위와 같이 설정했지만 사실 최대공약수는 두 수들의 약수 중 공통된 약수의 최댓값을 의미한다. 공통된 약수는 두 수 중 더 작은 수보다 큰 수가 공통된 약수가 될 수 없기 때문에 아래와 같이 두 수 중 가장 작은 수까지 반복 조건을 걸어두면 1부터 100까지 모든 입력받은 수를 반복할 필요가 없어진다.

public static void findGcd(int n, int m) {
        int gcd = 0;
        for(int i = 1; i <= **Math.min(n, m)**; i++) {
            if(n % i == 0 && m % i == 0)
                gcd = i;
        }

        System.out.print(gcd);
    }
  • 최소공배수 구하기

  • 최소공배수 = x * y / x와 y의최대공약수

앞에서 했던 최대공약수의 식을 가져와서 할 수 있다.

import java.util.Scanner;

public class Main {

    public static void lcm(int n, int m) {
        int gcdNum = 0; 
        for (int i = 1; i <= 100; i++) {  // 최대공약수 구하기  
            if (n % i == 0 && m % i == 0){
                gcdNum = i;
            }
        }
        int lcmNum = n * m / gcdNum;
        System.out.print(lcmNum);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();

        lcm(n,m);
    }
}

다음 카테고리인 반환 값이 있는 함수에 최대공약수의 함수를 반환하는 함수를 정의한 뒤에 최소공배수를 구하는 함수에 최대공약수 함수를 호출하여 구한다면 간단히 처리할 수 있다.

[함수] - 값을 반환하는 함수

반환값이 없을 때는 리턴타입을 void 라고 작성했지만 반환값이 있을때는 리턴 타입을 작성해줘야 한다.

또한, 함수 내에서 값을 반환하는 경우 return 이라는 키워드를 사용해야 한다.

예 ) 두 정수 값을 인자로 받아 두 숫자의 합을 반환하는 함수

public static int add(int a, int b) { // 리턴타입은 int
    return a + b;
}

위 함수는 반환 값은 정수이므로 함수 이름 앞에 반환 타입 int가 붙은 int add(...) 형태의 함수이며, 두 수 a, b의 합을 반환해야 하므로 return a + b; 를 작성.

import java.util.Scanner;

public class Main {
    public static int add(int a, int b) {
        return a + b;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();

        int totalNum = add(num1, num2);  // 함수를 호출하면 int 타입의 값이 반환된다.
        System.out.println(totalNum);
    }
}

>> 3 5

8
import java.util.Scanner;

public class Main {

    public static int sum(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        return sum / 10;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        System.out.print(sum(n));
    }
}
import java.util.Scanner;

public class Main {

    public static int min(int a, int b, int c) {
        int minNum = a > b ? (b > c ? c : b ) : (a > c ? c : a);
        return minNum;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        System.out.print(min(a, b, c));
    }
}
  • boolean 타입의 반환타입을 가진 함수 이용하기.

이 예에서는 isMagicNumber 함수가 인자를 하나 받아, 해당 숫자가 특별한 숫자인지 / 아닌지를 판별하는 함수이므로 boolean type인 True / False 중 하나를 반환하는 함수를 정의해주면 된다.

public class Main {
    public static boolean isMagicNumber(int n) {
        return n % 3 != 0 && n % 5 == 0;
    }

    public static void main(String[] args) {
        int cnt = 0;
        for(int i = 1; i <= 100; i++)
            if(isMagicNumber(i))
                cnt++;

        System.out.println(cnt);
    }
}

>> 14
import java.util.Scanner;

public class Main {

    public static boolean yesNo(int n) {
        int sum = (n / 10) + (n % 10);
        return n % 2 == 0 && sum % 5 == 0;  // 여기서 한번에 할수도 있지만 가독성을 위해
    } 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        if (yesNo(n)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
}

입력되는 수가 두자리 수이기 때문에 주어진 n을 10으로 / 면 몫만 남기 때문에 10의 자리만 얻을 수 있고 n을 10으로 % 하면 10으로 나눈 나머지가 남기 때문에 1의 자리만 얻을 수 있다.

  • 두 자리수보다 더 큰 자리수가 나와도 이런식으로 맨 마지막 자리의 숫자를 잘라서 사용하는 문제에 응용할 수 있다.

  • 함수에서 다른 함수 호출하기

import java.util.Scanner;

public class Main {
    public static boolean exist369(int n) {
        while(n != 0){
            if (n % 10 == 3 || n % 10 == 6 || n % 10 == 9) {
                return true;
            }
            n /= 10;
        }
        return false;
    }

    public static boolean multiple3(int n) {

        return n % 3 == 0 || exist369(n);  // exist369() 호출
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();

        int cnt = 0;
        for (int i = a; i <= b; i++) {
            if (multiple3(i)) {   // multiple3() 호출
                cnt++;
            }
        }
        System.out.print(cnt);
    }
}

함수는 아직 함수 내에 있는 모든 코드를 수행하지 못했더라도 return 을 만나게 되면 그 즉시 종료

  • a와 b 사이의 소수의 합
import java.util.Scanner;

public class Main {

    public static boolean isPrime(int n) {
        if (n == 1) {
            return false;
        }
        for(int i = 2; i < n; i++)
            if(n % i == 0) {
                return false;
            }

        return true;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();
        int sum = 0;

        for (int i = a; i <= b; i++) {
            if(isPrime(i)){
                sum += i;
            }
        }
        System.out.print(sum);
    }
}
  • 온전수

    • 2로 나누어 떨어지는 경우

    • 일의 자리가 5인 경우

    • 3으로 나누어 떨어지면서 9로는 나누어 떨어지지 않는 수

if (n % 2 == 0 || n % 10 == 5 || (n % 3 == 0 && n % 9 != 0)) {
            return false;
        }
        return true;

public static boolean isOnjeonsu(int n) {
    if(n % 2 == 0)
        return false;
    if(n % 10 == 5)
        return false;
    if(n % 3 == 0 && n % 9 != 0)
        return false;
    return true;
}
  • 윤년구하기
import java.util.Scanner;

public class Main {

    public static boolean leapYear(int n) {
        if (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0)){
            return true;
        }
        return false;      
    }

    public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);

       int year = sc.nextInt();

       if (leapYear(year)){
        System.out.print("true");
       } else {
        System.out.print("false");
       }
    }
}
  • 해설에서는 함수의 return 특성을 이용해서 여러개의 if 문을 사용하였다.
function leap_year(y)
    // 4의 배수가 아니라면 윤년이 확실히 아닙니다.
    if y % 4 != 0
        return false

    // 여기까지 온 이상 4의 배수임을 가정해도 됩니다.
    // 그 중 100의 배수가 아니라면 확실히 윤년입니다.
    if y % 100 != 0
        return true

    // 여기까지 온 이상 100의 배수임을 가정해도 됩니다.
    // 그 중 400의 배수라면 확실히 윤년입니다.
    if y % 400 == 0
        return true

    // 여기까지 온 이상 100의 배수이지만, 400의 배수가 아닙니다.
    // 따라서 확실히 윤년이 아닙니다.
    return false
  • 거듭제곱 : 반복해서 그 수를 곱해주면 된다.
import java.util.Scanner;

public class Main {

    public static int invol(int a, int b) {
        int num = 1;
        for (int i = 0; i < b; i++) {
            num *= a;
        }
        return num;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();

        System.out.print(invol(a, b));
    }
}

문제가 복잡하다면? 😉

💡
큰 단위의 코드를 먼저 작성해놓고, 그다음 필요한 함수를 만들어 구현해 주면 가독성 측면에서도 좋고 코드 작성 시 발생하는 실수 역시 많이 줄일 수 있다.

More from this blog

[혼공후기] 재밌으면서도 알찼던 6주! 14기 활동 회고

매번 혼공 학습단을 신청해 봐야겠다고 했지만 기간 놓쳐버리기…또는 너무 바쁜 나머지 완주 못할 것 같아서 포기하다가 때마침 공부가 필요한 시기에 시간이 나서 신청하게 되었다. 공부할 새 책도 배송이 오고 완주할 생각에 기대감 상승. (+중간에 간식 먹을 생각) 참고할 수 있는 강의 영상이 있기 때문에 영상강의 보면서 책 필기 및 정리 이해한 내용을 바탕으로 블로그 정리 이런 방식으로 공부를 했다. 사실 하루에 조금씩 공부했으면 적당한 ...

Aug 23, 20252 min read

[혼공컴운] 6주차_책 한 권을 끝내다니(Ch 14~ 15)

14-1) 연속 메모리 할당 연속 메모리 할당 : 프로세스에 연속적인 메모리 공간을 할당하는 방식 스와핑 : 메모리상의 빈 공간에 또 다른 프로세스를 적재하여 실행하는 방식 스왑 영역 : 프로세스들이 쫓겨나는 보조기억장치의 일부 영역 스왑 아웃 : 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것 스왑 인 : 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것 → 스와핑을 이용하면 프로세스들이 요구하는 메모...

Aug 16, 20259 min read
[혼공컴운] 6주차_책 한 권을 끝내다니(Ch 14~ 15)

[혼공컴운] 5주차_끝이 보인다(Ch 12 ~ 13)

12-1) 동기화란 동시다발적으로 실행되는 많은 프로세스는 서로 데이터를 주고받으며 협력하며 실행된다. ⇒ 협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화가 필수 프로세스 동기화 : 프로세스들 사이의 수행 시기를 맞추는 것 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 공유가 불가능한 자원의 동시 사용을 피하...

Aug 9, 20255 min read
[혼공컴운] 5주차_끝이 보인다(Ch 12 ~ 13)

[혼공컴운] 4주차_운영체제 시작(Ch 09 ~ 11)

09-1) 운영체제를 알아야 하는 이유 운영체제 : 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램 (시스템) 자원 : 프로그램 실행에 마땅히 필요한 요소 컴퓨터가 부팅될 때 메모리 내 커널 영역에 적재 사용자 영역 : 사용자가 이용하는 응용 프로그램이 적재되는 영역 ⇒ 메모리 공간에 주소가 겹치지 않게 프로그램 적재해 준 건? 운영체제 실행할 프로그램 메모리에 적재 실행되지 않...

Jul 26, 20257 min read
[혼공컴운] 4주차_운영체제 시작(Ch 09 ~ 11)

[혼공컴운] 3주차_컴퓨터 구조 끝(Ch 06 ~ 08)

06-1) RAM의 특징과 종류 RAM 휘발성 저장 장치 실행할 대상 저장 보조기억장치 비휘발성 저장 장치 보관할 대상 저장 CPU는 보조기억장치에 직접 접근하지 못하고 RAM으로 복사하여 저장한 뒤 실행. RAM 용량이 적으면 보조기억장치에서 실행할 프로그램을 가져오는 일이 잦아 실행 시간이 길어지기 때문에 RAM용량이 충분히 크면 많은 데이터를 가져와 미리 RAM에 저장하여 프로그램들을 동시에 빠르게 실행하는데 유리하다...

Jul 19, 20258 min read
[혼공컴운] 3주차_컴퓨터 구조 끝(Ch 06 ~ 08)
W

WOW's dev archive

42 posts

언젠가 나에게 힘이 될 차곡차곡 쌓은 기록🥰