안녕하세요!
오늘도 돌아온 코드업 문제 풀기 ㅎㅎ
지난번에 이어서 JAVA를 이용하여 코드업 문제 1061번 ~ 1070번 까지를 풀어볼 거예요
1061 : [기초-비트단위논리연산] 비트단위로 OR 하여 출력하기
< 문제 설명 >
- 입력된 정수 두 개를 비트단위로 or 연산한 후 그 결과를 정수로 출력해보자. 비트단위(bitwise) 연산자 |(or, vertical bar, 버티컬바)를 사용하면 된다.
< 참고 >
- ** | 은 파이프(pipe)연산자라고도 불리는 경우가 있다.
- ** 비트단위(bitwise) 연산자는, ~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor), <<(bitwise left shift), >>(bitwise right shift) 가 있다.
- 예를 들어 3과 5가 입력되었을 때를 살펴보면
3 : 00000000 00000000 00000000 00000011
5 : 00000000 00000000 00000000 00000101
3 | 5 : 00000000 00000000 00000000 00000111
이 된다.
- 비트단위 or 연산은 둘 중 하나라도 1인 자리를 1로 만들어주는 것과 같다.
- 이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서도 효과적으로 사용된다.
- 입력 : 2개의 정수가 공백을 두고 입력된다. -2147483648 ~ +2147483647
ex ) 3 5
- 출력 : 두 정수를 비트단위(bitwise)로 or 계산을 수행한 결과를 10진수로 출력한다.
ex ) 7
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a | b);
}
}
완성된 코드
1062 : [기초-비트단위논리연산] 비트단위로 XOR 하여 출력하기
< 문제 설명 >
- 입력된 정수 두 개를 비트단위로 xor 연산한 후 그 결과를 정수로 출력해보자. 비트단위(bitwise) 연산자 ^(xor, circumflex/caret, 서컴플렉스/카릿)를 사용하면 된다.
< 참고 >
- ** 주의 ^은 수학식에서 거듭제곱(power)을 나타내는 기호와 모양은 같지만, C언어에서는 전혀 다른 배타적 논리합(xor, 서로 다를 때 1)의 의미를 가진다.
- ** 비트단위(bitwise) 연산자는, ~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor), <<(bitwise left shift), >>(bitwise right shift) 가 있다.
- 예를 들어 3과 5가 입력되었을 때를 살펴보면
3 : 00000000 00000000 00000000 00000011
5 : 00000000 00000000 00000000 00000101
3 ^ 5 : 00000000 00000000 00000000 00000110
이 된다.
- 이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서도 효과적으로 사용된다.
- 구체적으로 설명하자면, 두 장의 이미지가 겹쳐졌을 때 색이 서로 다른 부분만 처리할 수 있다. 배경이 되는 그림과 배경 위에서 움직이는 림이 있을 때, 두 그림에서 차이만 골라내 배경 위에서 움직이는 그림의 색으로 바꿔주면 전체 그림을 구성하는 모든 점들의 색을 다시 계산해 입히지 않고 보다 효과적으로 그림을 처리할 수 있게 되는 것이다. 비행기 슈팅게임 등을 상상해보면 된다.
- 입력 : 2개의 정수가 공백을 두고 입력된다. -2147483648 ~ +2147483647
ex ) 3 5
- 출력 : 두 정수를 비트단위(bitwise)로 xor 계산을 수행한 결과를 10진수로 출력한다.
ex ) 6
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a ^ b);
}
}
완성된 코드
1063 : [기초-삼항연산] 두 정수 입력받아 큰 수 출력하기
< 문제 설명 >
- 입력된 두 정수 a, b 중 큰 값을 출력하는 프로그램을 작성해보자. 단, 조건문을 사용하지 않고 3항 연산자 ? 를 사용한다.
< 참고 >
- 3개의 요소로 이루어지는 3항(ternary) 연산자는 "조건식 ? (참일 때의 값) : (거짓일 때의 값)” 의 형태로 사용하는 연산자이다.
- 조건식의 계산 결과가 참인 경우에는 ':' 왼쪽의 값 또는 식으로 바뀌고,
- 거짓인 경우에는 ':' 오른쪽의 값 또는 식으로 바뀐다.
- 예를 들어 123 > 456 ? 0 : 1 과 같은 표현식은 123 > 456 의 비교연산 결과가 거짓이므로 1이 된다.
< 예시 >
- printf("%d", a>b ? a:b); //두 값 중 큰 값이 출력된다.
예시 코드는 a>b 의 결과가 참(1)이면 (a>b ? a:b)의 결과는 a가 되고,
거짓(0)이면 (a>b ? a:b)의 결과는 b가 된다.
- 입력 : 2개의 정수가 공백을 두고 입력된다. -2147483648 ~ +2147483647
ex ) 123 456
- 출력 : 두 정수 중 큰 값을 10진수로 출력한다.
ex ) 456
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a > b ? a : b);
}
}
완성된 코드
1064 : [기초-삼항연산] 정수 3개 입력받아 가장 작은 수 출력하기
< 문제 설명 >
- 입력된 세 정수 a, b, c 중 가장 작은 값을 출력하는 프로그램을 작성해보자. 단, 조건문을 사용하지 않고 3항 연산자 ? 를 사용한다.
< 참고 >
- C언어 소스코드 작성시 모든 요소들은 "순서에 따라 한 단계씩 실행", "미리 정해진 순서에 따라 하나씩 연산 수행", "그 때까지 연산된 결과를 이용해 다시 순서에 따라 하나씩 연산" ... 등의 원리가 적용된다.
따라서 3항 연산자 ? 를 중첩해(괄호로 묶는 등..) 이용하면 여러 값들을 순서대로 비교해 가장 큰/작은 값을 계산할 수 있다.
- 예를 들어 (a>b ? a:b)>c ? (a>b ? a:b):c 의 계산식은 a, b, c 의 값 중 가장 큰 값으로 계산된다.
- 잘 이해가 되지 않는다면 어떤 순서에 따라 계산될지 생각해보고 여러 가지 연산자가 동시에 사용된 식이 있을 때, 어떤 우선순위에 따라 순서대로 계산이 되는지 찾아보도록 한다.
- “연산자 우선순위”를 검색하면 우선순위와 결합방향이 나온다. 예를 들어 변수에 어떤 값을 대입하는 대입(assign) 연산자 = 의 우선순위는 가장 낮고, 오른쪽에서 왼쪽의 결합방향을 가진다.
- 따라서,
a = b = c = d = e = f = g = h = i = j = 0;
의 식을 실행하면 오른쪽에서부터 왼쪽으로 가면서 처음에 j 변수에 0이 대입되고, 다음에 i 변수에 j변수에 저장되어 있는 값이 저장되고, 그 다음에 h 변수에 i변수에 저장되어 있는 값이 저장되고 ... 결국 모든 변수의 값을 0으로 만드는 결과가 된다.
- ** 3항 연산자는 자주 사용되지는 않지만, 복잡한 계산식이나 조건 처리, 비교 구조를 매우 간단히 표현할 수 있게 해준다. 잘 사용해보면 나름대로의 재미와 묘미가 있는 연산자이다.
- 특히, 보다 짧은 코드로 문제를 해결하려고 하는 숏 코딩(coding)에서는 빠질 수 없는 요소이다. "똑같이 해결할 수 있는 프로그램이지만, 때로는 아주 적은 소스코드 양으로 풀어내는 것을 매우 즐기는 숏 코더들이 있다."
- 숏 코딩은 일종의 재미이기는 하지만, 프로그래밍언어의 밑바닥 기초, 세세한 처리 과정에 대한 이해, 컴파일러의 소스코드 해석과 변환 등에 대한 경험과 지식이 필요하다.
- 입력 : 3개의 정수가 공백으로 구분되어 입력된다. -2147483648 ~ +2147483648
ex ) 3 -1 5
- 출력 : 가장 작은 값을 출력한다.
ex ) -1
package _CodeUp_;
import java.util.Scanner;
public class code2 {
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.println((a < b ? a : b) < c ? (a < b ? a : b) : c);
}
}
완성된 코드
1065 : [기초-조건/선택실행구조] 정수 3개 입력받아 짝수만 출력하기
< 문제 설명 >
- 세 정수 a, b, c가 입력되었을 때, 짝수만 출력해보자.
< 참고 >
- if(조건)
{ //조건이 참일 때에만 실행되는 구역(코드블록의 시작)
실행1;
실행2;
...
} //코드블록의 끝
의 조건/선택 실행 구조는
주어진 “조건”을 검사해 그 결과가 참인 경우에만 코드블록 안에 작성된 내용들을 순서대로 실행한다.
예시
if(a%2==0)
{
printf(“%d”, a);
}
if(b%2==0)
{
printf(“%d”, b);
}
if(c%2==0)
{
printf(“%d”, c);
}
** a%2==0 은 a%2가 먼저 수행되고 그 결과를 0과 비교한 참/거짓 값을 계산한다.
a%2==0의 의미는 a를 2로 나눈 나머지를 0과 비교한 결과 값(참/거짓)이다.
따라서, if(a%2 == 0) 는 “a가 짝수라면?” 이라는 의미로 해석할 수 있다.
- 입력 : 세 정수 a, b, c 가 공백을 두고 입력된다. 0 ~ +2147483647 범위의 정수들이 입력되며 적어도 1개는 짝수이다.
ex ) 1 2 4
- 출력 : 짝수만 순서대로 줄을 바꿔 출력한다.
ex ) 2
4
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
if (a % 2 == 0) {
System.out.println(a);
}
if (b % 2 == 0) {
System.out.println(b);
}
if (c % 2 == 0) {
System.out.println(c);
}
}
}
완성된 코드
1066 : [기초-조건/선택실행구조] 정수 3개 입력받아 짝/홀 출력하기
< 문제 설명 >
- 세 정수 a, b, c가 입력되었을 때, 짝(even)/홀(odd)을 출력해보자.
< 참고 >
- 참고
if(조건)
{ //코드블록1 시작
... 실행...;
...
}
else
{ //코드블록2 시작
... 다른실행...;
...
}
의 조건/선택 실행구조는 주어진 “조건”을 검사해 참인 경우에는 코드블록1을 실행하고, 거짓인 경우에는 코드블록2를 실행한다.
예시
if(a%2==0)
{
printf(“even”);
}
else
{
printf(“odd”);
}
- ** else는 if 없이 혼자 사용되지 않는다. 또한, else 다음에 조건이 없는 이유는? 참이 아니면 거짓이고, 거짓이 아니면 참이기 때문에...
즉 if문의 조건식의 판별 결과는 2가지 경우(참 또는 거짓)로 계산되는데, else 부분은 if문의 조건식의 결과가 거짓인 경우에 해당하기 때문이다.
- ** 실행해야 할 명령들이 여러 개일 때 코드블록 기호 { }로 묶어 주는데, 코드블록의 내용이 논리적으로 1개 단위라면 코드블록 기호를 생략할 수 있다.
if(a%2==0) printf("even");
else printf("odd");
- 입력 : 세 정수 a, b, c 가 공백을 두고 입력된다. 0 <= a, b, c <= +2147483647
ex ) 1 2 8
- 출력 : 입력된 순서대로 짝(even)/홀(odd)을 줄을 바꿔 출력한다.
ex ) odd
even
even
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
if ( a % 2 == 0 ) {
System.out.println("even");
}
else {
System.out.println("odd");
}
if ( b % 2 == 0 ) {
System.out.println("even");
}
else {
System.out.println("odd");
}
if ( c % 2 == 0 ) {
System.out.println("even");
}
else {
System.out.println("odd");
}
}
}
완성된 코드
1067 : [기초-조건/선택실행구조] 정수 1개 입력받아 분석하기
< 문제 설명 >
- 정수 1개가 입력되었을 때, 음(minus)/양(plus)과 짝(even)/홀(odd)을 출력해보자.
< 참고 >
- 조건/선택 실행 구조의 안에 조건/선택 실행 구조를 다시 "중첩"할 수 있다. 이는 "중첩(nested)"의 원리가 적용되는 내용으로 아래와 같은 구조가 가능하다.
if(조건1)
{
if(조건2) //조건문의 중첩
{
...
}
else
{
...
}
}
else
{
if(조건2)
{
...
}
else
{
...
}
}
- 위와 같은 조건/선택 실행구조는 조건/선택 실행구조를 중첩해 서로 다른 4가지(2가지*2가지)의 경우에 대해 다른 실행을 할 수 있도록 해준다.
- ** 어떤 조건들이 맞았을 때에는 해당부분의 코드블록 내용만 실행되고, 전체 조건/선택 실행구조를 빠져나간다. 즉, 다른 부분들은 실행되지 않는다.
- ** 소스코드의 들여쓰기는 사람이 보고 이해하기 쉽도록 하는 것으로써 들여쓰기나 줄바꿈을 하지 않더라도 동일하게 컴파일된다.
- 입력 : 정수 1개가 입력된다. -2147483648 ~ +2147483647, 단 0은 입력되지 않는다.
ex ) -2147483648
- 출력 : 입력된 정수에 대해 첫 줄에 minus 나 plus 를 출력하고, 두 번째 줄에 odd 나 even 을 출력한다.
ex ) minus
even
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
if ( a > 0 ) {
System.out.println("plus");
if (a % 2 == 0) {
System.out.println("even");
}
else {
System.out.println("odd");
}
}
else {
System.out.println("minus");
if (a % 2 == 0) {
System.out.println("even");
}
else {
System.out.println("odd");
}
}
}
}
완성된 코드
1068 : [기초-조건/선택실행구조] 정수 1개 입력받아 평가 출력하기
< 문제 설명 >
- 점수(정수, 0 ~ 100)를 입력받아 평가를 출력해보자.
평가 기준
점수 범위 : 평가
90 ~ 100 : A
70 ~ 89 : B
40 ~ 69 : C
0 ~ 39 : D
로 평가되어야 한다.
< 참고 >
- 여러 조건들을 순서대로 비교하면서 처리하기 위해서 조건문을 중첩할 수 있다. 만약, 순서대로 검사하고 실행하기 위해 아래와 같이 중첩 시킨다면,
if(조건1)
{
...
}
else
{
if(조건2)
{
...
}
else
{
...
}
}
- 중첩된 구조는 논리적으로 1단위이기 때문에 코드블록 기호를 생략하면 아래와 같은 구조로 다시 표현될 수 있다.
if(조건1) { ... ; }
else if(조건2) { ... ; }
else { ...; }
이와 같이 조건을 계속 붙여나가면..
if(조건1) { ... ; }
else if(조건2) { ... ; }
else if(조건3) { ... ; }
else if(조건4) { ... ; }
else if(조건5) { ... ; }
else if(조건6) { ... ; }
else if(조건...) { ... ; }
else { ... ; }
- 위와 같은 구조를 만들어 순서대로 조건을 검사할 수 있다. 어떤 조건이 참이면, 그 부분의 내용을 실행하고 조건/선택 구조를 빠져나간다.
- 이렇게 조건들을 순서대로 검사할 때에는 중간에 범위가 빠지지 않았는지 꼼꼼하게 생각하고 조건들을 만드는 것이 중요하다. 이는 마치 수학에서 빠진 범위 없이 부등식을 만드는 것과 유사하다.
- 입력 : 정수(0 ~ 100) 1개가 입력된다.
ex ) 73
- 출력 : 평가 결과를 출력한다.
ex ) B
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
//점수 범위 : 평가
// 90 ~ 100 : A
// 70 ~ 89 : B
// 40 ~ 69 : C
// 0 ~ 39 : D
//로 평가되어야 한다.
if (a >= 90 && a <= 100) {
System.out.println("A");
}
else if (a >= 70 && a <= 89) {
System.out.println("B");
}
else if (a >= 40 && a <= 69) {
System.out.println("C");
}
else if (a >= 0 && a <= 39){
System.out.println("D");
}
}
}
완성된 코드
1069 : [기초-조건/선택실행구조] 평가 입력받아 다르게 출력하기
< 문제 설명 >
- 평가를 문자(A, B, C, D, ...)로 입력받아 내용을 다르게 출력해보자.
평가 내용
평가 : 내용
A : best!!!
B : good!!
C : run!
D : slowly~
나머지 문자들 : what?
< 참고 >
- 조건/선택문을 복합적으로 구성해 출력할 수도 있지만,
switch(정수값)
{
case 'A': //문자 'A'가 정수값 65('A'의 아스키 값)로 저장되기 때문에 가능하다.
...;
break;
case 'B':
...;
break;
case 'C':
...;
break;
default:
...;
}
- 위와 같은 switch( ) ... case... break; 제어문을 사용할 수 있다.
- ** break; 를 사용하지 않으면 이후의 명령들도 계속 실행된다. default: 는 제시된 case 를 제외한 나머지 모든 경우에 실행된다. switch( ) 에 주어지는 값은 “정수"값만 가능하며, 문자도 아스키코드 정수값이기 때문에 가능하다.
- 입력 : 영문자 1개가 입력된다. (A, B, C, D 등의 한 문자가 입력된다.)
ex ) A
- 출력 : 평가내용에 따라 다른 내용이 출력된다.
ex ) best !!!
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char a = sc.nextLine().charAt(0);
//평가 : 내용
//A : best!!!
//B : good!!
//C : run!
//D : slowly~
//나머지 문자들 : what?
switch (a) {
case 'A':
System.out.println("best!!!");
break;
case 'B':
System.out.println("good!!");
break;
case 'C':
System.out.println("run!");
break;
case 'D':
System.out.println("slowly~");
break;
default:
System.out.println("what?");
break;
}
}
}
완성된 코드
1070 : [기초-조건/선택실행구조] 월 입력받아 계절 출력하기
< 문제 설명 >
- 월이 입력될 때 계절 이름이 출력되도록 해보자.
예
월 : 계절 이름
12, 1, 2 : winter
3, 4, 5 : spring
6, 7, 8 : summer
9, 10, 11 : fall
< 참고 >
- swtich( ).. case ... break; 제어문에서 break;를 제거하면 멈추지 않고 다음 명령이 실행되는 특성을 이용할 수 있다.
switch(a)
{
...
case 3:
case 4:
case 5:
printf("spring");
break;
...
}
로 작성하면, 3, 4, 5가 입력되었을 때 모두 "spring"이 출력된다.
- ** 12, 1, 2 는 어떻게 처리해야 할지 여러 가지로 생각해 보아야 한다.
- 입력 : 월을 의미하는 1개의 정수가 입력된다.(1 ~ 12)
ex ) 12
- 출력 : 계절 이름을 출력한다.
ex ) winter
package _CodeUp_;
import java.util.Scanner;
public class code2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
//월 : 계절 이름
//12, 1, 2 : winter
// 3, 4, 5 : spring
// 6, 7, 8 : summer
// 9, 10, 11 : fall
switch (a) {
case 1:
case 2:
System.out.println("winter");
break;
case 3:
case 4:
case 5:
System.out.println("spring");
break;
case 6:
case 7:
case 8:
System.out.println("summer");
break;
case 9:
case 10:
case 11:
System.out.println("fall");
break;
default:
System.out.println("winter");
break;
}
}
}
완성된 코드
이렇게 해서 오늘도 완벽하게 잘 풀어보았습니다아 !
모두 수고하셨구 오늘 하루도 화이팅 ~.~
'JAVA' 카테고리의 다른 글
< (JAVA) 코드업 1081 ~ 1090 > (1) | 2024.04.05 |
---|---|
< (JAVA) 코드업 1071 ~ 1080 > (0) | 2024.04.01 |
< (JAVA) 코드업 1051 ~ 1060 > (0) | 2024.03.28 |
< (JAVA) 코드업 1041 ~ 1050 > (0) | 2024.03.21 |
< 구구단 출력하기 (JAVA) > (0) | 2024.03.17 |