해설
입력 받은 수를 내림차순으로 정렬하기만 하면 된다.
list의 경우 sorted에 reverse 옵션을 True로 두면 내림차순이 된다.
답안
if __name__ == '__main__':
N = int(input())
nums = str(N)
nums = ''.join(sorted(nums, reverse=True))
print(nums)
해설
이번 문제에서는 BFS 라는 알고리즘을 살짝 알아둘 필요가 있다.
BFS란, 너비 우선 탐색이라고 불리우는 탐색 방식으로..
가까이 있는 데이터를 우선적으로 탐색하는 것으로 이해하면 된다.
해당 문제에서는 전쟁에 위력을 인접한 사람수의 제곱이기 때문에
인접한 사람수만 잘 구하면, 해당 값의 제곱합으로 답을 도출할 수 있다.
인접한 사람이라는 기준은 해당 사람에서 동서남북(대각선 제외)임으로 현재 위치에서
각각 동서남북 먼저 탐색하면된다.
탐색할 때 주의점은 이전에 방문 곳은 visited로 체크해서 다시 가지 않는 것이고,
탐색했을 때 같은 병사인 경우에만 방문을 한다는 것이다.
즉, visited = 1(또는 Ture)가 아니고, 현재 병사와 방문할 병사의 값이
일치한 경우에만 방문한다.
1. 입력 받기
W_COUNT = 0
B_COUNT = 0
M, N = map(int, input().split())
fields = []
visited = [[0]*M for _ in range(N)]
for i in range(N):
fields.append(str(input()))
W_COUNT 를 우리 병사, 적국은 B_COUNT에 값을 저장하기로 하고, 각각 값을 받는다.
visited는 각 병사들을 탐색했는지(방문했는지) 여부를 저장하기 위해 0으로 초기화 시킨다.
2. 탐색하기
W, B 우리편과 적군이 필드에 듬성듬성 있을 수 있다. 탐색할때 시작점을 정하기 위해서
방문하지 않은 것(if visited[i][j] != 1:)인 경우 탐색을 시작한다.
for i in range(N):
for j in range(M):
if visited[i][j] != 1:
c = bfs(fields, i, j, visited)
# print(i, j, c**2)
if fields[i][j] == 'W':
W_COUNT += (c**2)
else:
B_COUNT += (c**2)
해당 i,j에서 탐색을 시작하면,
c = bfs(fields, i, j, visited)
를 통해서 BFS 탐색을 진행하는데...
def bfs(graph, sx, sy, visited):
movex = [0, 0, -1, 1]
movey = [-1, 1, 0, 0]
queue = deque()
queue.append((sx, sy))
visited[sx][sy] = 1
count = 1
while queue:
vx, vy = queue.popleft()
for i in range(4):
tx = vx+movex[i]
ty = vy+movey[i]
if N > tx >= 0 and M > ty >= 0 and visited[tx][ty] != 1:
if graph[vx][vy] == graph[tx][ty]:
count += 1
queue.append((tx, ty))
visited[tx][ty] = 1
return count
해당 메소드에서 동서남북으로 움직이기 위해 x,y좌표로 각각 움직이는 것을 리스트로 지정한다.
해당 리스트에서 0 번째는 (x:0, y:-1), 1 번째는 (0,1), 2 번째는 (-1,0)
이런식으로 된다.
우선 시작 점의 x, y를 큐안에 넣는다.
queue = deque()
queue.append((sx, sy))
visited[sx][sy] = 1
답안
from collections import deque
import queue
def bfs(graph, sx, sy, visited):
movex = [0, 0, -1, 1]
movey = [-1, 1, 0, 0]
queue = deque()
queue.append((sx, sy))
visited[sx][sy] = 1
count = 1
while queue:
vx, vy = queue.popleft()
for i in range(4):
tx = vx+movex[i]
ty = vy+movey[i]
if N > tx >= 0 and M > ty >= 0 and visited[tx][ty] != 1:
if graph[vx][vy] == graph[tx][ty]:
count += 1
queue.append((tx, ty))
visited[tx][ty] = 1
return count
if __name__ == '__main__':
W_COUNT = 0
B_COUNT = 0
M, N = map(int, input().split())
fields = []
visited = [[0]*M for _ in range(N)]
for i in range(N):
fields.append(str(input()))
for i in range(N):
for j in range(M):
if visited[i][j] != 1:
c = bfs(fields, i, j, visited)
# print(i, j, c**2)
if fields[i][j] == 'W':
W_COUNT += (c**2)
else:
B_COUNT += (c**2)
print(W_COUNT)
print(B_COUNT)
입력 받은 것 뒤에 ??! 을 붙여서 출력하면 된다.
해설
**입력**
따로 int 등의 자료형을 붙이지 않으면 str(string)형태로 들어간다.
a = input()
출력
어떤 변수 뒤에 특정 문자를 붙이려면 +'' 로 붙이기가 가능하다.
print(a+'??!')
답안
if __name__ == '__main__':
a = input()
print(a+'??!')
해설
이 문제는 조금 조심할 부분이 있다.
입력, 출력 시 시간까지 꼼꼼히 해야 시간초과가 안 걸리기 때문이다.
현재 가지고 있는 카드들, 카드가 있냐고 묻는 질문에 따라 카드 수를
카운트하면 된다.
우선 입력을 좀더 빠르게 받으려면 import sys 를 하고,
N = int(sys.stdin.readline())
cards = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
questions = list(map(int, sys.stdin.readline().split()))
counts = {}
sys.stdin.readline() 으로 입력을 받는다. input()과 같은 일을 하고,
좀더 빠르다고 보면 된다.
cards에 현재 가지고 있는 카드 수, 질문들은 questions에 받는다.
counts에는 현재 가지고 있는 카드들의 중복된 카드 수를 계산한다.
for i in cards:
if i not in counts:
counts[i] = 1
else:
counts[i] += 1
counts에 카드 개수가 있어서 각 질문별 카드수를 출력하면 된다!
for i in questions:
if i in counts:
print(counts[i], end=' ')
else:
print(0, end=' ')
답안
import sys
if __name__ == '__main__':
N = int(sys.stdin.readline())
cards = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
questions = list(map(int, sys.stdin.readline().split()))
counts = {}
for i in cards:
if i not in counts:
counts[i] = 1
else:
counts[i] += 1
for i in questions:
if i in counts:
print(counts[i], end=' ')
else:
print(0, end=' ')
해설
파이썬에서 리스트의 특정 값이 몇개가 있는지 체크하기 위해서 count를 사용할 수 있습니다.
nums.count(V)
이렇게 하면 nums에 V가 몇개인지 나오기 때문에 바로 출력하면 됩니다.
답안
if __name__ == '__main__':
N = int(input())
nums = list(map(int, input().split()))
V = int(input())
print(nums.count(V))
년도를 서기가 아닌 불기를 이용한 연도로 바꾸는 내용이다. 불기 연도를 서기 연도로.. 즉, 특정 년도로 빼면 되는 문제이다.
해설
입력
int로 자료형을 정해주어야 출력 쪽 연산이 가능하다.
a = int(input())
출력
print(a-543)
답안
if __name__ == '__main__':
a = int(input())
print(a-543)
1001 번과 다르게 입력을 공백 단위가 아니라 한줄 한줄 받기 때문에 조금 형식이 다르다.
해설
**입력**
한줄 씩 입력을 받아야 하는 상황이라면 아래 처럼 input() 을 이용할 수 있다.
input() 자체가 엔터를 치기 전까지 입력을 받는다고 생각하면 쉽다.
int로 자료 형을 정한다.
a=int(input())
b=int(input())
**출력**
print(a+b)
답안
if __name__ == '__main__':
a=int(input())
b=int(input())
print(a+b)
해설
좌표의 y를 오름차순, 같은 경우 x의 오름차순으로 정렬하는 문제이다.
파이썬에서는 해당 정렬 기준을 아래와 같이 key 옵션으로 줄 수 있다.
positions.sort(key=lambda x: (x[1], x[0]))
이렇게 작성하면 x[1](y)를 기준으로 정렬되고, 같으면 x[0](x)를
기준으로 정렬된다.
정렬 후 해당 자표들을 출력하면 된다.
for i in range(N):
print(positions[i][0], positions[i][1])
답안
if __name__ == '__main__':
N = int(input())
positions = []
for i in range(N):
a, b = map(int, input().split())
positions.append((a, b))
positions.sort(key=lambda x: (x[1], x[0]))
# print(positions)
for i in range(N):
print(positions[i][0], positions[i][1])
A와 B를 입력받아서 뺀 값을 출력하면 된다. 1000 번 문제와 비슷하기 때문에 복습겸 해보자.
해설
**입력**
a, b = map(int, input().split())
입력으로 1 2 가 들어왔을 때
input().split() 을 통해서 공백을 기준으로 1, 2로 나누어 진다.
map(int, ) 를 통해서 각각 int 형으로 a, b에 대입이 가능하다.
string 형태라면 str 으로 넣으면 된다.
**출력**
print(a-b)
출력을 할 때 단순하게 print() 로 출력할 것을 넣으면 된다.
답안
if __name__ == '__main__':
a, b = map(int, input().split())
print(a-b)
A와 B 를 입력 받고 더한 값을 출력하면 되는 문제이다.
해설
**입력**
a, b = map(int, input().split())
입력으로 1 2 가 들어왔을 때
input().split() 을 통해서 공백을 기준으로 1, 2로 나누어 진다.
map(int, ) 를 통해서 각각 int 형으로 a, b에 대입이 가능하다.
string 형태라면 str 으로 넣으면 된다.
**출력**
print(a+b)
출력을 할 때 단순하게 print() 로 출력할 것을 넣으면 된다.
답안
if __name__ == '__main__':
a, b = map(int, input().split())
print(a+b)