Could not publish server configuration for Tomcat v8.5 Server at localhost.

 

Could not publish server configuration for Tomcat v8.5 Server at localhost.

 

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 서버 버전 이름: Apache Tomcat/8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server 빌드 시각: Jan 17 2022 22:07:47 UTC

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server 버전 번호: 8.5.75.0

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 운영체제 이름: Windows 10

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 운영체제 버전: 10.0

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 아키텍처: amd64

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 자바 홈: C:\Program Files\Eclipse Adoptium\jdk-8.0.312.7-hotspot\jre

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM 버전: 1.8.0_312-b07

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM 벤더: Temurin

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_BASE: C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_HOME: C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dcatalina.base=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dcatalina.home=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dwtp.deploy=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Djava.endorsed.dirs=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\endorsed

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dfile.encoding=UTF-8

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: APR 버전 [1.7.0]을(를) 사용한, APR 기반 Apache Tomcat Native 라이브러리 [1.2.30]을(를) 로드했습니다.

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: APR 용량정보들: IPv6 [true], sendfile [true], accept filters [false], random [true].

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: APR/OpenSSL 설정: useAprConnector [false], useOpenSSL [true]

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener initializeSSL
정보: OpenSSL이 성공적으로 초기화되었습니다: [OpenSSL 1.1.1k 25 Mar 2021]

2월 24, 2022 10:23:00 오전 org.apache.coyote.AbstractProtocol init
정보: 프로토콜 핸들러 ["http-nio-8090"]을(를) 초기화합니다.

2월 24, 2022 10:23:06 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
정보: Using a shared selector for servlet write/read

2월 24, 2022 10:23:06 오전 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 9790 ms

2월 24, 2022 10:23:07 오전 org.apache.catalina.core.StandardService startInternal
정보: 서비스 [Catalina]을(를) 시작합니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.core.StandardEngine startInternal
정보: 서버 엔진을 시작합니다: [Apache Tomcat/8.5.75]

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\ShopMiniMall.xml]을(를) 배치합니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
경고: 호스트 appBase 내의 docBase [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_ShopMiniMall12_장바구니전체삭제]이(가) 지정되었으나, 이는 무시될 것입니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.core.ContainerBase addChildInternal

심각: ContainerBase.addChild: start: org.apache.catalina.LifecycleException:
구성요소 [org.apache.catalina.webresources.StandardRoot@4c01392]을(를) 시작하지 못했습니다. at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4880) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5018) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:727) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:673) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1881) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

Caused by:
java.lang.IllegalArgumentException: 지정된 주요 리소스셋 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ShopMiniMall]은(는) 유효하지 않습니다. at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:747) at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:705) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 13 more

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
심각: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\ShopMiniMall.xml]을(를) 배치하는 중 오류 발생

java.lang.IllegalStateException: 자식 컨테이너를 시작하는 중 오류 발생 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:757) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:727) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:673) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1881) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

Caused by:
org.apache.catalina.LifecycleException: 구성요소 [org.apache.catalina.webresources.StandardRoot@4c01392]을(를) 시작하지 못했습니다. at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4880) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5018) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) ... 9 more

Caused by:
java.lang.IllegalArgumentException: 지정된 주요 리소스셋 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ShopMiniMall]은(는) 유효하지 않습니다. at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:747) at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:705) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 13 more

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\ShopMiniMall.xml]의 배치가 [183] 밀리초 내에 완료되었습니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\step51_miniproject_homepage.xml]을(를) 배치합니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
경고: 호스트 appBase 내의 docBase [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step51_miniproject_homepage]이(가) 지정되었으나, 이는 무시될 것입니다.

2월 24, 2022 10:23:08 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\step51_miniproject_homepage.xml]의 배치가 [1,591] 밀리초 내에 완료되었습니다.

2월 24, 2022 10:23:08 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\docs]을(를) 배치합니다.

2월 24, 2022 10:23:09 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\docs]에 대한 배치가 [173] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:09 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\examples]을(를) 배치합니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.core.ApplicationContext log
정보: ContextListener: contextInitialized()

2월 24, 2022 10:23:13 오전 org.apache.catalina.core.ApplicationContext log
정보: SessionListener: contextInitialized()

