[CodeUp] 기초 100제 풀이 모음

ㅎㅎ·2021년 3월 29일
0

algorithm 풀이

목록 보기
27/44

CodeUp python 기초 100제

코드업 python 100제 풀이 완료! 6001~ 6098번까지 완료!
기초부터 처음부터라는 마음으로 시작했는데 너무 좋은 선택이었다. 쉬운 문제부터 내 기준 어려운 문제까지 푸니 자신감이 생기는 느낌이다


어려웠거나 기억나는 문제들

문제 6007번

"C:\Download\'hello'.py" 를 출력한다.

코드

print("\"C:\\Download\\'hello'.py\"")

설명

  • "를 출력하기위해서 \를 앞에 넣어주고, \앞에 \를 하나 더 추가한다.
  • 백준 고양이나 강아지모양 만드는 문제도 그렇고 이런 문제가 더 어렵다.

문제 6020번

'-'를 제외한 주민번호 13자리를 모두 붙여 출력한다.

코드1

#000907-1121112
str = input()

arr=[]
num = [0,1,2,3,4,5,6,7,8,9]
for i in str:
    try:
        if int(i) in num:
            arr.append(int(i))
    except:
        pass
    
for k in arr:
    print(k, end="")

코드2

a, b = input().split('-') #나누기
print(a,b,sep='')

설명

  • split으로 편하게 나누면 되는데, 처음에 풀때 빈리스트만들고 num안에 있으면 추가하고 try이도 써보면서 푼 코드 그런데 풀고나서도 정답확인했을 때 너무 짧아서 기억하는 문제

문제 6027번

10진수를 입력받아 16진수(hexadecimal)로 출력해보자.

코드

a = int(input())

print('%x' %a) #16진수로 출력하기.

설명

  • %x : 10진수를 16진수(hexadecimal)의 소문자로 출력
  • %o : 10진수를 8진수(octal)로 출력.

문제 6033번

문자 1개를 입력받아 그 다음 문자를 출력해보자.
영문자 'A'의 다음 문자는 'B'이고, 숫자 '0'의 다음 문자는 '1'이다.

코드

a = input()
b = ord(a) + 1

print(chr(b))

설명

  • ord() : 문자(아스키코드) -> 정수
  • chr() : 정수 -> 문자(아스키코드)

문제 6043번

실수 2개(f1, f2)를 입력받아
f1 을 f2 로 나눈 값을 출력해보자. 이 때 소숫점 넷째자리에서 반올림하여 무조건 소숫점 셋째 자리까지 출력한다.

코드1

n1, n2 = map(float,input().split())

print("%.3f" %round((n1/n2),4)) #출력형태 , 반올림하기

코드2

n1, n2 = map(float,input().split())

num= n1/n2
print("%.3f" %num) # 소수점 넷째자리에서 반올림되어서 출력. 

설명

  • "%.3f" 은 출력형태 즉 소수점 밑 세자리까지 출력. 이때 출력하려는 수 뒷자리에서 즉 넷째자리에서 반올림되어서 출력됨.
  • %round(값,4)는 소수점 밑 넷째짜리까지 출력. 이때 즉 다섯번째 자리에서 반올림되어서 출력됨.
  • 처음에는 round로 반올림하고 %f로 형태를 출력하는 줄 알았는데, 그게 아니라 둘다 소수점 뒷 자리에서 반올림을하고, 소수점 자리까지 출력한다는 것을 알았다. 그래서 두번째 코드에서 round함수를 쓰지않아도 %f자체로 반올림할수 있다.

문제 6063번

입력된 두 정수(a, b) 중 큰 값을 출력하는 프로그램을 작성해보자.
단, 3항 연산을 사용한다.

코드

a, b = map(int,input().split())

#3항 연산자 사용하기
x = a if (a>=b) else b
print(x)

설명

  • 3항 연산자 : x if C else y
    • C : True 또는 False 를 평가할 조건식(conditional expression) 또는 값
    • x : C의 평가 결과가 True 일 때 사용할 값
    • y : C의 평가 결과가 True 가 아닐 때 사용할 값

문제 6071번

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

코드

