Programming 기초/Coding Test

[CodeUp#review] 기초 100제

코딩상륙작전 2023. 6. 4. 15:55

100제 중 기록해둘 몇 개 문항만 다룬다.

 

* 짝수 합 구하기(6077번)

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

[ 입력 ]
정수 1개가 입력된다.
(0 ~ 100)
[출력]
1부터 그 수까지 짝수만 합해 출력한다.
# 더 빠른 풀이, but 가독성이 떨어짐
k = int(input())
print((k >> 1) * ((k >> 1) + 1))

# 가독성을 조금 더 높인 풀이
# 등차수열의 합공식n*(n+1)/2을 이용함. 
# 모두 짝수이므로 2를 인수로 가지고 있다.
k = int(input())
n = k//2
sum = n*(n+1)
print(sum)

시간복잡도 : O(1)

# 제공 풀이
n = int(input())

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

print(sum)

시간복잡도 : O(n)

 

* 369게임 출력 (6082번)

입력 n보다 작은 1~n의 범위에서 3, 6, 9가 들어간 숫자는 'X'로 대체되고 그 외 숫자는 그대로 출력한다.

단, 출력 시 1부터 n까지 순서대로 공백을 두고 수를 출력한다. 

# n의 범위는 1~ 99이다.
n = int(input())
rule = [3, 6, 9]
for i in range(1, n+1):
    ten = i//10
    last = i%10
    if (ten in rule) :
        if last in rule: print('XX', end=' ')
        else :print('X',end=' ')
    elif last in rule: print('X',end=' ')
    else: print(i,end=' ')
# 제공 풀이
# 입력이 n<30으로 제한되어있다.
n = int(input())

for i in range(1, n+1) :
  if i%10==3 or i%10==6 or i%10==9 :
    print("X", end=' ')
  else :
    print(i, end=' ')

 

* round 함수와 format함수의 차이점 (6085번)

반올림하는 함수이다. round(x, y)에서 x는 반올림하고자 하는 대상이고, y는 소수 몇번째 자리까지 반올림할 것인지 결정하는 인자이다. 

그러나 반올림 했을 때 소수 두 번째 자리 밑으로 0이면 소수 첫 번째 자리까지만 나타낸다.

w, h, b = map(int, input("입력:").split())
print(round(w * h * b / 8 / 1024 / 1024, 3), "MB")

w, h, b = map(int, input().split())
print(format(w * h * b / 8 / 1024 / 1024, '.3f'), "MB")

------------------------------------------------------------
입력:100 4 4
0.0 MB

입력:100 4 4
0.000 MB

 

* 이상한 출석 번호 부르기(6092번)

입력
첫 번째 줄에 출석 번호를 부른 횟수인 정수 n이 입력된다. (1 ~ 10000)
두 번째 줄에는 무작위로 부른 n개의 번호(1 ~ 23)가 공백을 두고 순서대로 입력된다.
출력
1번부터 번호가 불린 횟수를 순서대로 공백으로 구분하여 한 줄로 출력한다.
call = int(input())
n = list(input().split())
sn = [0] * 23
for i in range(call):
    n[i] = int(n[i])
    sn[n[i] - 1] += 1

for i in range(23):
    print(sn[i], end=" ")
----------------------------
# 입력
10
1 3 2 2 5 6 7 4 5 9
# 출력
1 2 1 1 2 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

* 바둑판에 흰돌 놓기(6095번)

리스트 컴프리헨션!

입력
바둑판에 올려 놓을 흰 돌의 개수(n)가 첫 줄에 입력된다.
둘째 줄 부터 n+1 번째 줄까지 힌 돌을 놓을 좌표(x, y)가 n줄 입력된다.
n은 10이하의 자연수이고 x, y 좌표는 1 ~ 19 까지이며, 똑같은 좌표는 입력되지 않는다.
출력
흰 돌이 올려진 바둑판의 상황을 출력한다.
흰 돌이 있는 위치는 1, 없는 곳은 0으로 출력한다.

 

n = int(input())
a = [[0] * 19 for _ in range(19)]	# 초기화 주의
for i in range(n):
    x, y = map(int, input().split())
    a[x - 1][y - 1] = 1

for i in range(19):
    for j in range(19):
        print(a[i][j], end=" ")
    print()
--------------------------------------
5		# 흰돌의 갯수
1 1		# 흰돌을 놓을 좌표(x, y)
2 2
3 3
4 4
5 5
# 출력 결과
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2차원 배열에 경우 [[0]*19]*n으로 하면 안된다. 19개의 리스트안의 리스트가 동일 객체에 참조된다.

그러므로 리스트 컴프리헨션으로 초기화해야한다.

 

* 바둑알 십자 뒤집기(6096번)

# 오리지널 답변
m = [[0] * 19 for _ in range(19)]	#[0]*1 이어도 상관 없음. 인덱스만 만들어주면 됨
for i in range(19):
    m[i] = list(map(int, input().split()))

n = int(input())
for i in range(n):
    x, y = map(int, input().split())
    for j in range(19):
        m[x - 1][j] ^= 1
        m[j][y - 1] ^= 1

for i in range(19):
    for j in range(19):
        print(m[i][j], end=" ")
    print()
d=[]
for i in range(20) :
  d.append([])
  for j in range(20) : 
    d[i].append(0)

for i in range(19) :
  a = input().split()
  for j in range(19) :
    d[i+1][j+1] = int(a[j])

# 제공 답변
n = int(input())
for i in range(n) :
  x,y=input().split()
  x=int(x)
  y=int(y)
  for j in range(1, 20) :
    if d[j][y]==0 :
      d[j][y]=1
    else :
      d[j][y]=0

    if d[x][j]==0 :
      d[x][j]=1
    else :
      d[x][j]=0

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

a=list(map(int, input().split()))는 입력받은 str을 list 요소로 바꿔준다.

 

* 성실한 개미(6098번)

0은 갈 수 있는 곳, 1은 벽 또는 장애물, 2는 도착지, 지나간 경로는 9

m[1][1]에서 출발해서 오른쪽으로 진행, 막히면 아래로 진행(오른쪽 우선), 도착하거나 움직일 수 없을 때까지 진행. 

입력
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.
출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
# 오리지널 답변
# 10*10 미로만들기
m =[]
for i in range(10):
    m.append([])
    m[i]=list(map(int, input().split()))

# 미로찾기, 시작점:(2,2)
i,j = 1,1
m[1][1]=9
while True :
    if m[i][j+1]!=1:     	# 오른쪽이 뚫린 경우
        j+=1
    elif m[i+1][j]!=1:   	# 아래쪽이 뚫린 경우
        i+=1
    else: break			# 움직일 수 없는 경우. 반복문 탈출.
    if m[i][j] == 2:
        m[i][j] =9
        break
    else : m[i][j] =9

for i in range(10):
    for j in range(10):
        print(m[i][j],end=' ')
    print()

 

# 입력 예시
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 0 0 0 0 1 2 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

# 출력 예시
1 1 1 1 1 1 1 1 1 1
1 9 9 1 0 0 0 0 0 1
1 0 9 1 1 1 0 0 0 1
1 0 9 9 9 9 9 1 0 1
1 0 0 0 0 0 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1