250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • 프로그래머스
  • 선형대수
  • 코딩테스트
  • JAVA8
  • BFS
  • swift
  • SpringMVC
  • 머신러닝
  • 문제풀이
  • data
  • Front-end
  • BOJ
  • 개발자
  • 자바
  • ios
  • DP
  • 브루트포스
  • 백준
  • JPA
  • uArm
  • certificate
  • 카카오
  • Python
  • ADsP
  • AI
  • 알고리즘
  • 파이썬
  • java
  • 구현
  • 개발

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[BOJ_2290] LCD Test (java)
CodingTest/Backjoon

[BOJ_2290] LCD Test (java)

2021. 12. 31. 00:46
728x90
728x90

문제링크

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

 

2290번: LCD Test

첫째 줄에 두 개의 정수 s와 n이 들어온다. (1 ≤ s ≤ 10, 0 ≤ n ≤ 9,999,999,999)이다. n은 LCD 모니터에 나타내야 할 수 이며, s는 크기이다.

www.acmicpc.net

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
시뮬레이션

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
    'CodingTest/Backjoon' 카테고리의 다른 글
    • BOJ_14888 연산자 끼워넣기 (Java)
    • [BOJ_16931] 겉넓이 구하기 (java)
    • [BOJ_15685] 드래곤 커브 (Java)
    • [BOJ_15662] 톱니바퀴 ( java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바