n=1 #처음 조건을 통과하기 위해 0이 아닌 수 넣기.
while n!=0: #0이 아닐때만 실행
    n = int(input())
    if n==0:
        break
    else:
        print(n)

설명

  • input n을 while문 밖을 쓰면 while문 무한실행이 되기 때문에, while문 안에 넣어주고 n을 0이 아닌수로 선언시켜서 while을 사용할수 있도록 만든다. (이 부분이 다시 푸니까 헷갈렸음)

문제 6074번

영문 소문자(a ~ z) 1개가 입력되었을 때,
a부터 그 문자까지의 알파벳을 순서대로 출력해보자.

코드

# ord : 문자 -> 아스키코드

s = ord(input()) # 97 ~ 122 (a~z)

fisrt_a = ord('a') # 97


while fisrt_a<=s: #s의 아스키코드와 같거나 작기 전까지 
    print(chr(fisrt_a)) #97-> str
    fisrt_a+=1

설명

  • 들어온 문자를 아스키코드로 바꿔주고(ord), a의 아스키코드를 선언해준다음에 a부터 문자까지의 알파벳을 출력. 출력할때는 아스키코드가 아닌 문자를 출력해야 하므로(chr)사용.

문제 6077번

정수(1 ~ 100) 1개를 입력받아 1부터 그 수까지 짝수의 합을 구해보자.

코드1

n = int(input())

arr = []
for i in range(n+1):
    if i % 2==0:
        arr.append(i)
print(sum(arr))

코드2

n = int(input())

sum = 0
for i in range(n+1):
    if i % 2==0:
        sum = sum +i
print(sum)

설명

  • 코드1은 빈리스트를 만들어 짝수를 넣어 sum 해줬고, 코드2는 sum=0이라고 선언해주고 하나씩 더해갔다. 코드1이 내가 푼 방법이고 코드2가 모범답안이었는데 다른 방식이라서 기억하면 좋을 것 같다.

문제 6079번

1, 2, 3 ... 을 계속 더해 나갈 때,
그 합이 입력한 정수(0 ~ 1000)보다 같거나 작을 때까지만
계속 더하는 프로그램을 작성해보자.

코드

n = int(input()) # 정수입력 

i=0
sum=0
while 1: #True
    sum = sum + i
    i+=1 
    if(sum>=n): # 55 >= 10
        break
print(i-1) 

설명

  • res
  • 다시 풀었더니 이해 완료.

문제 6081번

A, B, C, D, E, F 중 하나가 입력될 때,
1부터 F까지 곱한 16진수 구구단의 내용을 출력해보자.
(단, A ~ F 까지만 입력된다.)

코드

n = int(input())

#16진수로 출력 형태:
#print("%X" %n)

n = int(input(),16) #10진수를 6진수로 변환.
for i in range(1,16):
    print("%X*%X=%X" %(n,i,n*i)) #16진수형태로 출력. 

설명

  • input받을 때 10진수를 16진수로 변환한다. 그리고 16진수 형태로 출력한다.

문제 6083번

빨강(r), 초록(g), 파랑(b) 각 빛의 가짓수가 주어질 때,
주어진 rgb 빛들을 섞어 만들 수 있는 모든 경우의 조합(r g b)과 만들 수 있는 색의 가짓 수를 계산해보자.

코드

r,g,b = map(int,input().split())
count=0;
for i in range(r):
    for j in range(g):
        for k in range(b):
            print('%d %d %d' %(i,j,k))
            count+=1
print(count)

설명

  • 마지막에 count도 같이 출력해줘야함.

문제 6090번

어떤 규칙에 따라 수를 순서대로 나열한 것을 수열(sequences)이라고 한다.
....
이런 이상한 수열을 알게 된 영일이는 또 궁금해졌다.
"그럼.... 13번째 나오는 수는 뭘까?"

코드

#시작, 곱할 값, 더할 값.
a, m, d, n = map(int,input().split())

total=a
for i in range(1,n): #n번째.
    total=total*m+d
print(total)

설명

  • 규칙을 적용하려고 고민했는데 쉽게 풀 수 있었던 문제

문제 6091번

