백준발행일 2023. 9. 2.원본 https://blog.naver.com/jword_/223200479910 ↗

코딩테스트 기초 파이썬 반복문 - 별찍기

코딩테스트 기초 파이썬 반복문 - 별찍기 — #코딩테스트기초 #파이썬반복문 #별찍기 #개발자의도구들 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 ...

#백준#Naver Blog

#코딩테스트기초 #파이썬반복문 #별찍기 #개발자의도구들

​

AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다.

\*본 게시글은 PC버전에 최적화 되어있습니다.

별찍기

반복문 연습문제

이미지

문제

💡 N이 주어지면 다음과 같이 별(1)이 저장된 배열을 반환하는 프로그램을 작성하시오
N = 5 0 1 2 3 4 5 6 7 8 0| 1 1| 1 1 1 2| 1 1 1 1 1 3| 1 1 1 1 1 1 1 4| 1 1 1 1 1 1 1 1 1 5| 1 1 1 1 1 1 1 6| 1 1 1 1 1 7| 1 1 1 8| 1
N = 2 0 1 2 0| 1 1| 1 1 1 2| 1​

문제풀이

문제를 풀기 위한 과정

1. 접근방법

규칙적인 패턴을 찾고자 많이 노력햇습니다. 다양한 방법으로 구현아 가능하겠지만, 제가 했던 방법은 위에서 부터 차례대로 별을 찍는 방법입니다.

​

예를들어 n = 5인경우

N = 5 0 1 2 3 4 5 6 7 8 0| 1 1| 1 1 1 2| 1 1 1 1 1 3| 1 1 1 1 1 1 1 4| 1 1 1 1 1 1 1 1 1

맨 윗줄 부터 중간까지 별을 찍습니다.

N = 5 0 1 2 3 4 5 6 7 8 5| 1 1 1 1 1 1 1 6| 1 1 1 1 1 7| 1 1 1 8| 1

이후 중간 아랫줄부터 마지막줄까지 별을 찍으면 될 것 같습니다.

​

1.1. n값에 따라 변하는 일반항 구하기

3 \* 3 별 하나를 구현하는 것이아닌, n값을 입력받으면 값에따라 별의크기가 변하게 되는데요. 이때 일반항을 만들어 원하는 별의 크기가 만들어지도록 구현해야합니다.

​

이는 일차함수(등차수열도 가능)로 바로 구할 수 있습니다. 예를들어 n = 3인 경우 5 \ 5 별이생성되며, n = 2인경우 3 \ 3별이 생성됩니다.

​

n = 2, an + b = 3

n = 3, an + n = 5

대입하여 구하면 a = 2 , b = -1입니다.

​

이제 코드를 활용해 모두 0이 들어간 이중리스트를 만들어 보겠습니다.

n =3​stars = \[\]for i in range(2 \ n - 1): star = \[\] for j in range(2 \ n -1): star.append(0)​ stars.append(star)​print(stars)

여기서 주목해야할 부분은 i는 이중리스트의 행에 해당되며, j는 이중리스트의 열에 해당된다는 사실입니다.

​

2. 상단 구현하기

행과 열 개념을 잘 이해하셨다면 이중리스트를 다루는데 있어 더욱 쉬워집니다. 1.처음 접근 방법대로 n = 5일때, 4행( == 중간)까지의 별을 찍어보겠습니다

​

2.1. 중간값

여기서 또 하나 중요한 값이 나오는데 바로 중간값입니다. 중간값은 n에 따라 규칙적으로 변화하는 성질이 있습니다. 우리는 중간값을 m으로 부르겠습니다.

​

n = 2일때, m = 1입니다. n = 5일때, m = 4입니다. 이건 한눈에 봐도 바로 규칙을 찾을 수 있습니다. m = n - 1이 되겠습니다.

​

이제 우리는 중간값을 이용해 행에 커짐에 따라 원하는 열 위치에 1을 추가해줍니다. (그 외에는 0을 추가)

N = 5 0 1 2 3 4 5 6 7 8 0| 1 1| 1 1 1 2| 1 1 1 1 1 3| 1 1 1 1 1 1 1 4| 1 1 1 1 1 1 1 1 1

