1071 : [기초-반복실행구조] 0 입력될 때까지 무한 출력하기1(설명)


정수가 순서대로 입력된다.
-2147483648 ~ +2147483647, 단 개수는 알 수 없다.

0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자.
while( ), for( ), do~while( ) 등의 반복문을 사용할 수 없다.


참고
goto 명령문을 사용하면 간단한 반복 실행을 만들 수 있다.
반복 실행 부분을 빠져나오기 위해(즉 무한 반복을 방지하기 위해)
반복 실행 되는 도중에 조건을 검사해야 한다.

goto 이름:
이 명령은 이름: 이 작성된 곳으로 프로그램의 실행 흐름을 바꾸어 준다.

"이름:" 과 같이 콜론(:)이 붙어있는 부분을 이름표(label, 레이블)라고 한다.
레이블은 특별한 선언 없이 사용할 수 있으며 언더바(_)나 영문자로 시작하면 된다.
레이블은 한 단어처럼 공백없이 모두 붙여 써야 한다.

switch( ) ... case ... : ... break; 에서
case ... : 도 일종의 레이블이라고 생각할 수 있다.

goto 레이블:
명령을 사용하면 반복되는 부분을 여러 개 자유롭게 만들 수 있다.

goto 명령은 반복 실행을 만들어낼 수 있는 가장 간단한 명령이지만,
복잡하게(스파게티 코드) 사용하는 경우, 이해가 어렵고 오류가 생기기 쉽다.


예시
int n;
reload: //레이블은 콜론(:)으로 끝내고, 일반적으로 들여쓰기를 하지 않는다.
scanf("%d", &n);
printf("%d", n);
if(n!=0) goto reload; //reload라고 적혀있는 레이블로 실행 이동

 

정답

a=input().split(' ')
a=list(a)
for i in a:
    if int(i) == 0:
        break
    else:
        print(i)

 

모범 소스

a = input().split()

for x in a:
    if int(x)==0:
        break
    print(x)

 

 

 1072 : [기초-반복실행구조] 정수 입력받아 계속 출력하기(설명)


n개의 정수가 순서대로 입력된다.
-2147483648 ~ +2147483647, 단 n의 최대 개수는 알 수 없다.

n개의 입력된 정수를 순서대로 출력해보자.

while( ), for( ), do~while( ) 등의 반복문을 사용할 수 없다.


예시
int n, m;
scanf("%d", &n);
reget: //레이블은 콜론( : ) 으로 끝난다.
scanf("%d", &m);
printf("%d\n", m);
if(n-- != 0) goto reget; //reget:으로 이동, n의 값 1만큼 감소

 

정답

a=input()
a=int(a)
b=input().split(' ')

for i in range(a):
    print(b[i])

 

모범 소스

n = int(input())
a = input().split()
for x in a:
    print(x)

 

 

 1073 : [기초-반복실행구조] 0 입력될 때까지 무한 출력하기2(설명) 


정수가 순서대로 입력된다.
-2147483648 ~ +2147483647, 단 개수는 알 수 없다.

0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자.


if(조건)
{ //코드블록
...;
}
구조를 사용하면 주어진 조건이 참인 경우만 코드블록 부분이 실행된다.

비슷하게 어떤 조건에 따라 반복적으로 실행시킬 때에는 if를 while로 바꾸기만 하면

while(조건)
{ //코드블록
...;
}

와 같은 방법으로 코드블록의 내용을 반복적으로 수행시킬 수 있다.

수행되는 과정은
1. 먼저 조건을 검사한다.
2. 코드블록을 실행한다.
3. 다시 조건을 검사한다.
4. 코드블록을 실행한다.
...

와 같이 주어진 조건이 참인 동안 계속적으로 반복 실행한다.
이렇게 while(조건){...}을 이용하면 goto 명령을 사용하지 않고
반복을 만들어낼 수 있다.

예시
int n=1; //처음 조건 검사를 넘어가기 위해 0이 아닌 값 입력
while(n!=0)
{
scanf("%d", &n);
printf("%d", n);
}

 

정답

a=input().split(' ')
i=0

while int(a[i]) != 0:
    print(a[i])
    i = i+1

 

모범 소스

l=input().split()
for x in l:
    if x!='0':
        print(x)
    else:
        break

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

 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( ) 에 주어지는 값은 “정수"값만 가능하며,
문자도 아스키코드 정수값이기 때문에 가능하다.

 

정답

a=input()

