관리 메뉴

제뉴어리의 모든것

[Section1][JAVA] 기초 - 2 본문

코드스테이츠/정리 블로깅

[Section1][JAVA] 기초 - 2

제뉴어리맨 2022. 7. 5. 21:24

유의깊게 봤던 조건문 문제 

1. isEitherEvenAndLessThan9

문제

두 개 수를 입력받아 아래의 2가지 조건을 모두 만족하는지 검사합니다.

  1. EitherEven: 적어도 하나의 수는 짝수이다.
  2. LessThan9: 두 수 모두 9보다 작다.

입력

인자 1 : num1

  • int 타입의 정수 (num1 >= 0)

인자 2 : num2

  • int 타입의 정수 (num2 >= 0)

출력

  • boolean 타입을 리턴해야 합니다.

입출력 예시

1
2
3
4
5
boolean output = isEitherEvenAndLessThan9(2, 4);
System.out.println(output); // --> true

output = isEitherEvenAndLessThan9(72, 2);
System.out.println(output); // --> false

 

결과

 

  • 기존코드 
package com.codestates.coplit; 

public class Solution { 
	public boolean isEitherEvenAndLessThan9(int num1, int num2) {

		boolean result = false;
		if(num1 % 2 == 0 || num2 % 2 == 0)
		{
			if(num1 < 9 && num2 < 9)
			{
				result = true;
			}
		}

		return result;
	} 
}

 

  • 수정코드 
package com.codestates.coplit; 

public class Solution { 
	public boolean isEitherEvenAndLessThan9(int num1, int num2) {
    // TODO:
		return ((num1 < 9 && num2 < 9) && (num1 % 2 == 0 || num2 % 2 == 0));
	} 
}

소감

기존 코드에 비해 수정 코드가 더 간결해 보이는 효과가 있다.

 

 

 

 

2. convertScoreToGradeWithPlusAndMinus

문제

점수를 입력받아 점수에 해당하는 등급을 리턴해야 합니다.

입력

인자 1 : score

  • int 타입의 정수

출력

  • String 타입을 리턴해야 합니다.
  • 각 등급의 최저 점수는 아래와 같습니다. ("F"의 경우 최대 점수를 표기)
  • 90 이상 --> "A"
  • 80 이상 --> "B"
  • 70 이상 --> "C"
  • 60 이상 --> "D"
  • 60 미만 --> "F"

주의 사항

  • 만약 주어진 점수가 100을 초과하거나 0 미만인 경우, 문자열 "INVALID SCORE"를 리턴해야 합니다.
  • 각 등급의 최고 점수보다 7점 이하인 경우, 등급과 함께 "-"를 리턴해야 합니다. (단, 93점의 경우에는 A를 리턴해야 합니다.)
  • 각 등급의 최저 점수보다 8점 이상인 경우, 등급과 함께 "+"를 리턴해야 합니다.
  • F+ 와 F- 는 존재하지 않습니다.

입출력 예시

1
2
String output = convertScoreToGradeWithPlusAndMinus(91);
System.out.println(output); // --> "A-"

 

결과

  • 수정 코드
package com.codestates.coplit; 

public class Solution { 
	public String convertScoreToGradeWithPlusAndMinus(int score) {
    // TODO:
    if(score > 100 || score < 0) return "INVALID SCORE";
    if(score == 100)
    return "A+";

    String result = "";

    if(score >= 90)
    result += "A";
    else if(score >= 80)
    result += "B";
    else if(score >= 70)
    result += "C";
    else if(score >= 60)
    result += "D";
    else
    return "F";

    if(score % 10 <= 2)
    result += "-";
    else if(score % 10 >= 8)
    result += "+";

    return result;
	} 
}

 

소감

알고리즘을 짤때 생각해야 하는 순서를 기억하자.

1. 어떤 입력값으로 어떤 결과값을 출력 해야하는지 생각하기

2. 디테일한 예외사항을 제외한 기본적인 로직이 어떻게 되야하는지

3. 예외사항은 정확히 어떤 범위에 있는것이 예외사항인지를 인지하자

4. 기본 로직을 짜보고 현재 로직에서 예외사항들을 하나하나 고민해 가면 조건을 추가하여 보자

 

 

3. listPrimes

문제

2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 합니다.

입력

인자 1 : num

  • int 타입의 정수 (num >= 2)

출력

  • String 타입을 리턴해야 합니다.
  • 2-3-5-7의 형식으로 리턴해야 합니다.

주의 사항

  • 이중 반복문(double for loop)을 사용해야 합니다.

입출력 예시

1
2
3
4
5
6
7
8
String output = listPrimes(2);
System.out.println(output); // --> '2'

output = listPrimes(6);
System.out.println(output); // --> '2-3-5'

output = listPrimes(18);
System.out.println(output); // --> '2-3-5-7-11-13-17'

힌트

  • 반복문의 break 문에 대해서 학습합니다. (java loop break)

결과

  • 기존 코드
package com.codestates.coplit; 

public class Solution { 
	public String listPrimes(int num) {
    // TODO:
		StringBuffer result = new StringBuffer();
		for(int i = 2; i <= num; i++)
		{
			boolean prime = true;
			for(int j = 2; j < i; j++)
			{
				if(i % j == 0)
				{
					prime = false;
					break;
				}
			}

			if(prime)
			result.append(Integer.toString(i) + "-");
		}

		return result.deleteCharAt(result.length() -1).toString();
	} 
}

 

  • 참고 코드
package com.codestates.coplit; 

public class Solution { 
	public String listPrimes(int num) {
    String result = "2";
		for (int candi = 3; candi <= num; candi += 2) {
			boolean isPrime = true;
			int sqrt = (int) Math.sqrt(candi);
			for (int divider = 3; divider <= sqrt; divider += 2) {
				if (candi % divider == 0) {
					isPrime = false;
					break;
				}
			}

			if (isPrime) {
				result = result + "-" + candi;
			}
		}

		return result;
	} 
}

소감

일단, 처음에 짠 소스는 빠른 통과를 위해 일단 되는대로 짜보았다...

어쨋든 첫번째 소스에서 그래도 나름 유용한 점은

두번째 for문에서 if에서 i값이 특정 j값으로 나누어지는 순간 그 수는 소수가 아니므로 해당 for문을 나오고

바로 첫번째 for의 증감식, 조건식으로 넘어가고 싶었다.

그러나 for문에 라벨을 붙이는 방법밖에 떠오르지 않았고, 그 방법은 편법같은 느낌이 들기에 그 방법을 쓰지 않는 방법을 생각해 보았으나 문득 떠오르지 않았고 타 소스를 참고 하던중 break로 두번째 for문을 끝내되 break에 인한 것임을 인지 하기 위해 boolean 변수에 체크를 하여 소수 여부를 확인하였다.

참고 소스는 제곱근까지만 해주는것이 인상적이다.