728x90
728x90
문제링크
https://www.acmicpc.net/problem/2290
문제풀이
👨🏻💻 핵심 스킬 👨🏻💻
시뮬레이션
LCD Test 문제는 세그먼트로 생각하고 특정지점을 인덱싱하여 풀어주었다.
숫자를 표현해주어야하는 크기는 모두 동일하기 때문에 7-Segment와 동일하게 생각하여 해결해줄 수 있다.
index를 잘 판단하여 A,B,C,D,E,F,G의 위치를 잡고 정해진 크기만큼 값을 넣어주기만 하면 된다.
그리고나서 0부터 9까지 각각 어느 지점의 세그먼트가 켜져야하는지 판단하여 넣어주기만 하면 된다.
나는 구현을 3단계로 나누어 해결하였다.
1. 각 지점의 세그먼트를 켜는 방법
나는 위와 조금 다르게 B,C,A,G,D,F,E 순서로 1부터 7까지 나열하여 해결하였다. 적절하게 인덱스를 맞추어 출력될 값을 char형 2차원 배열에 넣어주었다.
더보기
더보기
더보기
public static void segmentPrint(int x, int y, int size, char[][] display, int segNum){
if(segNum == 1){
int pos = 1;
for(int i = 0; i < size; i++) {
display[i+pos][x + size + 1] = '|';
}
}
else if(segNum == 2){
int pos = size + 2;
for(int i =0; i < size; i++){
display[i+pos][x+size + 1] = '|';
}
}
else if(segNum == 3){
for(int i = 0; i < size; i++){
display[y][i+x+1] = '-';
}
}
else if(segNum == 4){
int pos = size+1;
for(int i = 0; i < size; i++){
display[y+pos][i+x+1] = '-';
}
}
else if(segNum == 5){
int pos = 2*size+2;
for(int i = 0; i <size; i++){
display[y+pos][i+x+1] = '-';
}
}
else if(segNum == 6){
for(int i = 0; i < size; i++){
display[y+i+1][x] = '|';
}
}
else if(segNum == 7){
int pos = size+2;
for(int i =0 ; i < size; i++){
display[y+i+pos][x] = '|';
}
}
}
2. 위에서 구현한 세그먼트를 활용하여 각 숫자에 대하여 프린트를 해주었다.
더보기
더보기
더보기
public static void numberPrint(int num, int loc, int size,char[][] display){
int x = loc*(size+3);
int y = 0;
if(num == 1){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
}
else if(num ==2){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,7);
}else if(num == 3){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
}
else if(num == 4){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,6);
}
else if(num == 5){
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
}
else if(num == 6){
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
segmentPrint(x,y,size,display,7);
}
else if(num == 7){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
}
else if(num ==8){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
segmentPrint(x,y,size,display,7);
}
else if(num == 9){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
}
else if(num == 0){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
segmentPrint(x,y,size,display,7);
}
}
그 뒤에는 저장된 값들을 출력하여 문제를 해결하였다.
구현코드
package boj_2290;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int s = sc.nextInt();
String n = sc.next();
char[][] display = new char[2*s+3][(s+2)*n.length() + n.length()-1];
for(int i = 0; i < display.length; i++){
for(int j = 0; j < display[i].length; j++){
display[i][j] = ' ';
}
}
for(int i = 0; i < n.length(); i++){
numberPrint(n.charAt(i)-'0',i,s,display);
}
for(int i = 0; i < display.length; i++){
for(int j = 0; j < display[i].length; j++){
System.out.print(display[i][j]);
}
System.out.println();
}
}
public static void numberPrint(int num, int loc, int size,char[][] display){
int x = loc*(size+3);
int y = 0;
if(num == 1){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
}
else if(num ==2){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,7);
}else if(num == 3){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
}
else if(num == 4){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,6);
}
else if(num == 5){
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
}
else if(num == 6){
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
segmentPrint(x,y,size,display,7);
}
else if(num == 7){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
}
else if(num ==8){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
segmentPrint(x,y,size,display,7);
}
else if(num == 9){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,4);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
}
else if(num == 0){
segmentPrint(x,y,size,display,1);
segmentPrint(x,y,size,display,2);
segmentPrint(x,y,size,display,3);
segmentPrint(x,y,size,display,5);
segmentPrint(x,y,size,display,6);
segmentPrint(x,y,size,display,7);
}
}
public static void segmentPrint(int x, int y, int size, char[][] display, int segNum){
if(segNum == 1){
int pos = 1;
for(int i = 0; i < size; i++) {
display[i+pos][x + size + 1] = '|';
}
}
else if(segNum == 2){
int pos = size + 2;
for(int i =0; i < size; i++){
display[i+pos][x+size + 1] = '|';
}
}
else if(segNum == 3){
for(int i = 0; i < size; i++){
display[y][i+x+1] = '-';
}
}
else if(segNum == 4){
int pos = size+1;
for(int i = 0; i < size; i++){
display[y+pos][i+x+1] = '-';
}
}
else if(segNum == 5){
int pos = 2*size+2;
for(int i = 0; i <size; i++){
display[y+pos][i+x+1] = '-';
}
}
else if(segNum == 6){
for(int i = 0; i < size; i++){
display[y+i+1][x] = '|';
}
}
else if(segNum == 7){
int pos = size+2;
for(int i =0 ; i < size; i++){
display[y+i+pos][x] = '|';
}
}
}
}
시간복잡도
숫자 하나는 1개 이상의 세그먼트를 가지고 있으며, 각 세그먼트는 입력값 s만큼 실행이 된다. .
그리고 각 s만큼 실행되는 것이 입력받은 수 n의 길이만큼 진행되기 때문에 시간복잡도는 $O(s*len(n))$가 된다.
잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)
728x90
728x90
'CodingTest > Backjoon' 카테고리의 다른 글
BOJ_14888 연산자 끼워넣기 (Java) (0) | 2022.01.06 |
---|---|
[BOJ_16931] 겉넓이 구하기 (java) (0) | 2021.12.31 |
[BOJ_15685] 드래곤 커브 (Java) (0) | 2021.12.29 |
[BOJ_15662] 톱니바퀴 ( java) (0) | 2021.12.22 |
[BOJ_14890] 경사로 (java) (0) | 2021.12.21 |