알고리즘 오답 정리 (codeup 6074, 6081, 6082, 6083 / SWEA 1288, 1545, 1989)
코드업
6074
영문 소문자(a ~ z) 1개가 입력되었을 때, a부터 그 문자까지의 알파벳을 순서대로 출력한다.
a = ord(input()) # 정수로 변환
s = ord('a') #a의 정수 변환
while a >= s: # a가 s보다 크거나 같을 때 까지
print(chr(s), end = ' ') #문자형 s를 출력
s += 1 # s에 1씩 더한다
a는 입력받은 문자열(알파벳)을 ord()를 통해 정수로 바꿔준다.
s는 알파벳 a의 정수로 바꾼 값이 들어있다.
while문을 통해 a가 s보다 크거나 같을 때까지 s를 출력한다.
이때 문자에서 정수로 바뀐 s는 다시 chr()를 통해 문자로 변환해준다.
출력 이후 s값에 1씩 더해준다. 입력값이 f 라면 f가 될 때 까지 반복한다.
while문은 a >= s의 조건이 완성되면 종료하게 된다.
6081
n = int(input(), 16) #16진수로 변환
for i in range(1, 16): # 1 -15까지 i에 값을 하나씩 넣어주며 반복
print('%X'%n, '*%X'%i, '=%X'%(n*i), sep='')
문자열을 입력하여 16진수 정수 타입으로 반환한다.
'%X'를 사용하여 16진수로 출력하도록 한다. (16진수 적용)
입력: B
출력:
B*1=B
B*2=16
B*3=21
B*4=2C
B*5=37
B*6=42
B*7=4D
B*8=58
B*9=63
B*A=6E
B*B=79
B*C=84
B*D=8F
B*E=9A
B*F=A5
6082, SWEA 1926
3, 6, 9 게임
3, 6, 9 가 들어간 수를 자신이 불러야 하는 상황이라면, 수를 부르는 대신 "박수(X)" 를 쳐야 한다.
33과 같이 3,6,9가 두 번 들어간 수 일때, "짝짝"과 같이 박수를 두 번 치는 형태도 있다.
오답 1.
n = int(input())
for i in range(1, n + 1) :
if i%10 == 3 or i%10 == 6 or i%10 == 9:#3.3이 나올 경우 하나의 3으로 인식
print('X', end = ' ')
else:
print(i, end = ' ')
이 코드는 박수 두 번이 실행되지 않는다.
3.3, 3.6 등등 3, 6, 9가 중복으로 나와도 하나의 3, 6, 9로 인식하기 때문이다.
오답 2.
n = int(input())
clap = ['3', '6', '9']
cnt = 0
for i in range(1, n + 1):
i = str(i)
if i in clap:
cnt += 1
print('X' * cnt, end=' ')
else:
print(i, end=' ')
cnt를 만들어서 3, 6, 9가 나올때 정수로 변형해서 -를 출력하도록 한다면,
3, 6, 9가 나올 때마다 cnt에 기록되어 (기록이 쌓여) i에 6이 나올 때 XX 두 번 출력하게 된다.
(3에서 이미 한 번 cnt에 저장되었으므로)
if i in clap:
cnt = i.count(clap)
print('X' * cnt, end=' ')
else:
print(i, end=' ')
count에 clap을 넣을 수 없다.
count는 문자열만 가능하고, clap은 리스트이기 때문에 불가능하다.
답안
n = int(input())
for i in range(1, n + 1):
i = str(i) # 문자열로 변환
cnt = i.count('3') + i.count('6') + i.count('9') #문자열 3,6,9를 센다
if cnt == 0: #3,6,9가 없다면
print(i, end=' ') #그대로 i를 출력
else: #3,6,9가 있다면
print('X' * cnt, end=' ') #X를 cnt 값만큼 출력한다
박수를 두 번 칠 수 있도록 count()를 사용한다.
X와 cnt를 곱하여 복수의 X를 출력할 수 있도록 한다.
일단, 곱하기는 정수와만 가능하다. ( 'X' * i 는 문자열과 곱하는 것은 불가능하다. 그러므로 count()가 필요하다)
i의 (문자열로 변환한)정수가 3, 6, 9일 경우의 횟수를 cnt에 넣어준다.
if 문을 통해 만약 cnt의 값이 1 이상이 된다면 else문을 통해 'X'를 출력하게 된다.
출력 이후 i가 "4"가 된다면 cnt는 다시 0으로 초기화되므로, if 문의 cnt == 0을 충족하여 4를 출력한다.
6083
빨강(red), 초록(green), 파랑(blue) 빛을 섞어 여러 가지 다른 색 빛을 만들어 내려고 한다.
빨강(r), 초록(g), 파랑(b) 각 빛의 가짓수가 주어질 때, 주어진 rgb 빛들을 섞어 만들 수 있는 모든 경우의 조합(r g b)과 만들 수 있는 색의 가짓 수를 계산해보자.
r, g, b = map(int, input().split())
cnt = 0
for i in range(r):
for j in range(g):
for k in range(b):
print('%d %d %d' %(i, j, k))
cnt += 1
print(cnt)
# 입력 2 2 2
# 출력
# 0 0 0
# 0 0 1
# 0 1 0
# 0 1 1
# 1 0 0
# 1 0 1
# 1 1 0
# 1 1 1
# 8
3가지의 빛을 섞어 가능한 경우의 수를 출력한다.
가장 안쪽 반복문부터 실행한다.
(j에서 실행할 때 왜 k는 다시 0이 되는 것일까, 반복문 3개로 어떻게 안겹치고 알아서 경우의 수를 뽑아내는 것인가)
SWEA
1288
민석이는 N의 배수 번호를 센다.
첫 번째는 N번을 세고, 두 번째에는 2N, k번째에는 kN번 양을 센다.
0에서 9까지의 숫자를 보는 것은 최소 몇 번을 센 시점일까?
t = int(input())
for test_case in range(1, t + 1):
N = int(input())
N1 = N
numbers = set() # 기록지
# while 반복 => set 길이가 10이 될 때 까지
while True:
# for 반복: 숫자를 문자로 변환
for n in str(N):
# numbers set에 추가
numbers.add(n)
if len(numbers) == 10:
break
# print(n, numbers)
N += N1
print(f'#{test_case} {N}')
t는 1이고, N은 1295라고 가정해보자.
N1 = N
N1은 1295가 된다.
본래의 N 값을 N1에 저장해둔다. (이후에 N 값은 계속 더해지기 때문)
numbers = set()
0부터 9까지의 정수를 넣어 줄 변수(기록지)이다.
반복문을 통해 넣어질 정수들의 중복을 없애기 위해 set()을 사용한다.
(현재는 0)
for n in str(N):
문자열로 변환한 N의 값을 n에 하나씩 넣어준다.
현재 n은 "1"이다.
numbers.add(n)
n의 "1"을 numbers에 넣어준다.
현재 numbers에는 "1"이 들어있다.
다시 위의 for문으로 돌아가 나머지 "2", "5", "9"를 넣어준다.
if len(numbers) == 10:
break
N += N1
numbers에 10개의 값이 없으니
N에 N1값을 더해준다.
1295 + 1295 == 2590
N은 2590이 된다.
다시 for문을 반복해주어 "2", "5", "9", "0"의 값을 넣어준다.
이때 numbers는 중복 값을 없애는 set()을 사용했기 때문에 "0"만 들어가게 된다.
print(f'#{test_case} {N}')
for문을 반복하여 numbers에 0부터 9까지의 숫자를 넣었을 때 N의 값은 6475가 된다.
주의할 점은 반복해서 숫자를 센 k번을 출력하는 것이 아닌 kN을 출력하는 것이다.
(5 * 1295 == 6475)
민석아 ^^...
1545
주어진 숫자부터 0까지 순서대로 출력한다.
입력된 숫자가 N일 때 거꾸로 출력한다.
n = int(input())
for i in range(n, -1, -1) :
print(i, end=' ')
역순으로 출력하기 위해
range(n, -1, -1)
n부터 0까지 역순(-1)으로 나열한다.
1989
회문검사
거꾸로 읽어도 제대로 읽은 것과 같은 문장과 낱말인 회문을 출력한다.
입력 받아 회문이면 1을, 아니면 0을 출력한다.
t = int(input())
for test_case in range(1, t + 1):
word = input()
result = ''
for i in range(len(word)-1, -1, -1):
result += word[i]
if result == word:
print('#{} {}'.format(test_case, '1'))
else:
print('#{} {}'.format(test_case, '0'))
word = input()
result = ''
word는 입력값을 넣을 수 있도록 하고,
results는 값을 할당할 수 있도록 문자열 형태의 빈 변수를 만든다.
word에 "level" 입력값을 넣는다.
for i in range(len(word)-1, -1, -1):
result += word[i]
word값을 i, result에 역순으로 하나씩 넣기 위해 for문을 사용한다.
range()의 역순(-1)을 이용하여 i에 값을 넣는다. (현재 i는 4)
word[i]를 통해 문자열로 변환하여 "level" 값을 거꾸로 넣도록 한다.
현재 result는 "l"이 들어가게 된다.
for문을 반복하여 "l", "e", "v", "e", "l"이 result에 저장된다.
if result == word:
print('#{} {}'.format(test_case, '1'))
else:
print('#{} {}'.format(test_case, '0'))
만약 역순으로 들어가게 된 result와 word가 같다면 1을 출력하게 되고,
같지 않다면 0을 출력하게 된다.
result의 값인 level과 입력값 word의 level이 같으므로 1을 출력하게 된다.