2월 24, 2022 10:23:13 오전 org.apache.catalina.core.ApplicationContext log
정보: ContextListener: attributeAdded('StockTicker', 'async.Stockticker@1adad3e5')

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\examples]에 대한 배치가 [4,372] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\host-manager]을(를) 배치합니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\host-manager]에 대한 배치가 [205] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\playdata\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\manager]을(를) 배치합니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\playdata\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\manager]에 대한 배치가 [244] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory 정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ROOT]을(를) 배치합니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory 정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ROOT]에 대한 배치가 [309] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step46_web15_board2]을(를) 배치합니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step46_web15_board2]에 대한 배치가 [113] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_miniproject_ShopMiniMall06_로그아웃]을(를) 배치합니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_miniproject_ShopMiniMall06_로그아웃]에 대한 배치가 [88] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory 정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_ShopMiniMall12_장바구니전체삭제]을(를) 배치합니다.

2월 24, 2022 10:23:19 오전 org.apache.jasper.servlet.TldScanner scanJars 정보: 적어도 하나의 JAR가 TLD들을 찾기 위해 스캔되었으나 아무 것도 찾지 못했습니다. 스캔했으나 TLD가 없는 JAR들의 전체 목록을 보시려면, 로그 레벨을 디버그 레벨로 설정하십시오. 스캔 과정에서 불필요한 JAR들을 건너뛰면, 시스템 시작 시간과 JSP 컴파일 시간을 단축시킬 수 있습니다.

2월 24, 2022 10:23:19 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_ShopMiniMall12_장바구니전체삭제]에 대한 배치가 [4,795] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:19 오전 org.apache.coyote.AbstractProtocol start
정보: 프로토콜 핸들러 ["http-nio-8090"]을(를) 시작합니다.

2월 24, 2022 10:23:19 오전 org.apache.catalina.startup.Catalina start 정보: Server startup in 12433 ms

 

 

 해결방법

 

아직 해결하지 못하고 있다.

 

 

 

 출처

 

 

+ 강의 교재

Hashing

 

 문제 설명

 

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정의한다. 해시 함수는 무궁무진한 응용 분야를 갖는데, 대표적으로 자료의 저장과 탐색에 쓰인다.

이 문제에서는 여러분이 앞으로 유용하게 쓸 수 있는 해시 함수를 하나 가르쳐주고자 한다. 먼저, 편의상 입력으로 들어오는 문자열에는 영문 소문자(a, b, ..., z)로만 구성되어있다고 가정하자. 영어에는 총 26개의 알파벳이 존재하므로 a에는 1, b에는 2, c에는 3, ..., z에는 26으로 고유한 번호를 부여할 수 있다. 결과적으로 우리는 하나의 문자열을 수열로 변환할 수 있다. 예를 들어서 문자열 "abba"은 수열 1, 2, 2, 1로 나타낼 수 있다.

해시 값을 계산하기 위해서 우리는 문자열 혹은 수열을 하나의 정수로 치환하려고 한다. 간단하게는 수열의 값을 모두 더할 수도 있다. 해시 함수의 정의에서 유한한 범위의 출력을 가져야 한다고 했으니까 적당히 큰 수 M으로 나눠주자. 짜잔! 해시 함수가 완성되었다. 이를 수식으로 표현하면 아래와 같다.

 H=∑i=0l−1aimodM

해시 함수의 입력으로 들어올 수 있는 문자열의 종류는 무한하지만 출력 범위는 정해져있다. 다들 비둘기 집의 원리에 대해서는 한 번쯤 들어봤을 것이다. 그 원리에 의하면 서로 다른 문자열이더라도 동일한 해시 값을 가질 수 있다. 이를 해시 충돌이라고 하는데, 좋은 해시 함수는 최대한 충돌이 적게 일어나야 한다. 위에서 정의한 해시 함수는 알파벳의 순서만 바꿔도 충돌이 일어나기 때문에 나쁜 해시 함수이다. 그러니까 조금 더 개선해보자.

어떻게 하면 순서가 달라졌을때 출력값도 달라지게 할 수 있을까? 머리를 굴리면 수열의 각 항마다 고유한 계수를 부여하면 된다는 아이디어를 생각해볼 수 있다. 가장 대표적인 방법은 항의 번호에 해당하는 만큼 특정한 숫자를 거듭제곱해서 곱해준 다음 더하는 것이 있다. 이를 수식으로 표현하면 아래와 같다.

 H=∑i=0l−1airimodM

