문제
"피터팬 프레임"은 단어를 다이아몬드 형태로 장식하는 것이다.
알파벳 X를 피터팬 프레임으로 장식하면 다음과 같다.
..#..
.#.#.
#.X.#
.#.#.
..#..
"웬디 프레임"은 피터팬 프레임과 유사하지만, 다이아몬드를 '*'로 만드는 것이다.
알파벳 X를 웬디 프레임으로 장식하면 다음과 같다.
..*..
.*.*.
*.X.*
.*.*.
..*..
단어가 주어졌을 때, 3의 배수 위치(세 번째, 여섯 번째, 아홉번째, ...)에 있는 알파벳은 웬디 프레임으로, 나머지 알파벳은 피터팬 프레임으로 장식하는 프로그램을 작성하시오.
웬디 프레임과 피터팬 프레임이 겹칠 경우에는, 웬디 프레임이 위에 있다.
입력
첫째 줄에 알파벳 대문자로 이루어진 최대 15글자 단어가 주어진다.
출력
다섯 줄에 걸쳐, 입력으로 주어진 단어를 피터팬 프레임과 웬디 프레임으로 장식한 결과를 출력한다.
먼저 나는 이 문제를 처음 접했을 때
다른 별찍기 문제처럼 규칙이 있는가?를 초점으로 접근했다.
피터팬 프레임일 때, 웬디 프레임일 때
둘의 차이점은 3의 배수 위치일 때 *이 들어가고 3의 배수가 아닐 때는 #이 들어가는 차이가 있고,
첫 번째 줄과 다섯 번째 줄, 두 번째 줄과 네 번째 줄이 동일하다는 것
출력은 다섯줄로 고정이 되어있으므로 기본적으로 반복문을 다섯 번 반복시키며 마지막에 println을 입력하면
다섯 줄이 출력되므로 for문을 하나 제작하고 그때부터 머리를 계속 굴려보기 시작했다.
*, ., #을 각각 문자 변수에 집어넣고 반복문을 써보고..
결국 부질없는 짓이라는 것을 알고 여러 해설들을 찾아보았다.
그래도 내가 접근한 방법과 거의 유사한 해설을 찾아 먼저 공유한다.
5줄 짜리 출력문을 만드는 반복문과
한 행당 출력하기 위한 이중 반복문을 사용하여
1. 조건문 생성
2. 첫번 째 줄과 마지막 줄이 동일하므로 i == 0 || i == 4 조건문 입력
3. 조건문 안에 다시 조건문을 생성하여 j % 3 != 0 일 때, 즉 j를 3으로 나누었을 때 나머지가 0이 아니면 피터팬 프레임이므로 #을 출력, 3의 배수일 때는 웬디 프레임인 *을 출력하도록 했다. ( ..#. or ..*.)
4. 두 번째 줄과 네 번째 줄 역시 동일하므로 i ==1 || i == 3의 조건문 생성
5. 조건문 안에 다시 조건문을 생성하여 j % 3 != 0 일 때, 즉 j를 3으로 나누었을 때 나머지가 0이 아니면 피터팬 프레임이므로 #을 출력, 3의 배수일 때는 웬디 프레임인 *을 출력하도록 했다. ( .#.# or .*.*)
6. 세 번째 줄은 {3의 배수이거나}(or) {j가 1이 아니면서(and) j를 3으로 나누었을 때 나머지가 1이면} 웬디 프레임으로 출력하게 조건을 만들었다.
마지막으로 한 행의 맨 마지막이 반복문으로 출력하고 있는 프레임(패턴)과 불규칙하므로
새로운 조건을 만들어서 출력해야 하는데 세 번째 주을 제외하면 우측에 점을 하나 출력하면 되므로
if ( i !=2) 세 번째 줄이 아닐 때 조건을 주고
세 번째 줄일 때 3의 배수라면 웬디프레임인 *을 출력하고 그렇지 않다면 피터팬 프레임인 #을 출력하여 마무리짓도록 하였다.
아래의 해설을 보고 참고하였다.
다른 방법의 코드 또한 발견하여 함께 공부하였는데
해당 코드는 다음과 같다.
사실 이 방법이 나에게는 조금 더 직관적으로 다가왔던 것 같다.
배열을 미리 만들어놓고 입력된 문자열의 길이만큼 반복문을 만들어서
3의 배수일 때와 그렇지 않은 경우를 조건문으로 만들고
프레임을 계속해서 배열에 추가하는 방식인 코드이다.
세번째 줄 조건이 까다롭게 보이는데
1. 한 글자가 들어오면 무조건 피터팬 프레임이므로 "#." + "들어온 첫 번째 문자" + ".#"을 먼저 대입.
2. i를 3으로 나눴을 때 나머지가 1이면( 3의 배수 바로 앞에 오는 문자라면) "." + i번째 문자를 추가.
3. 해당 i가 반복문의 마지막이라면 ".#" 피터팬 프레임을 배열에 더해주고
4. i가 반복문의 마지막이 아니라면 다음은 3의 배수이므로 ".*" 웬디 프레임을 배열에 더한다.
5. i % 3으로 나눴을 때 나머지가 2라면 3의 배수 위치를 뜻하므로
해당 배열에 "." + i번째 위치의 문자 + ".*"를 대입.
그렇지 않으면 "." + i번째 위치의 문자 + ".#"를 대입한다.
일단 다 외워서 다시 코드를 짜 봐야겠다.
'Basic > 코딩테스트' 카테고리의 다른 글
[브론즈 1] 백준 1834번 자바(JAVA) - 나머지와 몫이 같은 수 (0) | 2022.05.19 |
---|---|
[브론즈 3] 백준 1547번 자바(JAVA) - 공 (0) | 2022.05.16 |
[실버5] 백준 1094번 자바(JAVA) - 막대기 (0) | 2022.05.15 |
[자바 / Java] 백준 알고리즘 기본 설정 (컴파일 에러) (0) | 2022.05.13 |
Comparable과 Comparator (0) | 2022.05.13 |