이것이 코딩테스트다 with 파이썬 (나동빈 저) 책 p.322 문제
알파벳 대문자와 숫자(0~9)로만 구성된 문자열이 입력으로 주어진다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력한다. 예를 들어 K1KA5CB7 이라는 값이 들어오면 ABCKK13 을 출력한다.
입력
첫째 줄에 하나의 문자열 S가 주어진다. (1 <= S의 길이 <= 10,000)
출력
첫째 줄에 문제에서 요구하는 정답을 출력한다.
입력 예시
K1KA5CB7
출력 예시
ABCKK13
입력 예시2
AJKDLSI412K4JSJ9D
출력 예시2
ADDIJJJKKLSS20
s = input()
alpha = []
num = []
for i in s:
if ord('A') <= ord(i) <= ord('Z'):
alpha.append(i)
elif 0 <= int(i) <= 9:
num.append(int(i))
alpha.sort()
alpha.append(str(sum(num)))
print("".join(alpha))
data = input()
result = []
value = 0
#문자를 하나씩 확인하며
for x in data:
#알파벳인 경우 결과 리스트에 삽입
if x.isalpha():
result.append(x)
#숫자는 따로 더하기
else:
value += int(x)
#알파벳 오름순 정렬
result.sort()
#숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0:
result.append(str(value))
#최종 결과 출력(리스트 -> 문자열 변환 출력)
print(''.join(result))
나는 isalpha()라는, 알파벳인지 아닌지 구별해주는 간단한 문법을 생각해내지 못했다. 그래서 ord()를 이용해 알파벳인지 아닌지 구분했다. 또한, 숫자가 하나도 없는 경우를 떠올리지 못했다.
"".join(리스트) -> 리스트를 문자열로 변환해준다.
isaplha() -> 알파벳인지 아닌지 구분해준다.
https://www.acmicpc.net/problem/18406
어떤 게임의 아웃복서 캐릭터에게는 럭키 스트레이트라는 기술이 존재한다. 이 기술은 매우 강력한 대신에 항상 사용할 수는 없으며, 현재 게임 내에서 점수가 특정 조건을 만족할 때만 사용할 수 있다.
특정 조건이란 현재 캐릭터의 점수를 N이라고 할 때 점수 N을 자릿수를 기준으로 반으로 나누어 왼쪽 부분의 각 자릿수의 합과 오른쪽 부분의 각 자릿수의 합을 더한 값이 동일한 상황을 의미한다. 예를 들어 현재 점수가 123,402라면 왼쪽 부분의 각 자릿수의 합은 1+2+3, 오른쪽 부분의 각 자릿수의 합은 4+0+2이므로 두 합이 6으로 동일하여 럭키 스트레이트를 사용할 수 있다.
현재 점수 N이 주어졌을 때, 럭키 스트레이트를 사용할 수 있는 상태인지 아닌지를 알려주는 프로그램을 작성하시오. 럭키 스트레이트를 사용할 수 있다면 "LUCKY"를, 사용할 수 없다면 "READY"라는 단어를 출력한다. 또한 점수 N의 자릿수는 항상 짝수 형태로만 주어진다. 예를 들어 자릿수가 5인 12,345와 같은 수는 입력으로 들어오지 않는다.
입력
첫째 줄에 점수 N이 정수로 주어진다. (10 ≤ N ≤ 99,999,999) 단, 점수 N의 자릿수는 항상 짝수 형태로만 주어진다.
출력
첫째 줄에 럭키 스트레이트를 사용할 수 있다면 "LUCKY"를, 사용할 수 없다면 "READY"라는 단어를 출력한다.
data = input()
length = len(data) // 2
firstsum = 0
secondsum = 0
for i in range(0, length):
firstsum += int(data[i])
for i in range(length, len(data)):
secondsum += int(data[i])
if firstsum == secondsum:
print("LUCKY")
else:
print("READY")
https://www.acmicpc.net/problem/4673
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력
입력은 없다.
출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
array = []
for i in (1, 10001):
array.append(i)
newArray = []
for i in array:
if len(str(array[i])) == 1:
k = array[i] + array[i]
newArray.append(k)
elif len(str(array[i])) == 2:
k = array[i] + array[i]//10 + array[i]%10
newArray.append(k)
elif len(str(array[i])) == 3:
k = array[i] + array[i]//100 + array[i]//100//10 + array[i]%10
newArray.append(k)
elif len(str(array[i])) == 4:
k = array[i] + array[i]//1000 + array[i]//1000//100 + array[i]//1000//100//10 + array[i]%10
newArray.append(k)
else:
break
newSet = set(newArray)
originSet = set(array)
originSet = originSet - newSet
array = list(originSet)
for i in array:
print(i)
# 1부터 1000까지 저장
array = []
for i in range(1, 10001):
array.append(i)
# 생성자로 인해 만들어지는 수열을 저장할 리스트
newArray = []
m = 0
for i in array:
iStr = str(i)
# 각 자리의 수를 더하는 반복문
for k in range(len(iStr)):
m += int(iStr[k])
m += i # 각 자리의 수를 더한 값에 원래값을 더해줌
newArray.append(m) # 리스트에 추가
m = 0 # m값 초기화
# 셀프 넘버 구하기 (각 리스트를 set로 변환한 뒤 차집합 구하기)
# set로 변환하는 과정에서 중복된 값이 제거된다.
selfnum = set(array) - set(newArray)
array = list(selfnum)
array.sort() # 오름차순 정렬
for i in array:
print(i)
각 자리의 수를 더하는 방법을 고민했는데, 뭔가 자꾸 나는 어렵고 복잡한 코드로 풀게 되어서 구글링을 해서 방법을 찾아보았다. 그 결과 숫자를 문자열(배열)로 바꾸어 문자열의 길이만큼 반복하며 각 자리의 수를 더하는 방식을 이용했다.
어제 set이라는 개념에 대해 공부하며 차집합에 대해 정리했었는데, 이 문제에 적용하면 좋을 것 같다는 생각이 들어 적용해보았다. 다행히 잘 작동했다.
그리고 반복문을 쓸 때 자꾸 range()를 쓰는 것을 까먹는다,,! range를 안쓰는 바람에 결과값에 1과 10001만 있어서 당황했다..! 코드에서 잘못된건줄 알았는데 그냥 range를 안써서 문제가 발생하고 있었다.. 그리고 변수명을 어떻게 주어야 보기 좋을지도 생각을 해봐야겠다.
https://www.acmicpc.net/problem/3190
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.
게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다.
뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.
입력
첫째 줄에 보드의 크기 N이 주어진다. (2 ≤ N ≤ 100) 다음 줄에 사과의 개수 K가 주어진다. (0 ≤ K ≤ 100)
다음 K개의 줄에는 사과의 위치가 주어지는데, 첫 번째 정수는 행, 두 번째 정수는 열 위치를 의미한다. 사과의 위치는 모두 다르며, 맨 위 맨 좌측 (1행 1열) 에는 사과가 없다.
다음 줄에는 뱀의 방향 변환 횟수 L 이 주어진다. (1 ≤ L ≤ 100)
다음 L개의 줄에는 뱀의 방향 변환 정보가 주어지는데, 정수 X와 문자 C로 이루어져 있으며. 게임 시작 시간으로부터 X초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다는 뜻이다. X는 10,000 이하의 양의 정수이며, 방향 전환 정보는 X가 증가하는 순으로 주어진다.
출력
첫째 줄에 게임이 몇 초에 끝나는지 출력한다.
n = int(input()) # 보드의 크기
board = [[0] * n for _ in range(n)] # nXn 보드 생성, 0으로 초기화
k = int(input()) # 사과의 개수
for _ in range(k):
x, y = map(int, input().split())
board[x][y] = 3 # 사과 있는 곳 표시
L = int(input()) # 방향 변환 횟수
rotate = []
for _ in range(L):
rotate.append(list(map(str, input().split())))
# 북, 동, 남, 서 방향정의 (상 우 하 좌)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
direction = 1 # 초기 방향 : 오른쪽
def turn_left():
global direction
direction -= 1
if direction == -1:
direction = 3
def turn_right():
global direction
direction += 1
if direction == -1:
direction = 3
time = 0
if dx < 1 or dy < 1 or dx > n or dy > n :
print(time+1)
-> 포기,,
# 끝을 만났을 때는 die
# apple -> 몸길이 +1,
# (0,0)부터 시작
def Solution():
time = 0
# 북동남서
snake_array = []
direction = {0:(0,1), 1:(1,0),2:(0,-1),3:(-1,0)}
dir = 0 # 동쪽
# empty:0, 사과:1, 뱀:2
nx,ny = 0,0
board[0][0] = 2 # start
snake_array.append([0,0])
# 끝날때까지 돌기
while(1):
time += 1
nx = nx + direction[dir][0]
ny = ny + direction[dir][1]
if not 0<= nx <N or not 0<= ny <N:
break
# apple
if board[nx][ny] == 1:
board[nx][ny] = 2 # 머리 이동
snake_array.append([nx,ny])
# empty
elif board[nx][ny] == 0:
board[nx][ny] = 2
snake_array.append([nx,ny])
del_x, del_y = snake_array.pop(0)
board[del_x][del_y] = 0
# snake 몸통
elif board[nx][ny] == 2:
break
if len(snake_dir) != 0 and time == snake_dir[0][0]:
time, new_dir = snake_dir.pop(0)
if new_dir == 'L': # 왼쪽
dir = (dir + 3) % 4
elif new_dir == 'D':
dir = (dir + 1) % 4
return time
# 오른쪽/ 왼쪽 방향 바꾸는 건 % 연산자 이용하여 쉽게 할 수 있음
# 왼쪽으로 돌리기 = (현재 방향 + 3) % 4
# 오른쪽으로 돌리기 = (현재 방향 + 1) % 4
# board
N = int(input())
board = [[0 for i in range(N)] for j in range(N)]
# apple 넣기
k = int(input())
apple_locs = []
for _ in range(k):
x, y = map(int, input().split())
board[x-1][y-1] = 1
# snake 시간, 방향
l = int(input())
# (sec, c(left) or d(right))
snake_dir = list(map(lambda x:[int(x[0]),str(x[1])],\
[input().split() for _ in range(l)]))
print(Solution())
열심히 풀어보려다 너무 어려워서,, 중간에 포~기,, 주말에 복습 꼭 해야겠다,, 뭔가 느낌은 알거 같은데 느낌만 알 것 같다,, 동서남북 방향이랑 왼쪽, 오른쪽 회전하는걸 연결시키는게 좀 어렵다 ..
https://velog.io/@dlgk0205/Python-%EB%B0%B1%EC%A4%80-3190%EB%B2%88-%EB%B1%80
참고 블로그,,
안녕하세요, 김덕우입니다! 3번 문제 결국 푸신 게 정말 대단합니다! 저는 계속 하다가 안돼서 포기했거든요 흑흑 정말 고생하셨습니다! 저도 아직 4번 문제를 못 풀었는데, 풀고 웃음님 코드도 구경하러 오겠습니다!!