-Summary-
CodeUp 1076 ~ 1099번 문제 파이썬 풀이 Write Up
02-03 (Codeup 1076 ~ 1096)
입력 된 알파벳까지 알파벳 순서대로 출력하는 것이 목적이다.
for i in range(ord('a'),ord(input())+1):
print(chr(i), end=" ")
아스키 코드를 이용해서 문제를 해결했다. range의 시작 값으로 ord('a') 즉 a의 아스키 코드 값(97)부터 시작, 끝 값은 입력 값의 아스키 코드 + 1까지 1씩 증가하면서 해당 아스키 값(i)의 문자를 출력하도록 작성했다.
0부터 입력 된 값까지 1씩 증가하면서 값을 하나씩 출력하는 것이 목적이다.
for i in range(0,int(input())+1):
print(i)
위와 비슷하게 range를 사용했고 시작값은 0, 끝값은 입력 된 값을 정수형으로 바꾼 상태로 1 더한 값으로 설정했다.
1부터 입력한 값까지 짝수의 합을 출력하는 것이 목적이다.
tmp = 0
for i in range(0,int(input())+1):
if i % 2 == 0:
tmp += i
print(tmp)
1077번 문제와 for문은 똑같이 작성했고, 그 전에 짝수의 합을 담을 변수인 tmp를 선언해뒀다. for문 안에서 i 나누기 2의 나머지가 0일 경우 짝수로 판별하여 tmp에 i 값을 더해주도록 하고, 더해진 짝수의 합을 반복문이 끝나고 출력되도록 작성했다.
'q'가 입력될 때까지 입력된 문자들을 한 줄에 한 개씩 출력하는 것이 목적이다.
a = input().split()
for i in a:
print(i)
if i == 'q':
break
입력 된 값들을 list 형으로 a에 넣은 후 요소들을 이용해 for문을 돌린다. 이때 예시 출력 결과를 본다면 'q'까지 출력이 되므로 print(i)를 조건문 보다 위에해야한다. i를 출력한 후에는 i == 'q'인지 검사하는 조건식을 만든다. 만약 'q'가 맞다면 break로 반복문을 탈출한다.
1부터 1씩 더해가며 합을 만들어가는데, 그 합이 입력된 정수와 같거나 커진 순간 마지막에 더한 정수를 출력하는 것이 목적이다.
a = int(input())
i, tmp = 1, 0
while True:
tmp += i
if tmp >= a:
print(i)
break
i += 1
for문은 리스트나 범위가 정해져있을 때 쓰기 좋지만, 1080번 문제같이 범위가 모호하면 쓰기 애매하다. 이번 문제는 while 반복문으로 풀었다. a는 입력 받은 값을 정수형으로 변환해서 저장된 변수, i는 더하는 값, tmp는 총합을 나타내는 변수다. 반복문의 조건은 True로 주어 break가 실행되지 않는한 무한으로 반복되게 작성했고, 반복문 다음으로 tmp에 i를 더해줌으로써 1~n까지의 합을 구해준다. 만약 합이 들어있는 tmp가 입력된 값보다 크거나 같다면, 그 전에 더했던 i를 출력하고 반복문을 종료한다. 만약 아닐 경우 i에 1을 더해준다.
주어진 값까지의 숫자가 적힌 주사위를 던졌을 때 나올 수 있는 모든 경우를 구해서 출력하는 것이 목적이다.
a, b = map(int,input().split())
for i in range(1, a+1):
for j in range(1, b+1):
print(i,j)
중첩 for문을 사용해서 풀었다. 주사위 2개를 던졌을 때 나올 수 있는 모든 경우의 수를 구해야 하므로, for문 2개의 range 범위를 각각 1부터 첫번째 입력 값 + 1, 1부터 두번째 입력 값 + 2로 정하면 된다.
그리고 두번째 for문 안에서 i,j를 출력해주면 모든 경우의 수가 출력된다.
위 입력 예시처럼 2, 3이 인풋됐다 가정하면,
i : 1 j : 1
j : 2
j : 3
i : 2 j : 1
j : 2
j : 3
이런식으로 모든 경우의 값이 출력되도록 작성했다.
16진수 구구단을 만드는 것이 목적이다.
a = int(input(),16)
for i in range(1,16):
print("%s*%s=%s" % (str(hex(a))[2:].upper(),str(hex(i))[2:].upper(),str(hex(a*i))[2:].upper()))
처음에는 쉬울줄 알았으나 출력 결과를 보면 16진수 a,b,c,d,e,f는 모두 대문자로 출력된다. for문으로 16진수이므로 1~15까지 값을 i에 받아오고 연산을 수행했다. 파이썬에서 hex나 %x를 쓸 경우 소문자로 출력되기 때문에 str, hex하고 문자열로 변환된 값에 upper로 대문자로 만들어 주었다.
1부터 입력된 정수까지 공백으로 간격으로 주어 출력하는데, 해당 값이 3, 6, 9인 경우 'X'를 대신 출력하는 것이 목적이다.
a = int(input())
for i in range(1,a+1):
if i % 3 == 0:
print('X',end=' ')
continue
print(i,end=' ')
3, 6, 9 모두 3으로 나눴을 때 나머지가 0이라는 특징이 있다. 이를 이용해서 for 문은 range(1,<입력 값+1>)까지 범위를 지정하고 i % 3 == 0일시 X를 출력하고 continue로 다시 반복문 처음으로 되돌린다. 만약 아닐 경우 i를 그대로 출력한다. 이때 출력 예시처럼 1줄로 출력되야하므로 end=' '조건을 주어 공백 간격으로 출력되도록 작성했다.
입력 값이 3개 주어지는데, 0에서 각각의 주어진 값들로 만들 수 있는 모든 경우의 수를 출력하는 것이 목적이다.
a, b, c = map(int,input().split())
count = 0
for i in range(0,a):
for j in range(0,b):
for k in range(0,c):
print(i,j,k)
count += 1
print(count)
1081번 문제와 비슷한 문제로 값이 3개로 늘었다는 점만 다르다. 1081번 원리와 동일하므로 간단히 정리하겠다. 이번 문제도 역시 for문을 3개 만들어서 각각 rgb에 해당되는 모든 경우의 수가 출력되도록 했다.
4 값이 주어지는데 이 값들을 곱한 후 MB 단위로 출력하는 것이 목적이다.
a, b, c, d = map(int, input().split())
bit = a*b*c*d
print("%.1f MB" % (bit/(8*1024*1024)))
주어진 값들을 모두 곱하면 비트 단위의 값이 된다. MB 단위로 출력해야하기 때문에, 1바이트는 8비트이므로 /8, 1킬로 바이트는 1024 바이트이므로 /1024, 1 메가바이트는 1024 킬로바이트이므로 /1024, 마지막으로 소수점 첫째 자리로 나타내야하기 때문에 %.1f를 써서 작성했다.
1085 문제와 비슷하게 3 값이 주어지고 3값의 곱을 MB 단위로 나타내는 것이 목적이다.
a, b, c = map(int, input().split())
bit = a*b*c
print("%.2f MB" % (bit/(8*1024*1024)))
마찬가지로 /8, /1024, /1024를 해준 후 소수점 둘째자리이므로 %.2f를 넣어줬다.
위에 나왔던 1080번 문제와 비슷한 문제다. 다만 여기서 다른점은 자연수 범위와 합을 출력한다는 점이다.
a = int(input())
i, tmp = 1, 0
while True:
tmp += i
if tmp >= a:
print(tmp)
break
i += 1
1080번 문제와 코드는 한 부분 빼고 똑같다. print(i) -> print(tmp)를 써줬는데, 합이 입력한 값보다 커진다면, 그때까지의 합을 출력해줘야하기 때문이다.
1부터 입력받은 값까지 1씩 증가해서 출력하는 것이 목적이다. 단 3의 배수는 출력하면 안된다.
a = int(input())
for i in range(1,a+1):
if i % 3 == 0:
continue
print(i,end=' ')
range로 입력한 값+1까지 끝값을 정해주고 for문으로 반복을 하게 했다. 만약 i % 3 == 0, 즉 3의 배수일 경우에는 continue를 써줘서 반복문 처음으로 돌아가게 해줬고, 아닐 경우 i를 출력하도록 작성했다. 출력 예시를 보면 1줄로 공백 으로 구분해서 출력되므로 print에 end=' ' 옵션을 줬다.
세 값이 입력되는데, 첫 번째 값은 시작 값, 두 번째 값은 등차(증가폭)의 값, 마지막 값은 몇 번째인지를 의미하는 값이다. 즉 시작 값부터 등차 값으로 수를 증가시키는데, 그 중 마지막으로 입력되는 값 번째에 해당하는 수를 출력하는 것이다.
a, b, c = map(int,input().split())
count = 1
while True:
if count == c:
print(a)
break
a += b
count += 1
a, b, c는 각각 시작 값, 등차 값, (몇) 번째 값을 의미하는 변수로 해당 값이 입력을 통해 저장된다. 반복문에서 a는 등차만큼 증가 시킨 값이 저장될 것이다.
count는 현재 몇 번째 값인지를 식별해주는 변수다.
for문을 고려해보긴 했지만 아무래도 range로 나타내긴 좀 애매한 면이 있어서, while True로 무한 루프를 줬다.
만약 count가 c보다 같다면 현재 값이 해당 번째의 값이라는 뜻이므로 반복을 멈추고 값이 누적된 a를 출력한 후 반복을 끝낸다. 아닐 경우 a에 증가폭인 b를 더해주고, count에도 1을 더해준다.
1089번 문제와 조금 다르게 이번에는 입력 값이 시작 값, 등비 값, (몇) 번째 값이 입력된다. 등비 만큼 곱해줘서 해당 번째 값이 되면 그 값을 출력하는 것이 목적이다.
a, b, c = map(int,input().split())
count = 1
while True:
if count >= c:
print(a)
break
a *= b
count += 1
1089번 문제의 코드에서 a += b 부분을 a *= 부분으로 바꿨다. 1089번은 등차였지만 이 문제는 등비기 때문에 더하기 대신 곱해줘야하기 때문이다. 나머지 부분은 똑같이 작성했다.
1089, 1090을 합친듯한 문제로 이번에는 4개의 값이 주어진다. 각각 시작 값, 등비(곱할) 값, 등차(더할) 값, (몇) 번째 값이 입력된다. 위에 사진에는 안나와 있지만 순서는 곱하고 더하는 순으로 진행된다. 해당 번째의 값을 출력하는 것이 목적이다.
a, b, c, d = map(int,input().split())
count = 1
while True:
if count >= d:
print(a)
break
a *= b
a += c
count += 1
1089, 1090 코드에서 *=, += 부분만 넣어줬다. b는 곱하고, c는 더하는 역할이기 때문에, 값을 누적하는 변수 a에 b를 곱한 다음 c를 곱해주면 제대로 된 결과 값이 나온다.
입력 된 세 값의 최소 공배수를 구하는 것이 목적이다.
a, b, c = map(int,input().split())
count = 1
while True:
if count % a == 0 and count % b == 0 and count % c == 0:
print(count)
break
count += 1
일단 끝 값이 존재하지 않으므로 for문은 부적절하다 판단해 while문을 썻다. count는 1부터 시작하는데 이유는 0부터 시작한다면 0은 뭘로 나눠도 나머지가 0이기 때문에 0을 최소 공배수로 인식하기 때문이다. 1번 반복할 때마다 count는 1씩 증가한다. 이 값이 a,b,c로 각각 나눴을 때 나머지가 0이라면 최소 공배수란 뜻이므로 이 경우 count를 출력하고 조건문을 탈출하게 작성했다.
첫 번째 줄에는 출석을 부른 횟수(저장할 리스트의 크기), 두 번째 줄에는 횟수만큼의 1~23 사이의 값들이 입력된다. 1부터 23까지 각 값이 두 번째 줄에서 몇번 입력됐는지를 구하는 것이 목적이다.
a = int(input())
b = list(map(int,input().split()))
answer = [0 for i in range(1,24)]
for i in b:
answer[i-1] += 1
for i in answer:
print(i, end=' ')
a는 출석을 부른 횟수를 저장, b는 리스트형으로 횟수만큼 값들이 입력된다. answer는 최종적으로 출력할 값을 나타내는 리스트다. answer는 0이 들어가 있는 23개의 요소가 존재하는데, for문으로 b의 요소를 꺼내면서 answer의 해당 요소 -1 인덱스의 값을 1씩 증가 시켜준다. 즉 출석을 부른 번호에 해당하는 answer 인덱스를 1 증가 시켜줌으로써 몇번 호출했는지를 구해주는 것이다. 그 다음 answer의 요소들을 end= ' ' 옵션을 준 print 함수에서 출력하여 출력 예시와 같은 형식으로 출력되도록 작성했다.
첫 번째 줄에는 출석을 부른 횟수(저장할 리스트의 크기), 두 번째 줄에는 횟수만큼의 1~23 사이의 값들이 입력된다. 두 번째 줄에서 입력된 값을 거꾸로 뒤집어서 출력하는 것이 목적이다.
a = int(input())
b = list(map(int,input().split()))
for i in reversed(b):
print(i, end=' ')
1093번 문제와 마찬가지로 a는 횟수를 담고, b는 횟수만큼의 1~23까지 값들을 담는다. 입력 값들을 담아 만들어진 리스트 b를 리스트의 요소들을 반대로 뒤집어주는 함수인 reversed로 감싼 상태로 for문을 돌린다면 i에 값들이 거꾸로 담기게 된다. 이 담긴 값을 end=' ' 옵션을 주어 출력하면 출력 예시와 같은 형식으로 결과가 나온다.
첫 번째 줄에는 출석을 부른 횟수(저장할 리스트의 크기), 두 번째 줄에는 횟수만큼의 1~23 사이의 값들이 입력된다. 두 번째 줄에서 입력된 값들 중 가장 작은(빠른) 값을 출력하는 것이 목적이다.
a = int(input())
b = list(map(int,input().split()))
print(min(b))
1093번 문제와 마찬가지로 a는 횟수를 담고, b는 횟수만큼의 1~23까지 값들을 담는다. 가장 빠른 번호라는 것은 가장 작은 번호와 같으므로, 입력 값들을 담아 만들어진 b에 리스트에서 가장 작은 값을 구해주는 함수인 min으로 감싸서 출력한다면 가장 작은(빠른) 값이 결과로 나온다.
19*19 크기의 바둑판에 돌을 둔다 할 때, 돌이 올려진 바둑판의 상황을 출력하는 것이 목적이다. 돌이 있는 위치는 1, 없는 곳은 0으로 출력한다. 또한 입력 값은 첫 번째는 돌의 개수, 두 번째 부터는 그 돌이 둬진 좌표를 입력 받는다.(줄단위로)
board = [[0 for i in range(1,20)] for j in range(1,20)]
count = int(input())
for i in range(count):
posX, posY = map(int, input().split())
board[posX-1][posY-1] = 1
for i in range(19):
for j in range(19):
print(board[i][j], end=' ')
print()
1행에서 2중 for문을 이용해서 19X19 크기의 리스트를 0으로 모두 채워줬다. 2행으로 돌의 개수를 받고 그만큼 반복을 시켜서 돌의 좌표를 받는다. 이때 돌의 좌표를 받자마자 board의 해당 좌표 -1 인덱스에 1을 넣어준다. -1을 해주는 이유는 list는 0,0부터 시작이고 바둑판의 좌표는 1,1부터 시작이기 때문이다. 그리고 중첩 for문을 이용해 board의 요소들을 end = ' '옵션을 주어 출력하는데, 이때 19개가 출력되면 행 바꿈을 해줘야하기에 두 번째 for문 밖에, 행 전환용으로 print()를 넣어줬다.
02-04 (Codeup 1097 ~ 1099)
바둑판의 상황이 19 * 19로 입력되고, 십자 뒤집기 횟수가 입력된다. 십자 뒤집기의 좌표가 횟수 만큼 입력되는데, 그 좌표 기준으로 십자 뒤집기를 해주면 된다.
class Position:
def __init__(self,posX,posY):
self.x = posX
self.y = posY
board = []
for i in range(19):
board.append(input().split())
count = int(input())
for i in range(count):
x, y = map(int,input().split())
pos1 = Position(x-1,y-1)
for i in range(19):
board[pos1.x][i] = '1' if board[pos1.x][i] == '0' else '0'
board[i][pos1.y] = '1' if board[i][pos1.y] == '0' else '0'
for i in range(19):
for j in range(19):
print(board[i][j], end=' ')
print()
먼저 좌표를 담은 class를 만들었다. 변수 2개로 사용해도 상관은 없지만 클래스를 복습할 겸 x,y를 속성으로 가지는 Position을 작성했다. 19개의 값씩 19줄로 바둑판 상황이 입력되므로 2차원 배열로 한 줄씩 리스트로 가져와 board에 넣어줬다. 그리고 횟수를 입력 받고 그 횟수만큼 십자 뒤집기 좌표를 입력받아서 Position의 인스턴스 pos1의 인수로 사용한다. 이때 입력 좌표 -1을 해주는데, 이유는 문제 기준으로는 첫 좌표가 1,1이지만 리스트에서는 0,0이기 때문이다. 그 다음 중첩 for문으로 십자 뒤집기를 수행하는데, 이 십자 뒤집기란 입력 좌표 기준, x와 y의 모든 칸을 0 -> 1, 1 -> 0으로 바꿔주는 것이다. 가로, 세로 19개로 이루어져 있으므로 19번 반복하도록 조건을 세우고 pos1.x, i를 1줄 if문으로 해당 인덱스의 값이 0이라면 1, 1이라면 0을 넣어준다. 이 과정을 횟수만큼 반복해준 후, 출력 예시(예시가 너무 길어서 입력과 출력만 캡처했다.)대로 출력하기 위해서 중첩 for문과 end= ' ', 개행을 적절히 활용하여 출력 예시대로 결과가 나오도록 작성했다.
첫 줄에 격자판의 크기가 주어지고, 두 번째 줄에 막대의 개수, 세 번째 줄부터 막대의 길이, 방향, 좌표가 입력된다.
막대에 의해 가려진 부분을 1, 아닌 부분은 0으로 격자판을 출력하는 것이 목적이다.
board = []
a, b = map(int,input().split())
for i in range(a):
board.append([0 for j in range(b)])
c = int(input())
for i in range(c):
l, d, x, y = map(int,input().split())
x -= 1
y -= 1
if d == 0:
for j in range(l):
board[x][y+j] = '1'
else:
for j in range(l):
board[x+j][y] = '1'
for i in range(a):
for j in range(b):
print(board[i][j],end=' ')
print()
입력을 보면, 가로부터가 아닌 세로부터 입력 된다 적혀있다. (이 부분을 놓쳐 이 문제에서 유독 시간을 많이 썻다.)
격자판은 for문과 리스트 표현식으로 작성했는데, 중요한건 가로, 세로의 값을 잘 넣어줘야한다. 위 코드에서는 가로 길이 b, 세로 길이 a이므로 for 반복은 a만큼, 2차원에는 b만큼 리스트 표현식으로 반복해서 0을 넣어줘서 격자판을 만들었다. c로 입력 받을 수를 받고, c만큼 막대의 길이(l), 방향(d), 좌표(x,y)를 입력 받는다.그리고 좌표는 1씩 빼 주는데, 이유는 예시의 격자판은 첫 좌표가 1,1로 시작하지만, 리스트는 0,0으로 시작하기 때문이다. d는 방향을 의미하므로 d가 0이면 막대가 세로기 때문에 막대의 길이(l)만큼 반복문을 돌리고, 돌릴 때마다 board의 x 좌표, 그리고 y + j(range(l)을 차례대로 전달 받음)에 1을 넣어주면 길이만큼 세로로 막대가 만들어진다. d가 1이면 막대가 가로기 때문에 똑같이 막대의 길이 만큼 반복문을 돌리지만 이번에는 x+j, y 위치에 1을 넣어주면 길이만큼 가로로 막대가 만들어진다.
격자판에 막대들을 넣은 후 출력 형식에 맞게 중첩 for문으로 요소를 출력해주도록 작성했다.
미로 구조가 입력으로 주어지고, 0은 갈 수 있는 곳, 1은 벽, 2는 먹이(목적)을 의미한다. 개미는 2,2(리스트 기준 1,1)에서 이동을 시작하고 오른쪽으로만 움직이다가 벽을 만나면 아래쪽으로 움직인다한다. 이동경로를 9로 나타내고 먹이를 먹는다면 더 이상 이동 X, 맨 아래, 맨 오른쪽에 도착했을 때도 이동을 안한다고 한다. 이동 경로를 미로 구조에 나타내 출력하는 것이 목적이다.
board = []
for i in range(10):
board.append(input().split())
check = False
check = True if board[1][1] == '2' else False
board[1][1] = '9'
x = y = 1
while check != True:
if x + 1 < 10 and board[y][x+1] != '1':
x += 1
elif y + 1 < 10 and board[y+1][x] != '1':
y += 1
else:
break
if board[y][x] == '2':
board[y][x] = '9'
break
board[y][x] = '9'
for i in range(10):
for j in range(10):
print(board[i][j],end=' ')
print()
미로의 크기가 10X10으로 주어졌으므로 for i in range(10)으로 10개의 값을 리스트로 10번 입력 받아 board에 저장한다. check는 2,2 즉 개미의 위치에 바로 먹이가 있는지 체크해주는 변수로, 내가 작성한 코드 특성상 첫번 째 값을 검사 안한다는 약점이 있으므로, 이를 보완해 1줄 if문으로 개미의 위치에 먹이가 있다면 True, 없다면 False를 넣어준다. 그리고 2,2 즉 리스트에서는 1,1은 먹이가 있든 없든 무조건 개미의 이동경로가 되므로 9로 바꿔준다. x,y는 개미의 위치를 저장할 변수다. 개미가 먹이를 찾거나, 더 이상 이동을 못할 때까지 이동하기 위해서 반복문을 써주고, 조건은 만약 개미의 위치에 먹이가 바로 있을 경우 반복문을 즉시 종료해야하므로 check != True로 작성했다. 반복문에는 if, elif, else 조건문과 if문이 존재하는데, if, elif, else 부분은 먼저 x, y에 각각 1을 더 했을 때 10과 같거나 커져 인덱스 에러를 발생 시키지 않기 위해 x+1 < 10, y+1 < 10으로 선수 조건을 적어 줬다. 만약 각각 1을 더한 값이 10보다 작다면 1을 더한 위치의 board 값이 '1'이 아닌지 체크하고 '1'이 아니라면 1을 더해준다. 개미는 오른쪽을 우선으로 가고, 오른쪽이 막혔을 시 아래쪽으로 가므로, 맨 처음 if에서 먼저 오른쪽이 벽인지 체크해준 다음 벽이라면 elif로 아래쪽이 벽인지 체크해준다. 만약 두 조건에 만족하지 못한다면 더 이상 이동할 수 있는 곳이 없으므로 break를 해줘서 현재까지의 경로만 출력한다.
if, elif를 통해 x, y에 1을 더해줬을 때, 그 위치가 먹이, 즉 '2'라면 먹이를 찾은 것이므로 해당 위치의 board 값을 '9'로 변경하고 break로 반복문을 종료해 먹이까지의 경로를 출력한다. 만약 2가 아니라면 먹이를 못찾은 것이므로 해당 위치의 board 값에 '9'를 넣어 이동경로를 표기하고 반복문 위쪽으로 가서 오른쪽, 혹은 왼쪽 이동 가능 여부를 체크하고 이동하는 것을 반복한다.
'Old (2021.01 ~ 2021.12) > Algorithm' 카테고리의 다른 글
CodeUp 1098 : 설탕과자 뽑기 (0) | 2021.03.07 |
---|---|
CodeUp 1810 : (포인터) 부분 문자열 (0) | 2021.03.07 |
CodeUp 1581 : swap 함수 만들기 (0) | 2021.03.07 |
CodeUp WriteUp With C Language (0) | 2021.02.27 |
CodeUp 1001 ~ 1075 With Python (0) | 2021.02.01 |