자! 여기서...잠깐..
같은 날 동시에 가입한 3명의 사람들이 온라인 채점시스템에 들어와 문제를 푸는 날짜가
매우 규칙적이라고 할 때, 다시 모두 함께 문제를 풀게 되는 그날은 언제일까?

코드

#최소공배수 이용. 
a, b, c = map(int, input().split())
n = max(a, b, c) #최대값이 9라면, 
cnt = n 
while True:
    if (n % a == 0) and (n % b == 0) and (n % c == 0):
        print(n)
        break
    n += cnt # 가장 큰 수의 배수로 돌리기. 9+9+9+,,,,순

설명

  • res
  • 최소공배수를 이용.
  • 가장 큰 수를 구해 그 수의 최소공배수를 만들어 나머지 값들을 나누어 0일때 출력.
  • n이 아닌 cnt를 만드는 이유는 n만을 썼을 때, 9+9=18이 되었을때 n이 18이 되어서 +18을 함. 따라서 cnt는 계속 9이어야함.(만역 최대값이 9라면)
  • 가장 작은수를 이용할수도있는데 그때는 다 체크하니까 비효율적.
  • 참고

문제 6092번

이상한 출석 번호 부르기1

코드

n = int(input())

arr = list(map(int,input().split()))
arr.reverse()  #리스트자체가 덮어씌어짐.

for i in arr:
    print(i, end=" ")

설명

  • reverse() 이 함수는 리스트 자체가 덮어씌어진다.

문제 6093번

이상한 출석 번호 부르기2

코드1

#reverse 사용. 
n = int(input())

arr = list(map(int,input().split()))
arr.reverse()  #리스트자체가 덮어씌어짐.

for i in arr:
    print(i, end=" ")

코드2

#reverse 사용 안 하기
n = int(input())

arr = list(map(int,input().split())) # 리스트 만들기

arr2=[]
for i in range(n,0,-1): # 시작, 끝, 스텝
    arr2.append(arr[i-1]) #arr[0]부터 시작해서. 헷갈리면 그려보기

for k in arr2:
    print(k,end=" ")

설명

  • reverse()를 사용하지 안하고도 풀었는데, range에서 시작,끝,스텝을 설정할때 스텝을 -1로 설정하면된다.
  • arr[i-1]을 설정한 이유는 arr[0]부터 시작하기때문에, 만약에 -1을 하지않으면 index out 오류가 뜬다.

문제 6095번: 바둑판에 흰돌 놓기

바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때,
n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보자.

코드

# 1. #바둑판만들기 

arr = []
for i in range(20):
    arr.append([]) # 리스트 안에 20개의 리스트 만들기 

    for k in range(20):
        arr[i].append(0)

# 좌표 받기 -> 각각의 좌표는 1로 바꾸기 
n = int(input())
for i in range(n):
    x,y = input().split()
    arr[int(x)][int(y)] = 1 # 2차원배열 


#print(arr) #완성 상태
# 리스트에서 벗어내기 

for i in range(1,20):
    for j in range(1,20):
        print(arr[i][j], end=" ")
    print()

설명

  • 처음에 바둑판 만드는 부분 코드가 이해가 가지 않아서 한단계 한단계씩 확인해가면서 풀었다.
  • 바둑판만들기 -> 받은 좌표를 1로 바꾸기 ->리스트를 벗겨내기 순으로 풀면된다.

문제 6096번: 바둑알 십자 뒤집기

바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자

코드

#입력받기
arr = [list(map(int,input().split())) for i in range(19)] #list comprehention?

# 뒤집기 횟수 
n = int(input())

# 뒤집기 
for i in range(n): # 총 n번 뒤집을것.  
    x, y = map(int, input().split()) # 좌표 10,10일때, 
    for j in range(19): #j==0일때 , (0부터 18까지 총 19개)
        #세로줄 뒤집기 
        if arr[j][y-1] == 0:
            arr[j][y-1] = 1
        else:
            arr[j][y-1] = 0 #그대로. 

        #가로줄 뒤집기. 
        if arr[x-1][j] == 0:
            arr[x-1][j] = 1
        else:
            arr[x-1][j] = 0