보통 r과 M은 서로소인 숫자로 정하는 것이 일반적이다. 우리가 직접 정하라고 하면 힘들테니까 r의 값은 26보다 큰 소수인 31로 하고 M의 값은 1234567891(놀랍게도 소수이다!!)로 하자.

이제 여러분이 할 일은 위 식을 통해 주어진 문자열의 해시 값을 계산하는 것이다. 그리고 이 함수는 간단해 보여도 자주 쓰이니까 기억해뒀다가 잘 써먹도록 하자.

 

 입력

 

첫 줄에는 문자열의 길이 L이 들어온다. 둘째 줄에는 영문 소문자로만 이루어진 문자열이 들어온다.

입력으로 주어지는 문자열은 모두 알파벳 소문자로만 구성되어 있다.

 

 출력

 

문제에서 주어진 해시함수와 입력으로 주어진 문자열을 사용해 계산한 해시 값을 정수로 출력한다.

 

 Python 코드

 

def solution(arr):
    return sum(arr) / len(arr)

 

 

 C++ 코드

 

 

 

 출처

 

 

Server Tomcat v8.5 Server at localhost failed to start.

 해결방법

 

Tomcat Server Server Options  →  Publish module contexts to separate XML files Check

 출처

 

https://beagle-dev.tistory.com/76

+ 강의 교재

Eclipse Tomcat Error

 

Servlet File 실행하자 다음과 같은 에러 발생

 

Several ports (8005, 8080) required by Tomcat v8.5 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).

 

default로는 8005, 8080 port로 에러가 뜰 것임.

 

 해결방법

 

1. CMD창 실행

2. netstat -naop tcp 입력

3. taskkill /f /pid xxxxx

4. Tomcat 재실행

 출처

 

https://kongpowder.tistory.com/77

https://shinye0213.tistory.com/162

https://java119.tistory.com/96

바이러스

 

 문제 설명

 

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

 

 입력

 

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

 

 출력

 

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

 

 입출력 예제

 

 

 Python 코드

 

# 정점의 연결정보 입력받기
n= int(input())  				 # 정점 // 컴퓨터의 수
m = int(input()) 				 # 연결수 // 연결된 컴퓨터 쌍의 수
graph = [[] for _ in range(n+1)] # 연결된 컴퓨터 쌍의 수 만큼 반복 
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)
 
visited_dfs = []
 
def dfs(graph, cur_node, visited):
    # 현재 노드를 방문처리
    visited.append(cur_node)
    graph[cur_node].sort()
    # 현재 노드와 인접한 노드를 확인
    for link_node in graph[cur_node]:
        # 방문하지 않은 노드라면 재귀호출
        if link_node not in visited:
            dfs(graph, link_node, visited)
 
dfs(graph, 1, visited_dfs)
print(len(visited_dfs)-1)

 

* DFS 참고 링크 1 : https://jiwon-coding.tistory.com/93

* DFS 참고 링크 2 : https://devmath.tistory.com/21

 

from collections import deque
n=int(input())
m=int(input())
computers=[[0]*(n+1) for _ in range(n+1)]
for _ in range(m):
    a,b=map(int,input().split())
    computers[a][b]=1
    computers[b][a]=1
visited=[0]*(n+1)
q=deque()
q.append(1)
visited[1]=1
cnt=0
while q:
    now=q.popleft()
    for i in range(1,n+1):
        if computers[now][i]==1 and visited[i]==0:  #연결되어있고 방문한적없으면
            visited[i]=1
            q.append(i)
            cnt+=1
print(cnt)

* BFS 참고 링크 : https://velog.io/@wjdtmdgml/%EB%B0%B1%EC%A4%80%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A42606%EB%B2%88Python%ED%8C%8C%EC%9D%B4%EC%8D%ACBFS

 

 C++ 코드

 

#include <stdio.h>
#include <stdlib.h>
 
int map[101][101] = {0};
int visit[101] = {0};
int computer_num, ans = 0;
 
void dfs(int n){
    ans++;
    visit[n] = 1;
    for (int i=1; i<=computer_num; i++){
        if (map[n][i] && !visit[i])        
            dfs(i);
    }
}
 
