본문 바로가기

문제풀이

[백준] 1100번 파이썬 풀이

https://www.acmicpc.net/problem/1100

 

1100번: 하얀 칸

체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램

www.acmicpc.net

[문제]

체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 
가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 
하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.

[입력]

첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.

[출력]

첫째 줄에 문제의 정답을 출력한다.

[예제 입력 1]

.F.F...F
F...F.F.
...F.F.F
F.F...F.
.F...F..
F...F.F.
.F.F.F.F
..FF..F.

[예제 출력 1]

1

[예제 입력 2]

........
........
........
........
........
........
........
........

[예제 출력 2]

0

[예제 입력 3]

FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

[예제 출력 3]

32

[예제 입력 4]

........
..F.....
.....F..
.....F..
........
........
.......F
.F......

[예제 출력 4]

2

나의 풀이

chess = [[False]*8 for _ in range(8)]

for i in range(8):
    for j in range(8):
        if (i+j)%2 == 0:
            chess[i][j] = True

user_input = [list(map(str, input())) for _ in range(8)]
count = 0
for i in range(8):
    for j in range(8):
        if (chess[i][j]==True) and (user_input[i][j]=='F'):
            count += 1
            
print(count)

결과

해당 문제는 8x8의 체스판이 주어져있고 검정 칸과 하얀 칸이 번갈아가며 색칠되어 있다.

가장 왼쪽 위칸 (0,0)은 하얀색이므로, (0,1)은 검은색이라는 것을 알 수 있다.

우리가 찾고자 하는 값은 하얀 칸 위에 F라는 글자가 몇 개 있는지 확인하는 것이다.

문제 이해를 쉽게 하기 위해서 체스판을 그린 뒤 칸마다 번호를 지정해주었다.

여기서 한 가지 특징을 발견할 수 있는데, (i, j)라는 칸이 있을 때 i+j가 홀수이면 검은색이 된다는 것을 알 수 있다.

그래서 초기 2차원 배열을 생성해 줄 때 모두 False로 초기화를 해주고, i+j가 짝수라면 True로 변환해주도록 한다.

chess = [[False]*8 for _ in range(8)] 	#2차원 배열 생성(False로 초기화)

for i in range(8):
    for j in range(8):
        if (i+j)%2 == 0:				#만약 i+j가 짝수라면
            chess[i][j] = True			#True로 변환해준다.

 

이렇게 초기 체스판 설정이 끝난 뒤 사용자의 입력값을 마찬가지로 2차원 배열로 받아준다.

user_input = [list(map(str, input())) for _ in range(8)]

 

이제 하얀색 칸 위에 몇 개의 말이 놓여 있는지를 확인하기 위한 count 변수를 선언해주고, 

반복문을 실행해준다.

count = 0		#하얀색 칸 위에 말이 놓여진 경우를 셀 변수
for i in range(8):
    for j in range(8):
        if (chess[i][j]==True) and (user_input[i][j]=='F'):	#하얀색 칸에 F가 놓여진 경우
            count += 1	#count를 1 증가시킨다.

TIP)

 ㅇ 1차원 배열 입력받기

lst = list(map(int, input().split()))

 

 ㅇ 한 줄에 정수형 변수 여러 개 입력받기

num1, num2, num3 = map(int, input().split())

 

 ㅇ 한 줄에 문자열 변수 여러개 입력받기

a,b = input().split()

 

 ㅇ 문자열 여러 줄 입력받기

str_list = [input() for _ in range(n)]
[입력]
ABBAAAB
BBBABBB
BABABAA
BABABBB
ABBABAA
[출력]
print(str_list)
['ABBAAAB', 'BBBABBB', 'BABABAA', 'BABABBB', 'ABBABAA']

 

 ㅇ 문자열 여러 줄 입력받기(한 줄에 띄어쓰기 없이)

lst = [list(map(int, input())) for _ in range(n)]
[입력]
101111
101010
101011
111011
[출력]
[[1,0,1,1,1,1], [1,0,1,0,1,0], [1,0,1,0,1,1], [1,1,1,0,1,1]]

 

 ㅇ 2차원 배열 입력받기

lst = [list(map(int, input().split())) for _ in range(n)]
[입력]
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
[출력]
print(lst)
[[1,2,3,4,5], [2,3,4,5,6], [3,4,5,6,7], [4,5,6,7,8], [5,6,7,8,9]]

'문제풀이' 카테고리의 다른 글

[백준] 1267번 파이썬 풀이  (0) 2022.03.23
[백준] 10870번 파이썬 풀이  (0) 2022.03.21
[백준] 1009번 파이썬 풀이  (0) 2022.03.20
[백준] 1076번 파이썬 풀이  (0) 2022.03.16
[백준] 1546번 파이썬 풀이  (0) 2022.03.15