for i in range(19):
    for j in range(19):
        print(arr[i][j], end=' ')
    print()
# 6096 입력받기 연습
arr=[]
for x in range(10): # 총 세로로 10번을 입력받음. (test case)
    temp = input().split() # 한번의 케이스 
    for y in range(3): # 다 하나씩 돌면서 다 int형태로 바꾸기. 
        temp[y]= int(temp[y])
    arr.append(temp) # int형으로 바꾼 첫번째 list하나 추가하기.  그리고 맨위로 가서 반복
#라고 생각했으나,, 안됨ㅋ

설명

  • res
  • 입력받는 부분을 내가 생각한대로 밑에 처럼 만들어보려했지만 틀렸다고 나온다.
  • y와 x를 -1를 해주는 이유는 인덱스가 0이기 때문에, -1을 해주지않으면 잘못 뒤집힌다.
  • 계속 풀다보니 이중 for문도 점점 이해가 가는것 같다.

문제 6097번: 설탕과자 뽑기

코드

# 1) - h,w의 격자판 만들기
h,w =map(int,input().split())

arr = []
for i in range(h):
    arr.append([])
    for j in range(w):
        arr[i].append(0)  
#print(arr)
#for i in arr:
#    print(i)

#print(arr[0][0]) # 뽑기 . 


n = int(input()) #케이스 개수 
for i in range(1,n+1): #1부터 n개 
    l,d,x,y = map(int,input().split()) # 길이, 방향, 가장 위쪽의 위치.
    if(d==0): # 가로
        for k in range(l): # l길이만큼 이동
            arr[x-1][y-1+k]=1 #x,y가 1일때 -> 0,0으로 출력됨!
    else: # 세로
        for k in range(l):
            arr[x-1+k][y-1]=1   



for i in range(h):
    for k in range(w):
        print(arr[i][k], end=" ")
    print()

설명

  • 입력으로 2 0 1 1을 넣으면 x,y좌표가 (1,1)인데 조건문을통해 (0,0)의 자리에 입력된다. 이 부분이 어려웠다.

문제 6098번: 성실한 개미

코드

#입력 
arr=[]
for x in range(10):
    temp = input().split()
    for y in range(10):
        temp[y]= int(temp[y])
    arr.append(temp)


# 시작 좌표 설정하기. 
x,y=1,1
arr[1][1]=9 #시작할때 9로 만들고 
while True:
    if arr[x][y+1]==2: #개미 오른쪽이 9로 바꾸고 중단.
        arr[x][y+1]=9
        break
    elif arr[x][y+1]==1 and arr[x+1][y]==1:# 개미의 오른쪽이나 아래쪽이 1이라면 중단
        break 
    elif arr[x][y+1]==0: #오른쪽이 0이면 
        y+=1 # 오른쪽으로 이동.
        arr[x][y]=9
    elif arr[x][y+1]==1: # 오른쪽이 1이면 
        x+=1 #아래쪽으로 이동하다가
        if arr[x][y]==2: #먹이를 발견하면 , 
            arr[x][y]=9
            break
        else: #먹이를 발견하지 못하면 계속 내려가기.
            arr[x][y]=9 

#벗겨내기
for x in range(10):
    for y in range(10):
        print(arr[x][y], end=" ")
    print()

설명

  • 입력 형태(?)를 만들어야해서 어려웠던 문제. 내가 일일이 테스트를 못해서 제출 한 후 출력결과를 보면서 수정했다. 그래서 당연히 시작 좌표 설정 코드가 틀 린줄알았는데 알고보니 입력코드 띄어쓰기가 잘못 되어있었다. 띄어쓰기의 중요성

2개의 댓글

comment-user-thumbnail
2021년 6월 15일

6096번에서 가로줄 먼저뒤집고 세로줄 나중에 뒤집는 것인데 풀이에는 세로줄 먼저뒤집고 가로줄 나중에 뒤집는것처럼 풀이해두셨네요. 어떻게 해도 결과야 같을 것이라고 생각합니다만 문제에서 나온 십자 뒤집기의 정의와 달라 말씀드려요

1개의 답글