int main(){
    int n;
    int x, y;
    scanf("%d %d", &computer_num, &n);
    for (int i=0; i<n; i++){
        scanf("%d %d", &x, &y);
        map[x][y] = map[y][x] = 1;
    }
 
    dfs(1);
    printf("%d\n", ans - 1);
 
 
}

* DFS 참고 링크 : https://code-kh-studio.tistory.com/30

#include <iostream>
#include <queue>
using namespace std;
 
int V, E;
const int MAX = 101;
int map[MAX][MAX] = { 0, };
bool visited[MAX] = { 0, };
int ans = 0;
queue<int> q;
 
void BFS(int v) {
    visited[v] = true;
    //cout << v << " ";
 
    q.push(v);
    while (!q.empty()) {
        v = q.front();
        q.pop();
        for (int i = 1; i <= V; i++) {
            if (visited[i] == 0 && map[v][i] == 1) {
                q.push(i);
                visited[i] = true;
                ans++;
                //cout << i << " ";
            }
        }
 
    }
}
 
int main() {
    cin >> V >> E;
    for (int i = 0; i < E; i++) {
        int a, b;
        cin >> a >> b;
        map[a][b] = 1;
        map[b][a] = 1;
    }
 
    BFS(1);
    
    cout << ans;
}

* BFS 참고 링크 : https://scarlettb.tistory.com/78

 출처

 

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

DFS와 BFS

 

 문제 설명

 

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

 

 입력

 

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

 

 출력

 

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 

 입출력 예제

 

 Python 코드

 

n,m,v = map(int,input().split())
graph = [[] * n for _ in range(n+1)]
for _ in range(m):
    a,b = map(int,input().split())
    graph[a].append(b)
    graph[b].append(a)
    
visited = [0] * (n+1)
def dfs(v):
    print(v,end=' ')
    global visited, graph
    visited[v] = 1
    for i in sorted(graph[v]):
        if visited[i]!=1:
            dfs(i)
dfs(v)
print()
from collections import deque
visited = [0] * (n+1)
def bfs(start):
    global visited, graph
    queue = deque([start])
    visited[start] = 1
    
    while queue:
        v = queue.popleft()
        print(v,end=' ')
        for i in sorted(graph[v]):
            if visited[i]!=1:
                queue.append(i)
                visited[i] = 1
bfs(v)

* 참고 링크 : https://jiwon-coding.tistory.com/91

 

 C++ 코드

 

#include <iostream>
#include <queue>
using namespace std;
#define MAX 1001
 
int N, M, V; //정점개수, 간선개수, 시작정점
int map[MAX][MAX]; //인접 행렬 그래프
bool visited[MAX]; //정점 방문 여부
queue<int> q;
 
void reset() {
    for (int i = 1; i <= N; i++) {
        visited[i] = 0;
    }
}
 
void DFS(int v) {
    visited[v] = true;
    cout << v << " ";
    
    for (int i = 1; i <= N; i++) {
        if (map[v][i] == 1 && visited[i] == 0) { //현재 정점과 연결되어있고 방문되지 않았으면
            DFS(i);
        }
    }
}
 
void BFS(int v) {
    q.push(v);
    visited[v] = true;
    cout << v << " ";
 
    while (!q.empty()) {
        v = q.front();
        q.pop();
        
        for (int w = 1; w <= N; w++) {
            if (map[v][w] == 1 && visited[w] == 0) { //현재 정점과 연결되어있고 방문되지 않았으면
                q.push(w);
                visited[w] = true;
                cout << w << " ";
            }
        }
    }
}
 
int main() {
    cin >> N >> M >> V;
 
    for (int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        map[a][b] = 1;
        map[b][a] = 1;
    }
 
    reset();
    DFS(V);
    
    cout << '\n';
    
    reset();
    BFS(V);
 
    return 0;
}

* 참고 링크 : https://scarlettb.tistory.com/76

 출처

 

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

JSP TEST 실습

 

 test.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello World
</body>
</html>

 

 test2.jsp

 

<%@page import="java.util.Date"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	// java.util.Date Class
	Date d = new Date();
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>jsp 실습</h1>
<%
	ArrayList<String> list = new ArrayList<String>();
	list.add("A1");
	list.add("A2");
	list.add("A3");
	list.add("A4");
%>