상단부분은 우선 완료입니다. i의 값이 증가함에 따라 j의 범위가 바뀌는데 이를 2.1.중간값을 기준으로 풀어주면 구할 수 있습니다.

​

m = 4,

i = 0, j = 4 ( m )

i = 1, j = 3 ~ 5 ( m -1 ~ m + 1)

i = 2, j = 2 ~ 6 ( m - 2 ~ m + 2)

​

일반항 :range(m - i, m + i)

n =3m = n - 1 stars = \[\] for i in range(2 \ n - 1): star = \[\] for j in range(2 \ n -1): if j in range(m - i, m + i + 1): star.append(1) else: star.append(0)stars.append(star)​print(stars)

3. 하단 구현하기

이제 마지막으로 하단만 구현하면 됩니다.

N = 5 0 1 2 3 4 5 6 7 8 5| 1 1 1 1 1 1 1 6| 1 1 1 1 1 7| 1 1 1 8| 1

하단을 잘보시면 상단과 다른점이 있습니다. 상단은 n값에 상관없이 항상 i = m 까지의 범위를 가집니다. 이는 n에 상관없이 i로만 된 식을 구현할 수 있다는 의미입니다.

​

하지만, 하단은 이와 전혀다릅니다. j의 범위가 n값에 따라 다르게 시작하여 감소합니다. 이는 하단은 i와 n에 관한 식으로 구성되어야 함을 간접적으로 알려주는 단서입니다.

​

n = 5일때 m =4,

i = 5, j = 1 ~ 7 ( m - 3 ~ m + 3)

i = 6, i = 2 ~ 6 ( m - 2 ~ m + 2)

i = 7, i = 3 ~ 5 ( m - 1 ~ m + 1)

i = 8, i = 4 ( m - 0 ~ m + 0)

​

여기서 m의 +-는 절대값 1씩 감소함을 알 수 있습니다.

​

i값이 커짐에 따라 절댓값이 1씩 감소하는 것은 i를 초기화 해주면 됩니다. 이때 첫번째 i의 기준값은 항상 n을 따릅니다. 따라서 감소 하는 절댓값은 |i - n|이 되겠습니다.

​

그럼 식을 이렇게 변형할 수 있습니다.

m - 3 + \[i - n\] ~ m + 3 - \[i - n\]

​

마지막으로 m - 3에 달려있는 3에 주목해야합니다. 이 값은 n값에 따라 명백히 변하는 값입니다.

일반항은 an + b가 되겠습니다.

​

n = 2인경우 해당값은 0이됩니다. n = 5일때 3이 됩니다.

​

이를 대입해서 넣으면

5a + b = 3

2a + b = 0

​

a =1, b= -2 -> 일반항은 n - 2입니다.

​

총 정리해보면

m - (n - 2) - (i - n) ~ m + ( n - 2) - (i - n)가 되겠습니다.

최종코드

​

n = 3 # i = 0, 1, 2, 3, 4m = n - 1 stars = \[\] for i in range(2 \ n - 1): star = \[\] for j in range(2 \ n -1): if i <= m: if j in range(m - i, m + i + 1): star.append(1) else: star.append(0) elif i > m: if j in range(m -(n - 2) +(i -n), m + (n -2) - (i -n) + 1): star.append(1) else: star.append(0)​stars.append(star)​​​print(stars)

m에 따라 상,하가 나눠지기 때문에 중간 if문에 i값을 분리해주었습니다.

​

문제풀고난 소감

2주간의 고민동안 다양한 문제해결 시도가 있었는데 이 기간덕분에 반복문 실력도 늘었고, 문제를 풀때 다양하게 접근해보며 계속 트라이 하는 것이 중요함을 깨달았습니다.

​

규칙성을 찾아내었으면 그 규칙에 관여하는 변수가 어떤것인지 고민할 필요가 있습니다. 해당 변수만 잘 찾아주면 값을 대입하여 쉽게 일반항을 얻어 낼 수 있습니다.

​

​

​