[코드트리 조별과제] 1주차 ~ 3주차
![[코드트리 조별과제] 1주차 ~ 3주차](https://cdn.hashnode.com/res/hashnode/image/upload/v1722666801410/cc9c0cb9-cb8d-44f3-a56a-3036b1e27ac1.png)
😮😮😮 완전 럭키비키잖아??? 🍀🍀🍀

코드트리에서 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));
}
}
![[혼공컴운] 6주차_책 한 권을 끝내다니(Ch 14~ 15)](https://cdn.hashnode.com/res/hashnode/image/upload/v1755441066842/4d3a042e-e395-4e14-84c2-725aeabc56ed.png)
![[혼공컴운] 5주차_끝이 보인다(Ch 12 ~ 13)](https://cdn.hashnode.com/res/hashnode/image/upload/v1754833767926/85ea771d-0416-409a-82d9-bcc62b92cf17.png)
![[혼공컴운] 4주차_운영체제 시작(Ch 09 ~ 11)](https://cdn.hashnode.com/res/hashnode/image/upload/v1753626546414/943e9f66-8c81-4bac-83b6-5797bd83293c.png)
![[혼공컴운] 3주차_컴퓨터 구조 끝(Ch 06 ~ 08)](https://cdn.hashnode.com/res/hashnode/image/upload/v1753020566648/c2832934-e4d5-45c1-87c8-a1d5f27b2169.png)