if a == 'A':
    print('best!!!')
elif a == 'B':
    print('good!!')
elif a == 'C':
    print('run!')
elif a == 'D':
    print('slowly~')
else:
    print('what?')

 

 

 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 는 어떻게 처리해야 할지 여러 가지로 생각해 보아야 한다.

 

정답

a=input()
a=int(a)

if a == 1 or a == 2 or a == 12:
    print('winter')
elif a == 3 or a == 4 or a == 5:
    print('spring')
elif a == 6 or a == 7 or a == 8:
    print('summer')
elif a == 9 or a == 10 or a == 11:
    print('fall')

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

 1067 : [기초-조건/선택실행구조] 정수 1개 입력받아 분석하기(설명)


정수 1개가 입력되었을 때, 음(minus)/양(plus)과 짝(even)/홀(odd)을 출력해보자.


참고
조건/선택 실행 구조의 안에 조건/선택 실행 구조를 다시 "중첩"할 수 있다.
이는 "중첩(nested)"의 원리가 적용되는 내용으로 아래와 같은 구조가 가능하다.

if(조건1)
{
if(조건2) //조건문의 중첩
{
...
}
else
{
...
}
}
else
{
if(조건2)
{
...
}
else
{
...
}
}

위와 같은 조건/선택 실행구조는 조건/선택 실행구조를 중첩해
서로 다른 4가지(2가지*2가지)의 경우에 대해 다른 실행을 할 수 있도록 해준다.

** 어떤 조건들이 맞았을 때에는 해당부분의 코드블록 내용만 실행되고,
전체 조건/선택 실행구조를 빠져나간다. 즉, 다른 부분들은 실행되지 않는다.

** 소스코드의 들여쓰기는 사람이 보고 이해하기 쉽도록 하는 것으로써
들여쓰기나 줄바꿈을 하지 않더라도 동일하게 컴파일된다.

 

정답

a=input()
a=int(a)

if a > 0:
    print('plus')
    if a % 2 == 0:
        print('even')
    else:
        print('odd')
else:
    print('minus')
    if a % 2 == 0:
        print('even')
    else:
        print('odd')

 

모범 소스

a=input()

x=int(a)

if x>0 :
    print("plus")
elif x<0 :
    print("minus")

if x%2==0 :
    print("even")
else :
    print("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 { ... ; }

위와 같은 구조를 만들어 순서대로 조건을 검사할 수 있다.
어떤 조건이 참이면, 그 부분의 내용을 실행하고 조건/선택 구조를 빠져나간다.

이렇게 조건들을 순서대로 검사할 때에는
중간에 범위가 빠지지 않았는지 꼼꼼하게 생각하고 조건들을 만드는 것이 중요하다.
이는 마치 수학에서 빠진 범위 없이 부등식을 만드는 것과 유사하다.

 

정답

a=input()
a=int(a)

if a <= 100 and a >= 90:
    print('A')
elif a <= 89 and a >= 70:
    print('B')
elif a <= 69 and a >= 40:
    print('C')
elif a <= 39 and a >= 0:
    print('D')

 

모범 소스

a=input()

x=int(a)

if x>=90 :
    print('A')
elif x>=70 :
    print('B')
elif x>=40 :
    print('C')
else :
    print('D')

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

 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=input().split(' ')

if int(a) % 2 ==0:
    print(a)
if int(b) % 2 ==0:
    print(b)    
if int(c) % 2 ==0:
    print(c)

 

 

 1066 : [기초-조건/선택실행구조] 정수 3개 입력받아 짝/홀 출력하기(설명)


세 정수 a, b, c가 입력되었을 때, 짝(even)/홀(odd)을 출력해보자.


참고
if(조건)
{ //코드블록1 시작
... 실행...;
...
}
else
{ //코드블록2 시작
... 다른실행...;
...
}
의 조건/선택 실행구조는 주어진 “조건”을 검사해 참인 경우에는 코드블록1을 실행하고,
거짓인 경우에는 코드블록2를 실행한다.

예시
if(a%2==0)
{
printf(“%s”, “even”);
}
else
{
printf(“%s”, “odd”);
}

** else는 if 없이 혼자 사용되지 않는다. 또한, else 다음에 조건이 없는 이유는?
참이 아니면 거짓이고, 거짓이 아니면 참이기 때문에...
즉 if문의 조건식의 판별 결과는 2가지 경우(참 또는 거짓)로 계산되는데,
else 부분은 if문의 조건식의 결과가 거짓인 경우에 해당하기 때문이다.

** 실행해야 할 명령들이 여러 개일 때 코드블록 기호 { }로 묶어 주는데,
코드블록의 내용이 논리적으로 1개 단위라면 코드블록 기호를 생략할 수 있다.

if(a%2==0) printf("%s", "even");
else printf("%s", "odd");

 

정답

a,b,c=input().split(' ')

if int(a) % 2 ==0:
    print('even')
else:
    print('odd')
if int(b) % 2 ==0:
    print('even')
else:
    print('odd')
if int(c) % 2 ==0:
    print('even')
else:
    print('odd')

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

 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가 된다.

 

정답

a,b=input().split(' ')
a=int(a)
b=int(b)
print('%d' %( a > b and a or b ))

 

모범 소스

a,b=input().split()
x=int(a)
y=int(b)
print(x if x>y else y)

 

 

 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)에서는 빠질 수 없는 요소이다.