<%= d.toString() %><br>
<%= list %><br>
<h2>ul로 출력</h2>
<ul>
<%
	for(String s: list){
%>
	<li><%= s %></li>
<%
	} // end for
%>
</ul>
<%-- <h3>에러발생</h3>
<%
	String name = null;
	System.out.println(name.length());
%> --%>

</body>
</html>

 

 출처

 

 

강의 실습 + 강의 교재

JSP 로그인 실습

 

 login.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
	String userid = request.getParameter("userid");
	String passwd = request.getParameter("passwd");
	System.out.println("Tomcat Console 출력:" + userid + "\t" + passwd);
	out.print("Browser에 출력:Hello" + userid + "\n");
	
	// Session => HttpSession
	session.setAttribute("id", userid);
	
	// Context ==> ServletContext
	application.setAttribute("id", userid);
	
	// Init Parameter ==> ServletConfig
	String init_param = config.getInitParameter("driver");
%>

아이디:<%= userid %><br>
비번:<%= passwd %><br>

</body>
</html>

 

 loginForm.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>로그인폼 화면</h1>
<form action="login.jsp" method="get">
아이디:<input type="text" name="userid"><br>
비번:<input type="text" name="passwd"><br>
<input type="submit" value="로그인">
</form>
</body>
</html>

 

 출력화면

 

 

 출처

 

강의 실습 + 강의 교재

Consecutive Numbers

 

 문제 설명

 

Create table If Not Exists Employee (id int, name varchar(255), salary int, departmentId int)
Create table If Not Exists Department (id int, name varchar(255))
Truncate table Employee
insert into Employee (id, name, salary, departmentId) values ('1', 'Joe', '70000', '1')
insert into Employee (id, name, salary, departmentId) values ('2', 'Jim', '90000', '1')
insert into Employee (id, name, salary, departmentId) values ('3', 'Henry', '80000', '2')
insert into Employee (id, name, salary, departmentId) values ('4', 'Sam', '60000', '2')
insert into Employee (id, name, salary, departmentId) values ('5', 'Max', '90000', '1')
Truncate table Department
insert into Department (id, name) values ('1', 'IT')
insert into Department (id, name) values ('2', 'Sales')

 

Table: Employee

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
id is the primary key column for this table.
departmentId is a foreign key of the ID from the Department table.
Each row of this table indicates the ID, name, and salary of an employee. It also contains the ID of their department.

 

Table: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
id is the primary key column for this table.
Each row of this table indicates the ID of a department and its name.

 

 입출력 예

 

Example 1:

Input: 
Employee table:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
+----+-------+--------+--------------+
Department table:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+
Output: 
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |
+------------+----------+--------+

Explanation: Max and Jim both have the highest salary in the IT department and Henry has the highest salary in the Sales department.

 Oracle Query

 

select
D.Name as Department, E.Name as Employee, Salary
from Employee E inner join Department D
on E.DepartmentID = D.ID
where Salary = (select max(Salary)
                from Employee
                where E.DepartmentID = DepartmentID);

* 참고 링크 : https://leetcode.com/problems/department-highest-salary/discuss/1064441/Most-Efficient-Oracle-solution

 

 출처

 

https://leetcode.com/problems/department-highest-salary/

Prime Number of Set Bits in Binary Representation

 

 문제 설명

 

Given two integers left and right, return the count of numbers in the inclusive range [left, right] having a prime number of set bits in their binary representation.

Recall that the number of set bits an integer has is the number of 1's present when written in binary.

  • For example, 21 written in binary is 10101, which has 3 set bits.
왼쪽과 오른쪽 두 개의 정수가 주어지면 이진 표현에 소수의 세트 비트를 갖는 포함 범위[좌, 우]의 숫자 카운트를 반환합니다.

정수가 갖는 세트 비트의 수는 이진수로 쓸 때 존재하는 1의 수라는 것을 기억하라.

예를 들어, 이진법으로 작성된 21은 10101이고, 3개의 세트 비트를 가지고 있다.

 

 제한 사항

 

  • 1 <= left <= right <= 106
  • 0 <= right - left <= 104

 

 입출력 예

 

Example 1:

Input: left = 6, right = 10
Output: 4
Explanation:
6  -> 110 (2 set bits, 2 is prime)
7  -> 111 (3 set bits, 3 is prime)
8  -> 1000 (1 set bit, 1 is not prime)
9  -> 1001 (2 set bits, 2 is prime)
10 -> 1010 (2 set bits, 2 is prime)
4 numbers have a prime number of set bits.

