문제 링크: https://www.acmicpc.net/problem/2290
일단 이 문제는 남들은 간단하다고 했는데, 나한테는 어려운 문제였다...
내가 참고한 풀이: https://whatryando.tistory.com/90
나의 마지막 풀이
n = input('')
num_1 = [[' ', ' ', ' '], [' ', ' ', '|'], [' ', ' ', ' '], [' ', ' ', '|'],
[' ', ' ', ' ']]
num_2 = [[' ', '-', ' '], [' ', ' ', '|'], [' ', '-', ' '], ['|', ' ', ' '],
[' ', '-', ' ']]
num_3 = [[' ', '-', ' '], [' ', ' ', '|'], [' ', '-', ' '], [' ', ' ', '|'],
[' ', '-', ' ']]
num_4 = [[' ', ' ', ' '], ['|', ' ', '|'], [' ', '-', ' '], [' ', ' ', '|'],
[' ', ' ', ' ']]
num_5 = [[' ', '-', ' '], ['|', ' ', ' '], [' ', '-', ' '], [' ', ' ', '|'],
[' ', '-', ' ']]
num_6 = [[' ', '-', ' '], ['|', ' ', ' '], [' ', '-', ' '], ['|', ' ', '|'],
[' ', '-', ' ']]
num_7 = [[' ', '-', ' '], [' ', ' ', '|'], [' ', ' ', ' '], [' ', ' ', '|'],
[' ', ' ', ' ']]
num_8 = [[' ', '-', ' '], ['|', ' ', '|'], [' ', '-', ' '], ['|', ' ', '|'],
[' ', '-', ' ']]
num_9 = [[' ', '-', ' '], ['|', ' ', '|'], [' ', '-', ' '], [' ', ' ', '|'],
[' ', '-', ' ']]
num_0 = [[' ', '-', ' '], ['|', ' ', '|'], [' ', ' ', ' '], ['|', ' ', '|'],
[' ', '-', ' ']]
num_sum_list = []
num_sum_list.append(num_0)
num_sum_list.append(num_1)
num_sum_list.append(num_2)
num_sum_list.append(num_3)
num_sum_list.append(num_4)
num_sum_list.append(num_5)
num_sum_list.append(num_6)
num_sum_list.append(num_7)
num_sum_list.append(num_8)
num_sum_list.append(num_9)
for j in range(5):
for i in range(len(n)):
x = int(n[i])
for k in range(3):
print(num_sum_list[x][j][k], end='')
print()
내가 풀이 했던 방법은 일단 숫자들을 5개의 층으로 나눈다는 생각을 먼저 했다.
총 5개의 층이 있고, 하나의 획은 for 문을 통해 입력받은 s개의 개수만큼 늘려준다는 생각으로 알고리즘을 작성했다. (구현하지 못한 부분)
<단계적으로 설명>
- 먼저 하나의 숫자를 5개의 층으로 나누어서 각자 층대로 하나의 리스트에 저장하여 결국 하나의 숫자를 구성하는 리스트는 2차원 배열이 되도록 한다.
- for문에서 간편하게 출력하기 위해서 각 숫자의 정보를 num_sum_list라는 리스트에 요소들로 추가한다.
- 1) 총 3개의 for문을 이용하는데, 처음 위치한 for문은 5개의 층을 표기하기 위해 인덱스를 총 5개를 사용한다.
2) 두 번째 위치한 for문은 원하는 숫자를, 즉 입력된 숫자를 출력하기 위해서 입력받은 숫자의 길이를 for문의 인덱스로 사용하고, 인덱스 번호를 활용해서 입력된 숫자의 해당 인덱스에 맞는 숫자를 x라는 변수에 정수형태로 넣어주게 된다.
3) 세 번째 for문은 현재 숫자를 표현하는 배열의 형태를 보면 최종적으로는 3개의 배열인자를 가지고 있는 1차원 배열이 여러개있는 2차원 배열이기에 그 3개의 배열인자를 표현해주기 위해서 3개의 인자를 활용한다.
4) print문을 활용해 해당 인자를 출력한다. (\n은 제거)
5) 하나의 층을 출력하고 나서는 print()를 통해 다음층으로 가기전에 줄바꿈을 진행한다.
내가 참고한 풀이 방법
s, nums = input().split()
info = { # 각자 LCD 번호중 몇번이 on 해야 하는지 리스트를 통해서 표현한다. 세븐 세그먼트의 번호를 그대로 적용
'0': [1, 2, 3, 4, 5, 6],
'1': [3, 6],
'2': [2, 3, 4, 5, 7],
'3': [2, 3, 5, 6, 7],
'4': [1, 3, 6, 7],
'5': [1, 2, 5, 6, 7],
'6': [1, 2, 4, 5, 6, 7],
'7': [2, 3, 6],
'8': [1, 2, 3, 4, 5, 6, 7],
'9': [1, 2, 3, 5, 6, 7]
}
s = int(s) #문자열로 입력한 s 변수를 정수형으로 바꿔준다.
answer = [[[' ' for i in range(s + 2)] for j in range(2 * s + 3)]
for k in range(len(nums))]
def lines(board, idx):
for i in idx:
if i == 1:
for j in range(1, s + 1):
board[j][0] = '|'
elif i == 2:
for j in range(s):
board[0][j + 1] = '-'
elif i == 3:
for j in range(1, s + 1):
board[j][s + 1] = '|'
elif i == 4:
for j in range(s + 1, 2 * s + 1):
board[j + 1][0] = '|'
elif i == 5:
for j in range(s):
board[2 * s + 2][j + 1] = '-'
elif i == 6:
for j in range(s + 2, 2 * s + 2):
board[j][s + 1] = '|'
elif i == 7:
for j in range(s):
board[s + 1][j + 1] = '-'
for i, num in enumerate(nums):
lines(answer[i], info[num])
for i in range(2 * s + 3):
for j in range(len(nums)):
if j == len(nums) - 1:
print(''.join(answer[j][i]))
else:
print(''.join(answer[j][i]), end=' ')
내가 제일 먼저 알아보고자 한것은 enumerate함수였다. (처음 봐서...)
이 함수는 enumerate라는 형식의 객체를 생성하며, 고유의 형태를 가지고 있다.
사전적인 enumerate의 의미는 '열거하다'라는 의미로, 이 함수의 형태 또한, 열거를 해준다.
위의 사진을 보면 이 함수의 작동방식을 알 수 있는데, 리스트의 각 요소와 그에 맞는 번호를 하나씩 증가하며 짝 지어 주는 것을 볼 수 있다.
내가 참고한 코드에서도 쓰이고 있는데, for문에서 쓰이고 있어서 두개의 인자를 필요로 하는 for문에서 어떻게 쓰이는지 확인해보았는데,
(사진간의 공백이 왜이리 크지...)
i에는 각 숫자의 부여된 인덱스 값, j에는 입력된 문자열의 각 한개씩의 값이 적용되었다.
for i, num in enumerate(nums):
lines(answer[i], info[num])
위의 내용은 lines라는 함수가 뭔진 모르겠지만, 그 함수에 answers에는 0부터 시작하는 인덱스 번호를, info에는 입력받은 숫자를 나누어 각 한개씩의 숫자를 인자값으로 보내주는 역할을 한다.
answer = [[[' ' for i in range(s + 2)] for j in range(2 * s + 3)]
for k in range(len(nums))]
처음에 이 변수의 내용을 보고 매우 당황했다.
뭐 이런 복잡한 내용이 있나...
그래서 눈으로 보기 위해 위에서 살펴봤던 enumerate를 이용한 for문에 lines함수 대신 print문을 써서 어떻게 이루어지는지 보았다.
for i, num in enumerate(nums):
print(answer[i], info[num])
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [3, 6]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [2, 3, 4, 5, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [2, 3, 5, 6, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [1, 3, 6, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [1, 2, 5, 6, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [1, 2, 4, 5, 6, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [2, 3, 6]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [1, 2, 3, 4, 5, 6, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [1, 2, 3, 5, 6, 7]
[[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']] [1, 2, 3, 4, 5, 6]
이렇게 나왔다.
answer는 공백으로 이루어진 2차원 리스트 생성하는 변수로, 공백의 리스트를 s+2개만큼 생성하고 그것을 2*s+3만큼 생성하고, 이 2차원 리스트를 내가 입력한 숫자의 길이만큼 만들어준다.
또한 info[num]또한 전달되는데, 숫자별로 각자 미리 정해놓은 리스트를 반환해주는 것을 볼 수 있다.
그럼 이것이 반환되는 lines함수는 어떻게 구동이 되는가?
line함수는 우리가 생성한 공백에 우리가 필요한 획을 그려주는 함수이다.
def lines(board, idx):
for i in idx:
if i == 1:
for j in range(1, s + 1):
board[j][0] = '|'
elif i == 2:
for j in range(s):
board[0][j + 1] = '-'
elif i == 3:
for j in range(1, s + 1):
board[j][s + 1] = '|'
elif i == 4:
for j in range(s + 1, 2 * s + 1):
board[j + 1][0] = '|'
elif i == 5:
for j in range(s):
board[2 * s + 2][j + 1] = '-'
elif i == 6:
for j in range(s + 2, 2 * s + 2):
board[j][s + 1] = '|'
elif i == 7:
for j in range(s):
board[s + 1][j + 1] = '-'
우리는 이전에 enumurate를 이용한 for문을 통해서 answer에 인덱스 값을 넣어주었다.
그리고 우리는 info[num]을 통해서 필요한 리스트를 얻게 되었고, lines함수에 answer와 info[num]을 각자 넣어줘서 만약 lines함수에 board==answer[0]이고 idx==info[1]이면 info[1] = '1': [3, 6] 이므로, 3,6 번에 해당하는 값이 공백에서 '|'을 가지게 된다.
이것을 반복하게 되면 우리가 원하는 형태의 출력값을 가지게 된다.
for i in range(2 * s + 3):
for j in range(len(nums)):
if j == len(nums) - 1:
print(''.join(answer[j][i]))
else:
print(''.join(answer[j][i]), end=' ')
총 2s+3만큼의 줄이 필요하기에 for문을 그렇게 작성하고, j가 끝 번호일때는 줄바꿈을, 아닐때는 줄바꿈을 행하지 않음을 통해 올바른 출력을 얻게 된다.
또한 join 함수를 사용함으로써, 리스트 형태가 아닌, 각 요소들만으로 이루어진 출력을 가지게 된다.
join method