"똑같이 해결할 수 있는 프로그램이지만, 때로는 아주 적은 소스코드 양으로 풀어내는 것을
매우 즐기는 숏 코더들이 있다."

숏 코딩은 일종의 재미이기는 하지만,
프로그래밍언어의 밑바닥 기초, 세세한 처리 과정에 대한 이해,
컴파일러의 소스코드 해석과 변환 등에 대한 경험과 지식이 필요하다.

 

정답

a,b,c=input().split(' ')
a=int(a)
b=int(b)
c=int(c)
print('%d' % ( ( a > b ) and ( ( c > b ) and b or c )
                        or ( ( c > a ) and a or c ) ) )

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

 10진수에서 2진수, 8진수, 16진수로 변환 

  

1. 내장함수 이용하기

 

10진수에서 2진수, 8진수, 16진수로 변환할 때 파이썬의 내장함수를 이용해 쉽게 변환할 수 있습니다.

이 때 문자열로 변환해서 string 타입입니다 .

 

10진수 → 2진수 : bin()

10진수 → 8진수 : oct()

10진수 → 16진수 : hex()

 

a=10

b=bin(a)

# 결과>>0b1010
print(b) 
# 결과>>0b1010
print('%s' %b) 

o=oct(a)

# 결과>>0o12
print(o) 
# 결과>>0o12
print('%s' %o) 

h=hex(a)

# 결과>>0xa
print(h)
# 결과>>0xa
print('%s' %h) 

 

10진수를 제외하고 2진수, 8진수, 16진수에는 접두어를 사용해 진수를 구분해줍니다.

접두어는 숫자 0과 각 진수의 소문자 하나로 이루어져 있습니다.

 

2진수 : binary

8진수 : octadecimal

16진수 : hexadecimal

 

2진수 : 0b

8진수 : 0o

16진수 : 0x

 

그래서 결과에 0b, 0o, 0x가 같이 출력되는 것을 알 수 있습니다.

 

2. %연산자 이용하기

 

10진수에서 8진수, 16진수로 변환할 때 %연산자를 이용해 print() 문장에서 값을 간단하게 출력할 수 있습니다.

 

8진수 : %o

16진수 : %x (16진수의 소문자로 출력)

               %X (16진수의 대문자로 출력)

 

%x로 출력하면 16진수의 소문자로 출력되고 %X로 출력하면 16진수의 대문자로 출력된다.

 

a=10

# 결과>>12
print('%o' %a) 

# 결과>>a
print('%x' %a)

# 결과>>A
print('%X' %a)

 

%연산자를 이용해 출력할때는 8진수 앞의 0o, 16진수 앞의 0x가 생략되어 출력됩니다.

 

 

2진수, 8진수, 16진수에서 10진수로 변환

 

2진수, 8진수, 16진수에서 10진수로 변환하려면 int형 변환을 이용하면 됩니다.

 

n진수 → 10진수 : int(바꿀 숫자, n)

 

b=int('0b1010', 2)

# 결과>>10
print(b)

o=int('0o12', 8)

# 결과>>10
print(o)

h=int('0xa', 16)

# 결과>>10
print(h)

'Python > 파이썬 기초' 카테고리의 다른 글

파이썬_기초 9_continue, break  (0) 2020.04.08
파이썬_기초 8_while문  (0) 2020.04.07
파이썬_기초 6_sep, end  (0) 2020.04.04
파이썬_기초 5_for문  (0) 2020.04.04
파이썬_기초 4_if문  (0) 2020.04.03

+ Recent posts