Example 2:

Input: left = 10, right = 15
Output: 5
Explanation:
10 -> 1010 (2 set bits, 2 is prime)
11 -> 1011 (3 set bits, 3 is prime)
12 -> 1100 (2 set bits, 2 is prime)
13 -> 1101 (3 set bits, 3 is prime)
14 -> 1110 (3 set bits, 3 is prime)
15 -> 1111 (4 set bits, 4 is not prime)
5 numbers have a prime number of set bits.

 

 Python 코드

 

Python code 

class Solution:
    def countPrimeSetBits(self, L: int, R: int) -> int:
        return sum(bin(i).count('1') in [2,3,5,7,11,13,17,19] for i in range(L, R+1))

bin(i).count('1') # 이진 표현에서 1의 수가 소수인 경우

bin(i).count('1') in [2, 3, 4, 5, 7, 11, 13, 17, 19]  

# 이진 표현에서 1의 수가 [2, 3, 4, 5, 7, 11, 13, 17, 19]에 빈도가 있는 경우

sum(bin(i).count('1') in [2, 3, 5, 7, 11, 13, 17, 19] for i in range(L, R+1))

# sum( ) 함수를 이용하여 count를 증가시킨다.

 

* 참고 링크 1 : https://leetcode.com/problems/prime-number-of-set-bits-in-binary-representation/discuss/801535/Python-3-One-Line

 

 

 C++ 코드

 

C ++ code

// c++ code
#include <cmath>
class Solution {
public:
    int countPrimeSetBits(int L, int R) {
        int res = 0;
        for (int num = L; num <= R; num++) {
            int count = countOne(num);
            if (isPrime(count))
                res++;
        }
        return res;
    }
    
    bool isPrime(int num) {
        if (num <= 3)
            return num > 1;
        
        int square_root = sqrt(num);
        for (int i = 2; i <= square_root; i++) {
            if (num % i == 0)
                return false;
        }
        return true;
    }
    
    int countOne(int num) {
        vector<int> bin = dec2bin(num);
        int count = 0;
        for (auto i = bin.begin(); i < bin.end(); i++) {
            if (*i == 1)
                count++;
        }
        return count;
    }
    
    vector<int> dec2bin(int num) {
        vector<int> bin;
        while (num != 0) {
            bin.push_back(num % 2);
            num /= 2;
        }
        reverse(bin.begin(), bin.end());
        return bin;
    }
};

* 참고 링크 : https://leetcode.com/problems/prime-number-of-set-bits-in-binary-representation/discuss/376499/C%2B%2B-and-Python-3-bad-performance-need-to-improve

 

 출처

 

https://leetcode.com/problems/prime-number-of-set-bits-in-binary-representation/

Power of Four

 

 문제 설명

 

Given an integer n, return true if it is a power of four. Otherwise, return false.

An integer n is a power of four, if there exists an integer x such that n == 4x.

 

 제한 사항

 

  • -231 <= n <= 231 - 1

 

 입출력 예

 

Example 1:

Input: n = 16
Output: true

Example 2:

Input: n = 5
Output: false

Example 3:

Input: n = 1
Output: true

 

 

 Python 코드

 

Python code 

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return math.log(n, 1/4) % 1 == 0 if n > 0 else False

* 참고 링크 : https://leetcode.com/problems/power-of-four/discuss/637372/Python-3-Single-line

  • math.log( ) 함수 이용 // loops(반복문) 또는 recursion(재귀)를 피하는 방법 중 하나// x : 필수의 로그를 계산할 값을 지정// base : 선택적으로 사용할 로그 베이스 (Default 값 : e)
  • ( 값이 0 또는 음수이면 ValueError 반환, 값이 숫자가 아니면 TypeError를 반환)
  • math.log(x, base)

 

 C++ 코드

 

C ++ code

class Solution {
public:
    bool isPowerOfFour(int num) {
        return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0;
    }
};

* 참고 링크 : https://leetcode.com/problems/power-of-four/discuss/80460/1-line-C%2B%2B-solution-without-confusing-bit-manipulations

 

 출처

 

https://leetcode.com/problems/power-of-four/

+ Recent posts